SpringMVC—获取请求参数

  • 获取请求参数
  • 1.原生servlet获取参数
  • 2.[通过控制器方法的形参获取请求参数](https://mowangblog.github.io/SpringMVC-Demo/#/?id=_2、通过控制器方法的形参获取请求参数)
  • 3.@RequestParam
  • 在xml注入属性装配时和@Autowired的区别
  • 3.@RequestHeader
  • 4.@CookieValue
  • 5.通过POJO获取请求参数


获取请求参数

1.原生servlet获取参数

请求 被RequestMapping注解匹配,匹配成功由控制器方法来处理请求 ,(前面这些部分是由dispatchServlet来完成的)

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){//这个就叫控制器方法
        return "index";
    }
}

dispatchServlet 会根据这个方法的形参 来注入不一样的值

(dispatchServlet会获得请求的内容)

@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request){

}

使用restful风格就不能使用这种了,在springMVC这些常数其实我们已经获取过了 我们基本不可能用这种方法

2.通过控制器方法的形参获取请求参数

<form th:action="@{/testParam}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    爱好:<input type="checkbox" name="hobby" value="a">a<br>
        <input type="checkbox" name="hobby" value="b">b<br>
        <input type="checkbox" name="hobby" value="c">c<br>
    <input type="submit" value="测试使用控制器形参 同名参数请求">
</form>
@RequestMapping("/testParam")
public String testParam(String username,String password,String[] hobby){
    System.out.println(username+ password);
    System.out.println(hobby);//参数位置是:(String hobby)// a,b,c
                                //参数位置是:(String[] hobby)//[Ljava.lang.String;@a9f7fac
    System.out.println(Arrays.toString(hobby));//[a, b, c]
    return "success";
}

上面的是表单name属性和控制器请求参数相应的情况

3.@RequestParam

一共3个参数

  • 如果不对应使用 @RequestParam
public String testParam(
        @RequestParam("user_name") String username,
        String password,
        String[] hobby){

插曲:

在xml注入属性装配时和@Autowired的区别


xml注入的时候 能注入就注入 没有的话 就不注入,Autowired required默认值是true 意思就是必须在IOC中有对应的注入 ,没有对应的注入进去 就报错

RequestParam中的这个参数也是相同的意思,默认是参数必须获取到,可以设置它为false,请求表示可以没有当前要的这个参数

spring get参数数转json springmvc get请求参数_System

  • 默认是true 如果没有传这个参数,(并且也没有设置默认值defaultValue属性)会直接报错400
  • 设置为false 不是必须传,如果没有传,当前值为null
@RequestMapping("/testParam")
public String testParam(
        @RequestParam(value = "user_name",required = false) String username,
        												String password,
        												String[] hobby){
    System.out.println(username+ password);
    System.out.println(hobby);//参数位置是:(String hobby)// a,b,c
                                //参数位置是:(String[] hobby)//[Ljava.lang.String;@a9f7fac
    System.out.println(Arrays.toString(hobby));//[a, b, c]
    return "success";
}

设置如果传参数时的默认值 注意:1.如果是上面那种没传会是默认值,2.如果文本框是空的,传过来的是空字符串""也是使用默认值

@RequestParam(value = "user_name",required = false,defaultValue = "hehe")

3.@RequestHeader

获取请求头中的值 是必须加这个的,如果是请求参数可以同名不用注解,这个就必须要用注解啦

其中的属性和RequestParam类似

4.@CookieValue

@RequestMapping("/testParam")
public String testParam(
        @RequestParam(value = "user_name",required = false,defaultValue = "hehe") String username,
        String password,
        String[] hobby,
        @RequestHeader("Host") String host,
        @CookieValue("JSESSIONID") String jsessionid){
    System.out.println(username+ password);
    System.out.println(hobby);//参数位置是:(String hobby)// a,b,c
                                //参数位置是:(String[] hobby)//[Ljava.lang.String;@a9f7fac
    System.out.println(Arrays.toString(hobby));//[a, b, c]

    System.out.println("Host:"+host);//[a, b, c]

    System.out.println(jsessionid);
    return "success";
}

5.通过POJO获取请求参数

保证表单中的参数名 和 实体类中的属性名一致

实体类设置有参和无参构造

要有无参构造因为大部分框架中反射使用的是无参构造

@RequestMapping("/testpojo")
public String testPOJO(User user){
    System.out.println(user);
    return "success";
}

两个都会注入,类型符合的都会

spring get参数数转json springmvc get请求参数_spring get参数数转json_02

请求乱码也分 get和post

get乱码是tomcat造成的,sever…配置文件中配置

spring get参数数转json springmvc get请求参数_java_03

post 乱码

// 解决post请求中文乱码问题 // 一定要在获取请求参数之前调用才有效 req.setCharacterEncoding("UTF-8");

查看原码小技巧 如果参数有filterchain 大概这个方法就是执行过滤的方的的方法(doFilter )

spring get参数数转json springmvc get请求参数_spring_04

在目前来说在控制器方法解决乱码已经来不及了

启动时间:监听器->过滤器->servlet

servletcontext监听器启动最早

使用SpringMVC提供的编码过滤器 解决post乱码:

/*所有请求,/是不包括.jsp的请求

<!--配置springMVC的编码过滤器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <!--查看源码可知设置请求的编码是下面的和-->
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <!--响应想改编码,encoding和forceResponseEncoding 都要设置-->
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>