持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
SpringMVC获取请求参数
通过ServletAPI获取参数
只需要在控制器方法的形参位置,设置HttpservletRequest类型的形参,就可以在控制器方法中使用request对象获取请求参数
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
String uname = request.getParameter("uname");
String password = request.getParameter("password");
System.out.println("uname:"+uname+",password:"+password);
return "success";
}
}
@RequestParam注解
默认情况下其实只需要设置形参就可以匹配请求的参数
@RequestMapping("/test")
public String getParamByRequestParam(String uname , int password){
System.out.println("uname:"+uname+",password:"+password);
return "success";
}
但若形参设置的和请求参数不一致时,就会匹配不到,此时就可以用@RequestParam注解,即:
public String getParamByRequestParam(
@RequestParam("uname") String uname,
@RequestParam("password") int password)
注解有三个属性:value、required、defaultValue
- value:参数名
- required:设置是否必须传输value对应的请求参数,默认值为true(必须传),若没传则报错:400
- defaultValue:设置value的默认值,设置该属性后required属性无论为true或false,都不会报错
@RequestHeader和@CookieValue注解
通过@RequestHeader获取referer头,@CookieValue获取XDEBUG_SESSION(Cookie中发现有之前配置的xdebug直接用了)
@RequestMapping("/test")
public String getParamByRequestParam(
@RequestParam(value = "uname",required = true,defaultValue = "hello") String uname,
@RequestParam("password") int password,
@RequestHeader("referer") String referer,
@CookieValue("XDEBUG_SESSION") String session
){
System.out.println("referer:"+referer);
System.out.println("XDEBUG_SESSION:"+session);
System.out.println("uname:"+uname+",password:"+password);
return "success";
}
通过pojo获取请求参数
前边提到可以通过注解获取请求参数,但是如果请求参数过多那么注解就会显得比较繁琐,这时候就可以通过pojo方式来进行管理,只需要请求参数名与pojo的属性名一致即可。
@RequestMapping("/test/pojo")
public String getParamByPojo(User user){
System.out.println(user);
return "success";
}
POJO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String uname;
private String password;
}
请求参数乱码问题
在/conf/server.xml中设置URLEncoding="UTF-8"可解决乱码问题,但该种方式只针对于GET传参,若用POST传参仍会出现乱码,这是就可以通过配置filter解决 (注:filter应放在其他配置之前,因为配置文件是按顺序执行的)
<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>
<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>
encoding代表请求编码,ForceEncoding代表响应编码
看下CharacterEncodingFilter的继承关系
Filter接口的doFilter()方法由OncePerRequestFilter类实现,而在该类的doFilter方法中,最后的过滤是通过doFilterInternal实现的
try {
doFilterInternal(httpRequest, httpResponse, filterChain);
}
而doFilterInternal()写在CharacterEncodingFilter类中,
①:获取encoding参数即:UTF-8
②:if判断,后或运算后边的,request.getCharacterEncoding()默认值为空,所以无论涉不设置ForceEncoding,都会执行if中的语句
③:判断isForceResponseEncoding的值,如果为真则为response设置编码,而我们传入的就是true,所以会执行
通过②、③可以看出,ForceEncoding可以控制request和response的编码方式,而request中由于是或运算默认就会执行if中的语
句,所以可以浅显的理解为ForceEncoding是控制response编码问题的参数