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,请求表示可以没有当前要的这个参数
- 默认是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";
}
两个都会注入,类型符合的都会
请求乱码也分 get和post
get乱码是tomcat造成的,sever…配置文件中配置
post 乱码
// 解决post请求中文乱码问题 // 一定要在获取请求参数之前调用才有效 req.setCharacterEncoding("UTF-8");
查看原码小技巧 如果参数有filterchain 大概这个方法就是执行过滤的方的的方法(doFilter )
在目前来说在控制器方法解决乱码已经来不及了
启动时间:监听器->过滤器->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>