本文共 5597 字,大约阅读时间需要 18 分钟。
@RequestBody
作用:1.该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 2.再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
使用时机:
GET、POST方式提时, 根据request header Content-Type的值来判断: 1. application/x-www-form-urlencoded. 不能用 @RequestBody来处理。
可以用 @RequestParam注解来处理,或者调用 HttpServletRequest.getParameter(“name”)这样的方式来去参数数据。
如下所示:
private RequestForUser getRequestForUser(HttpServletRequest request) { RequestForUser requestForUser= new RequestForUser(); requestForUser.setUserId(request.getParameter("userId"));}
@RequestParam
1. @RequestParam是传递参数的. @RequestParam用于将请求参数区数据映射到功能处理方法的参数上。 public String queryUserName(@RequestParam String userName) 在url中输入:localhost:8080/***/?userName=zhangsan 请求中包含username参数(如/requestParam1?userName=zhang),则自动传入。 接下来我们看一下@RequestParam注解主要有哪些参数: value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入; required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码; defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。 表示请求中可以没有名字为username的参数,如果没有默认为null,此处需要注意如下几点: public String queryUserName(@RequestParam(value="userName" ,required =false ) String userName) 原子类型:必须有值,否则抛出异常,如果允许空值请使用包装类代替。 Boolean包装类型类型:默认Boolean.FALSE,其他引用类型默认为null。 public String requestParam5(@RequestParam(value="username", required=true, defaultValue="zhang") String username) 如果没有传入参数,则默认是"zhangsan". 但是在传递参数的时候如果是url?userName=zhangsan&userName=wangwu时怎么办呢? 其实在实际roleList参数入参的数据为“zhangsan,wangwu”,即多个数据之间使用“,”分割;我们应该使用如下方式来接收多个请求参数: public String requestParam8(@RequestParam(value="userName") String [] userNames) 或者是: public String requestParam8(@RequestParam(value="list") Listlist) 2. multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据.3. 其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理.4. @PathVariable绑定URI模板变量值 @RequestMapping(value="/users/{userId}/grader/{grader}") public String test( @PathVariable(value="userId") int userId, @PathVariable(value="grader") int grader) 如请求的URL为“控制器URL/users/123/grader/456”,则自动将URL中模板变量{userId}和{grader}绑定到通过@PathVariable注解的同名参数上 即入参后userId=123、grader=456 5. @CookieValue绑定Cookie数据值 @CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上。 public String testCookieValue(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId) 如上配置将自动将JSESSIONID值入参到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。 public String testCookieValue2(@CookieValue(value="JSESSIONID", defaultValue="") Cookie sessionId) 传入参数类型也可以是javax.servlet.http.Cookie类型 @CookieValue也拥有和@RequestParam相同的三个参数,含义一样。 6. @RequestHeader绑定请求头数据 @RequestHeader用于将请求的头信息区数据映射到功能处理方法的参数上。 @RequestMapping(value="/header") public String test(@RequestHeader("User-Agent") String userAgent,@RequestHeader(value="Accept") String[] accepts) 如上配置将自动将请求头“User-Agent”值入参到userAgent参数上,并将“Accept”请求头值入参到accepts参数上。 @RequestHeader也拥有和@RequestParam相同的三个参数,含义一样。 7. @ModelAttribute绑定请求参数到命令对象 @ModelAttribute一个具有如下三个作用: public String test1(@ModelAttribute("user") UserModel user) 1.绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用; @ModelAttribute("cityList") public List cityList() {return Arrays.asList("西安", "郑州");} 2.暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用; public @ModelAttribute("users") UsersModel testUsersModel(@ModelAttribute("users") UserModel users) 3.暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。
那么问题7中的3个问题,在Spring Web MVC内部是如何处理上边的情况的呢:
1、首先执行@ModelAttribute注解的方法,准备视图展示时所需要的模型数据;@ModelAttribute注解方法形式参数规则和@RequestMapping规则一样,如可以有@RequestParam等; 2、执行@RequestMapping注解方法,进行模型绑定时首先查找模型数据中是否含有同名对象,如果有直接使用,如果没有通过反射创建一个,因此2处的users将使用1处返回的命令对象。即2处的users等于1处的user。 此时又有问题了,@RequestMapping注解方法的入参user暴露到模型数据中的名字也是user2,其实我们能猜到: 3、@ModelAttribute注解的返回值会覆盖@RequestMapping注解方法中的@ModelAttribute注解的同名命令对象。 8. @SessionAttributes绑定命令对象到session 有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。Spring Web MVC提供了@SessionAttributes进行请求间透明的存取会话数据。 @SessionAttributes(value = {"user"})含义: @SessionAttributes(value = {"user"}) 标识将模型数据中的名字为“user” 的对象存储到会话中(默认HttpSession),此处value指定将模型数据中的哪些数据(名字进行匹配)存储到会话中,此外还有一个types属性表示模型数据中的哪些类型的对象存储到会话范围内,如果同时指定value和types属性则那些名字和类型都匹配的对象才能存储到会话范围内。 包含@SessionAttributes的执行流程如下所示: 1、 首先根据@SessionAttributes注解信息查找会话内的对象放入到模型数据中; 2、 执行@ModelAttribute注解的方法:如果模型数据中包含同名的数据,则不执行@ModelAttribute注解方法进行准备表单引用数据,而是使用①步骤中的会话数据;如果模型数据中不包含同名的数据,执行@ModelAttribute注解的方法并将返回值添加到模型数据中; 3、 执行@RequestMapping方法,绑定@ModelAttribute注解的参数:查找模型数据中是否有@ModelAttribute注解的同名对象,如果有直接使用,否则通过反射创建一个;并将请求参数绑定到该命令对象; 此处需要注意:如果使用@SessionAttributes注解控制器类之后,③步骤一定是从模型对象中取得同名的命令对象,如果模型数据中不存在将抛出 HttpSessionRequiredException Expected session attribute ‘user’(Spring3.1) 或 HttpSessionRequiredException Session attribute ‘user’ required - not found in session(Spring3.0)异常。 4、 如果会话可以销毁了,如多步骤提交表单的最后一步,此时可以调用SessionStatus对象的setComplete()标识当前会话的@SessionAttributes指定的数据可以清理了,此时当@RequestMapping功能处理方法执行完毕会进行清理会话数据。 9. @Value绑定SpEL表示式 @Value用于将一个SpEL表达式结果映射到到功能处理方法的参数上。 public String testValue(@Value("#{systemProperties['java.vm.version']}") String jvmVersion)
@ResponseBody
作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
不以己悲,断他人之路。不以阳光,断昧明日晴朗。
转载地址:http://mngzi.baihongyu.com/