在系列(4)中我们介绍了如何用@RequestParam来绑定数据,下面我们来看一下其它几个数据绑定注解的使用方法。
1.@PathVariable 用来绑定URL模板变量值,这个我们已经在系列(3)中介绍了使用方法,这里不在赘述。
2.@CookieValue 用来绑定Cookie中的数据。下面我们用获取Cookie中的sessionId做测试:
在DataBindController添加cookiebind action,代码如下:
//@CookieValue Test @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"; }
在views文件夹中添加一个cookiebindresult.jsp视图,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> ${jsessionId} </body> </html>
运行测试:
可以看到已经获取到了sessionId。
注:@CookieValue 与@RequestParam 一样也有3个参数,其含义与的@RequestParam 参数含义相同。
3.@RequestHeader 用来绑定请求头中的数据,我们用@RequestHeader获取User-Agent 来做演示:
在DataBindController添加requestheaderbind action,代码如下:
//@RequestHeader Test @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"; }
在views文件夹中添加一个requestheaderbindresult.jsp视图,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> ${userAgent} </body> </html>
运行测试:
可以看到已经获取到了User-Agent 。
注:@RequestHeader 与@RequestParam 一样也有3个参数,其含义与的@RequestParam 参数含义相同。
4.@ModelAttribute 绑定数据到模型中。在系列(4)的modelAutoBind action中我们将表单提交的数据添加到Model中的代码如下:
@RequestMapping(value="/modelautobind", method = {RequestMethod.POST}) public String modelAutoBind(HttpServletRequest request, Model model, AccountModel accountModel){ model.addAttribute("accountmodel", accountModel); return "modelautobindresult"; }
而借助于@ModelAttribute 我们可以更简单的讲数据添加到Model中,把上面的代码修改为:
@RequestMapping(value="/modelautobind", method = {RequestMethod.POST}) public String modelAutoBind(HttpServletRequest request, @ModelAttribute("accountmodel") AccountModel accountModel){ return "modelautobindresult"; }
运行测试:
可以看到依然成功的绑定了提交的数据。
5.Model中的数据作用域是Request级别的,也就是说在一个Request请求中是获取不到其它Request请求的Model的数据的。但我们可以用@SessionAttributes 把数据存储到session中,来保持多次请求间数据,这样就可以来实现比如分步骤提交表单等需求。下面我们来看如何分2步把数据绑定到AccountModel中:
在DataBindController上添加:
@SessionAttributes(value = "sessionaccountmodel")
在DataBindController添加usernamebind和passwordbind action,代码如下:
//@SessionAttributes Test @ModelAttribute("sessionaccountmodel") public AccountModel initAccountModel(){ return new AccountModel(); } @RequestMapping(value="/usernamebind", method = {RequestMethod.GET}) public String userNameBind( Model model, AccountModel accountModel){ model.addAttribute("sessionaccountmodel", new AccountModel()); return "usernamebind"; } @RequestMapping(value="/usernamebind", method = {RequestMethod.POST}) public String userNameBindPost( @ModelAttribute("sessionaccountmodel") AccountModel accountModel){ //重定向到密码绑定测试 return "redirect:passwordbind"; } @RequestMapping(value="/passwordbind", method = {RequestMethod.GET}) public String passwordBind(@ModelAttribute("sessionaccountmodel") AccountModel accountModel){ return "passwordbind"; } @RequestMapping(value="/passwordbind", method = {RequestMethod.POST}) public String passwordBindPost(@ModelAttribute("sessionaccountmodel") AccountModel accountModel, SessionStatus status){ //销毁@SessionAttributes存储的对象 status.setComplete(); //显示绑定结果 return "sessionmodelbindresult"; }
由于我们在controller上指定了@SessionAttributes,所以在@ModelAttribute(“xxx”)注解的参数会直接在@SessionAttributes中查找名为”xxx”的对象,如果没有找到则调用@ModelAttribute(“xxx”)注解的方法返回对象并存入@SessionAttributes(如果没有找到且没有@ModelAttribute(“xxx”)注解的方法就会抛出HttpSessionRequiredException)。当执行到最后一步就可以调用SessionStatus .setComplete()方法把@SessionAttributes中保存对象销毁了(不会清除HttpSession中的数据)。
在views文件夹中添加usernamebind.jsp、passwordbind.jsp和sessionmodelbindresult.jsp视图内容分别如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form:form modelAttribute="sessionaccountmodel" method="post"> 用户名:<form:input path="username"/><br/> <input type="submit" value="Submit" /> </form:form> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form:form modelAttribute="sessionaccountmodel" method="post"> 密 码:<form:password path="password"/><br/> <input type="submit" value="Submit" /> </form:form> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 用户名:${sessionaccountmodel.username}<br/> 密 码:${sessionaccountmodel.password} </body> </html>
运行测试:
可以看到我们已经成功的分2步把数据绑定到AccountModel中了。
注:
@SessionAttributes有value和types两个参数其中value指明要对象的名称,types指定要绑定对象的类型,如@SessionAttributes(value = "sessionaccountmodel", types=AccountModel.class)两者是and关系,需要同时满足。也可以同时指定多个value和types 如:@SessionAttributes(value = {"aa", "aa"} , types={XXX.class, YYY.class}) 。
6.@RequestBody 调用合适的MessageConvert来把非application/x-www-form-urlencoded请求中的内容转换为指定的对象它通常与@ResponseBody合用,@ResponseBody与.@RequestBody刚好相反,他把指定的对象转换为合适的内容(请求头为Accept:application/json 则返回json数据)并返回。这里我们用一个ajax请求做演示:
由于Spring默认解析json用的是Jackson,所以我们这里要把jackson-core-asl-1.9.13.jar和jackson-mapper-asl-1.9.13.jar两个包添加到我们项目。
修改AccountModel让其继承Serializable接口,并添加一个空的构造函数(为了Jackson做转换)。
在DataBindController添加requestBodyBindaction,代码如下:
//@RequestBody Test @RequestMapping(value="/requestbodybind", method = {RequestMethod.GET}) public String requestBodyBind(Model model){ model.addAttribute("accountmodel", new AccountModel()); return "requestbodybind"; } @RequestMapping(value="/requestbodybind", method = {RequestMethod.POST}) public @ResponseBody AccountModel requestBodyBind(@RequestBody AccountModel accountModel){ return accountModel; }
在views文件夹中添加requestbodybind.jsp视图内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <html> <head> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form:form modelAttribute="accountmodel" method="post"> 用户名:<form:input path="username"/><br/> 密 码:<form:password path="password"/><br/> <input type="button" id="submit" value="Submit" /> </form:form> <script type="text/javascript"> $(function() { $("#submit").click(function() { var postdata = '{"username":"' + $('#username').val() + '","password":"' + $('#password').val() + '"}'; $.ajax({ type : 'POST', contentType : 'application/json', url : 'http://localhost:8080/SpringMVCLesson/databind/requestbodybind', processData : false, dataType : 'json', data : postdata, success : function(data) { alert('username : '+data.username+'\npassword : '+data.password); }, error : function() { alert('error...'); } }); }); }); </script> </body> </html>
运行测试:
结果正确,证明转换成功。
7.@RequestPart 绑定“multipart/form-data“类型数据,支持javax.servlet.http.Part文件上传,并可可以进行类型转换,详见官方文档:
代码下载:http://pan.baidu.com/s/1hqqVLTa
相关推荐
5. @RequestHeader 注解 @RequestHeader 注解用来绑定请求头参数。例如: ```java @Controller @RequestMapping("/departments") public class DepartmentController { @RequestMapping(value = "/{id}", method...
2. **@RequestHeader 和 @CookieValue** `@RequestHeader` 注解允许开发者从 HTTP 请求头中获取值并将其绑定到方法参数。例如,要获取 `Accept-Encoding` 头部的值,可以这样写: ```java @RequestMapping("/...
`@CookieValue`注解可以将Cookie的值绑定到方法参数上,例如`public void handleCookie(@CookieValue("sessionId") String sessionId)`。 6. **HTTP方法参数**: Spring MVC还支持直接使用HTTP方法(GET, POST等...
- `@ModelAttribute` 通常与表单绑定和模型属性结合使用,它可以从请求参数中获取数据并创建一个对象实例,或者将对象添加到模型中。例如: ```java @PostMapping("/submitForm") public String submitForm(@...
5. **通过`@CookieValue`获取Cookie值:** - 使用`@CookieValue`注解可以从客户端的Cookie中获取值: ```java @RequestMapping("/handle6") public String handle6(@CookieValue(value="sessionId", required=...
`@ModelAttribute`通常用于绑定整个表单数据到一个对象,同时它还可以用于方法间共享数据。 11. `Errors`或`BindingResult`参数: 这两个参数用于处理数据验证结果,例如`public String save(@Valid User user, ...
- RESTful接口通常返回JSON格式的数据,SpringMVC通过`@ResponseBody`或使用`@RestController`(它的功能等同于`@Controller` + `@ResponseBody`)来自动将Java对象转换为JSON。 6. **最佳实践** - 使用合适的...
7. **@RequestHeader**:用于获取请求头(header)的数据。 8. **@RequestBody**:用于读取请求体的内容,通过HttpMessageConverter将其转换为期望的对象类型。 9. **@ResponseBody**:将控制器方法的返回值直接...
- `@PathVariable`, `@RequestHeader` 和 `@CookieValue` 用于获取URL路径、请求头和cookie中的值。 9. **响应数据处理**: - `@ResponseBody`:标记在方法上,表示返回的数据将直接序列化为HTTP响应体,适合于...
- **`@RequestHeader`**:用于绑定请求头数据。 - **`@CookieValue`**:用于绑定 Cookie 数据。 - **`@ModelAttribute`**:用于绑定参数到命令对象。 - **`@SessionAttributes`**:用于绑定命令对象到 session。 ##...
`@PathVariable`、`@RequestParam`、`@RequestHeader`和`@CookieValue`则用于从HTTP请求中获取参数。例如,从URL路径中获取参数: ```java @GetMapping("/users/{userId}") public String getUser(@PathVariable ...
例如,`@RequestHeader("param1")` 将请求头中名为 "param1" 的值绑定到方法参数。在示例中,如果请求头包含键 "param1" 值为 "abc",则 `testHeaderParam` 方法会打印出 "通过RequestHeader获取的参数param1=abc"。...
2. 请求参数绑定实体类型:可以将多个参数封装到一个 Java 对象中,然后通过 @ModelAttribute 注解获取。 3. 请求参数绑定集合类型:支持绑定 List 或 Map 类型的参数,需要在 Controller 方法中设置相应的属性并...
通过注解,如`@RequestParam`、`@RequestBody`、`@PathVariable`、`@RequestHeader`、`@CookieValue`等,可以方便地处理HTTP请求的各种参数。 例如,`@RequestParam`用于绑定URL查询参数,如在查询账户的场景中,...
使用@RequestParam、@RequestHeader和@CookieValue注解分别映射请求参数、请求头和Cookie值信息到相应处理方法的入参中,并根据方法的返回值类型做出相应的后续处理。另外,SpringMVC也支持使用POJO对象绑定请求参数...
- `@RequestHeader`:获取请求的头部信息。 #### 十、数据库相关 1. **Hibernate与MyBatis的区别**: - Hibernate是一种全自动的ORM框架,更新时会全字段更新,对象直接对应数据库表。 - MyBatis是半自动的ORM...