HTTP请求数据的绑定
通过注解绑定
@RequestParam-->绑定请求参、@RequestHeader-->绑定请求头参数、@CookieValue-->绑定Cookie的值、@PathVariable-->绑定URL中的
示例:
@RequestMapping(value="/handle2")
public String handle2(@CookieValue("JSESSIONID") String sessionId,
@RequestHeader("Accept-Language") String accpetLanguage){
...
}
@RequestParam有以下三个参数。
value:参数名。
required:是否必需,默认为true,表示请求中必须包含对应的参数名,如果不存在将抛出异常。
defaultValue:默认参数名,设置该参数时,自动将required设为false。极少情况需要使用该参数,也不推荐使用该参数。
@RequestMapping(value="/handle1")
public String handle1(@RequestParam("userName") String userName,){
...
}
上面的处理方法,如果HTTP请求不包含“userName”参数时,将产生异常!!因此,如果不能保证存在”userName”的参数,必须使用:
@RequestParam(value = "userName", required = false)
使用命令/表单对象绑定
所谓命令/表单对象并不需要实现任何接口,仅是一个拥有若干属性的POJO。Spring MVC按:
“HTTP请求参数名= 命令/表单对象的属性名”
的规则,自动绑定请求数据,支持“级联属性名”,自动进行基本类型数据转换。
@RequestMapping(value = "/handle14")
public String handle14(User user) {…}
class User{
private String userName;
userName=xxx&password=yyy ---> private String password;
}
使用Servlet API对象作为入参
在Spring MVC中,控制器类可以不依赖任何Servlet API对象,但是Spring MVC并不阻止我们使用Servlet API的类作为处理方法的入参。值得注意的是,如果处理方法自行使用HttpServletResponse返回响应,则处理方法的返回值设置成void即可。
@RequestMapping(value = "/handle21")
public void handle21(HttpServletRequestrequest,HttpServletResponseresponse) {
String userName= WebUtils.findParameterValue(request, "userName");
response.addCookie(new Cookie("userName", userName));
}
public String handle24(HttpServletRequest request,
@RequestParam("userName")String userName) {
…
return "success";
}
public String handle23(HttpSession session) {
session.setAttribute("sessionId", 1234);
return "success";
}
使用Spring的Servlet API代理类
Spring MVC在org.springframework.web.context.request包中定义了若干个可代理Servlet原生API类的接口,如WebRequest和NativeWebRequest,它们也允许作为处理类的入参,通过这些代理类可访问请求对象的任何信息。
@RequestMapping(value = "/handle25")
public String handle25(WebRequest request) {
String userName = request.getParameter("userName");
return "success";
}
使用IO对象作为入参
Spring MVC允许控制器的处理方法使用java.io.InputStream/java.io.Reader及java.io.OutputStream/java.io.Writer作为方法的入参
Spring MVC将获取ServletRequest的InputStream/Reader或ServletResponse的OutputStream/Writer,然后按类型匹配的方式,传递给控制器的处理方法入参。
@RequestMapping(value = "/handle31")
public void handle31(OutputStream os) throws IOException{
Resource res = new ClassPathResource("/image.jpg");//读取类路径下的图片文件
FileCopyUtils.copy(res.getInputStream(), os);//将图片写到输出流中
}
控制器处理方法的入参除支持以上类型的参数以外,还支持java.util.Locale、java.security.Principal,可以通过Servlet的HttpServletRequest 的getLocale()及getUserPrincipal()得到相应的值。如果处理方法的入参类型为Locale或Principal,Spring MVC自动从请求对象中获取相应的对象并传递给处理方法的入参。
@RequestMapping(value = "/handle32")
public void handle31(Locale locale) throws IOException{
...
}
HttpMessageConverter<T>
对于服务端的处理方法而言,除使用@RequestBody/@ResponseBody或HttpEntity<T> /ResponseEntity<T>进行方法签名外,不需要进行任何额外的处理,借由Spring MVC中装配的HttpMessageConverter,它即拥有了处理XML及JSON的能力了。