1. 通过ServletAPI获取
为控制器方法增加HttpServletRequest参数request,在方法中调用request.getParameter即可,与Servlet类似
eg.
不妨假设前端传入表单,th:action=“/test”(采用thymeleaf命名空间) method=“post”,传入username,password参数。则在控制器方法中
@RequestMapping(value="/test" method=(可以指定,不指定也可以,默认为都包含))
public String getParamByServletApi(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
}
2. 通过控制器方法形参传递参数
在控制器方法形参列表中设置与请求参数名字一致的形参即可
@RequestMapping(value="/test" method=(可以指定,不指定也可以,默认为都包含))
public String getParamByServletApi(String username,String password){
//注意一定要一致,包括大小写,否则为null
}
若不一致,增加注解@RequestParam(“请求参数的名字”) 将请求参数与方法形参绑定
@RequestMapping(value="/test" method=(可以指定,不指定也可以,默认为都包含))
public String getParamByServletApi(@RequestParam("username" String userName,String password){
}
@RequestParam
将请求参数与方法形参绑定
包含以下三个属性:
- value:与形参绑定的请求参数名
- required:true or false 是否必须传递value的参数
- defaultValue 当required=false,参数不一定要传,则没有传时为默认值
类似注解
@RequestHeader
将请求头信息与形参进行绑定
属性与RequestParam一致
@CookieValue
将cookie数据与控制器方法的形参绑定
属性与RequestParam一致
综合例子,获取请求参数username,password,请求头信息referer以及cookie
@RequestMapping(value="/test")
public String getParamByServletApi(@RequestParam("username" String userName,@RequestParam("password")String password,@RequestHeader("referer") String referer,@CookieValue("JSESSIONID") String jsessionId){
//body
}
3 通过pojo获取参数
通过控制器方法的实体类类型的形参获取请求参数
需要保证实体类的属性名与请求参数名字一致
如,上述请求参数包含username以及password,用一个实体类封装
public class User{
private String username;
private String password;
//construtor without args
//construtor with args
//getter & setter
}
@RequestMapping("/test")
public String getParamByPojo(User user){
sout(user);//发现请求参数被user接受
}
4 请求参数乱码
请求参数为中文或者其他,可能导致乱码
可以修改tomcat中conf目录下server.xml配置文件中的编码方式
Tomcat8 Get请求方式的乱码问题得到修改,Post请求方式没有
解决方法编码过滤器
Spring提供了编码过滤器CharacterEncodingFilter,将它配置到web.xml中
注意:编码过滤器一定在其他过滤器之前,否则无效
<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>
<!-- 设置为true,使得响应编码也为UTF-8 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>