通过注解获取访问参数

2015-11-09 19:35:29   最后更新: 2016-11-21 16:18:54   访问数量:579




上一篇日志中,我们介绍了如何把指定模式的 URL 映射到具体的 Controller 和 action 上,接下来我们就需要了解怎么获取请求中的数据

在上一篇日志中,我们已经看到绑定 URL 模式中的数据的 PathVariable 注解,本篇日志中我们介绍其他几个用于绑定数据的注解

 

数据绑定相关注解
注解意义
RequestParam绑定单个请求数据,可以是URL中的数据,表单提交的数据或上传的文件
PathVariable绑定URL模板变量值
CookieValue绑定Cookie数据
RequestHeader绑定请求头数据
ModelAttribute绑定数据到Model
SessionAttributes绑定数据到Session
RequestBody用来处理Content-Type不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等
RequestPart绑定 “multipart/data” 数据,并可以根据数据类型进项对象转换

 

SpringMVC 支持多种方式将客户端中的数据传送到 Controller 相应的处理方法:

  1. 查询参数(QueryParameter)
  2. 表单参数(FormParameter)
  3. 路径变量(PathVariable)

 

查询参数是最常见的传递参数,也就是通常所说的 GET、POST 参数,有两种方法可以获取他们

 

@RequestParam 注解

@RequestMapping(method = RequestMethod.GET) public List<Spittle> spittles(@RequestParam("max") long max, @RequestParam("count") int count) { return spittleRepository.findSpittles(max, count); }

 

 

@RequestParam 将传入的 max 和 count 两个 GET 参数分别赋值给了两个方法参数 max 和 count,实现了传入参数的获取

@RequestParam 还支持为变量取默认值(defaultValue 属性),如果未传入相应参数,则变量值为指定的默认值:

@RequestMapping(method = RequestMethod.GET) public List<Spittle> spittles( @RequestParam(value="max", defaultValue=Long.toString(Long.MAX_VALUE)) long max, @RequestParam(value="count", defaultValue="20") int count) { return spittleRepository.findSpittles(max, count); }

 

 

HttpServletRequest 变量

@RequestMapping(method = RequestMethod.GET) public List<Spittle> spittles(HttpServletRequest request) long max = Long.MAX_VALUE; if (request.getParameter("max") != null) { max = Long.parseLong(request.getParameter("max")); } int count = 20; if (request.getParameter("max") != null) { count = Integer.parseInt(request.getParameter("count")); } return spittleRepository.findSpittles(max, count); }

 

 

需要注意的是,由于传入参数都是 String 类型,因此可能会出现 parseInt 等方法转换失败而抛出异常的情况

 

@PathVariable 注解实现了路径变量的传递:

@RequestMapping(value = "/api/v{version}/user/{userid}/id", method = RequestMethod.GET) public DetailResponse listDetail( HttpServletRequest request, @PathVariable int version, @PathVariable int userid) { }

 

上面的代码通过 version、userid 变量获取了 url 中对应位置的参数,这样可以方便的实现 Restful 风格的 URL

 

同时,在代码中通过传入 HttpServletRequest 对象的 getQueryString 可以获取到请求的完整 URI,你可以通过 URI 手工解析出所有的传入参数,当然这并不是值得推荐的方法

 

表单的处理是 web 应用中的常见需求,SpringMVC 提供了非常方便的表单参数传递方式,将表单中所有参数封装成一个类,并把这个类作为参数传入即可获取对应的全部表单参数:

@RequestMapping(value = "/commit/result", method = post) public TableResponse resolveCommit(ArticleEntity entity) { }

 

 

表单的检查

从 Spring3.0 开始,在 SpringMVC 中提供了对 java 校验 API 的支持

Java 校验 API 所提供的校验注解
注解描述
@AssertFalse所注解的元素必须是Boolean类型,并且值为false
@AssertTrue所注解的元素必须是Boolean类型,并且值为true
@DecimalMax所注解的元素必须是数字,并且它的值要小于或等于给定的BigDecimalString值
@DecimalMin所注解的元素必须是数字,并且它的值要大于或等于给定的BigDecimalString值
@Digits所注解的元素必须是数字,并且它的值必须有指定的位数
@Future所注解的元素的值必须是一个将来的日期
@Max所注解的元素必须是数字,并且它的值要小于或等于给定的值
@Min所注解的元素必须是数字,并且它的值要大于或等于给定的值
@NotNull所注解元素的值必须不能为null
@Null所注解元素的值必须为null
@Past所注解的元素的值必须是一个已过去的日期
@Pattern所注解的元素的值必须匹配给定的正则表达式
@Size所注解的元素的值必须是String、集合或数组,并且它的长度要符合给定的范围

 

如果不使用上面这些视图标签,我们也可以通过 ModelAttribute 注解实现参数到 model 的绑定

@RequestMapping(value="/modelautobind", method = {RequestMethod.POST}) public String modelAutoBind(HttpServletRequest request, @ModelAttribute("accountmodel") AccountModel accountModel) { return "modelautobindresult"; }

 

 

通过 CookieValue 注解可以绑定到 Cookie 中的数据

@RequestMapping(value="/cookiebind", method = {RequestMethod.GET}) public String cookieBind(HttpServletRequest request, Model model, @CookieValue(value="JSESSIONID", defaultValue="") String jsessionId) { model.addAttribute("jsessionId", jsessionId); return "cookiebindresult"; }

 

 

上面的代码将 Cookie 中的 JSESSIONID 字段绑定到了 jsessionId 参数

 

CookieValue 注解与 RequestParam 一样也有三个参数,含义也相同,参见上文

 

与 CookieValue 类似,RequestHeader 注解用来绑定请求头中的数据

下面的代码获取了请求头中的 User-Agent

@RequestMapping(value="/requestheaderbind", method = {RequestMethod.GET}) public String requestHeaderBind(HttpServletRequest request, Model model, @RequestHeader(value="User-Agent", defaultValue="") String userAgent) { model.addAttribute("userAgent", userAgent); return "requestheaderbindresult"; }

 

 

RequestHeader 注解与 RequestParam 一样也有三个参数,含义也相同,参见上文

 

Model中的数据作用域是Request级别的,也就是说在一个Request请求中是获取不到其它Request请求的Model的数据的

但我们可以用@SessionAttributes 把数据存储到session中,来保持多次请求间数据,这样就可以来实现比如分步骤提交表单等需求

 

在 Controller 中添加以下注解及方法,就可以实现将 model 创建在 session 中,实现多个请求间的共享

@Controller @RequestMapping(value = "/databind") @SessionAttributes(value = "sessionaccountmodel", type=AccountModel.class) public class HomeController { @ModelAttribute("sessionaccountmodel") public AccountModel initAccountModel(){ return new AccountModel(); } }

 

 

通过 SessionStatus .setComplete() 方法可以将 @SessionAttributes 中保存对象销毁,但并不会清除 HttpSession 中的数据

 

SessionAttributes 注解有两个参数

  1. value -- 指明所需要对象的名称
  2. type -- 指明所需要对象的类型

 

通过 SessionAttributes(value = {"aa", "aa"} , types={XXX.class, YYY.class})  可以指明多个名称和类型

 






技术帖      mvc      技术分享      framework      model      spring      springmvc      注解      pathvariable      cookievalue      session     


京ICP备15018585号