首页 > 代码库 > Spring MVC(二) HTTP请求数据的绑定

Spring MVC(二) HTTP请求数据的绑定

HTTP请求数据的绑定

通过注解绑定

@RequestParam-->绑定请求参、@RequestHeader-->绑定请求头参数、@CookieValue-->绑定Cookie的值、@PathVariable-->绑定URL中的

 

示例:

@RequestMapping(value="http://www.mamicode.com/handle2")
public String handle2(@CookieValue("JSESSIONID") String sessionId,
@RequestHeader("Accept-Language") String accpetLanguage){
...
}

 

@RequestParam有以下三个参数。
  value:参数名。
  required:是否必需,默认为true,表示请求中必须包含对应的参数名,如果不存在将抛出异常。
  defaultValue:默认参数名,设置该参数时,自动将required设为false。极少情况需要使用该参数,也不推荐使用该参数。

@RequestMapping(value="http://www.mamicode.com/handle1")
public String handle1(@RequestParam("userName") String userName,){
  ...
}

上面的处理方法,如果HTTP请求不包含“userName”参数时,将产生异常!!因此,如果不能保证存在”userName”的参数,必须使用:
@RequestParam(value = "http://www.mamicode.com/userName", required = false)

使用命令/表单对象绑定

 

所谓命令/表单对象并不需要实现任何接口,仅是一个拥有若干属性的POJO。Spring MVC按:
“HTTP请求参数名= 命令/表单对象的属性名”
的规则,自动绑定请求数据,支持“级联属性名”,自动进行基本类型数据转换。

@RequestMapping(value = "http://www.mamicode.com/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 = "http://www.mamicode.com/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 = "http://www.mamicode.com/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 = "http://www.mamicode.com/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 = "http://www.mamicode.com/handle32")
public void handle31(Locale locale) throws IOException{
  ...
}

HttpMessageConverter<T>

技术分享

 

技术分享

对于服务端的处理方法而言,除使用@RequestBody/@ResponseBody或HttpEntity<T> /ResponseEntity<T>进行方法签名外,不需要进行任何额外的处理,借由Spring MVC中装配的HttpMessageConverter,它即拥有了处理XML及JSON的能力了。

 

Spring MVC(二) HTTP请求数据的绑定