一、参数绑定注解介绍
Spring MVC中绑定数据的注解如下:
@RequestParam 绑定单个请求数据,既可以是URL中的参数,也可以是表单提交的参数或上传的文件。
@PathVariable 绑定URL中的参数值
@CookieValue 绑定Cookie参数
@RequestHeader 绑定HTTP请求头参数
@ModelAttribute 绑定Model参数
@SessionAttributes 绑定Session参数
@RequestBody 请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象。
@ResponseBody 将内容或对象作为 HTTP 响应正文返回,使用@ResponseBody将会跳过视图处理部分,而是调用适合HttpMessageConverter,将返回值写入输出流。
@RequestPart 绑定“multipart/form-data”参数。
二、参数绑定注解详解
此注解用于绑定单个请求数据,既可以是URL中的参数,也可以是表单提交的参数或上传的文件。
它有三个属性:value、defaultValue、required。
value 用于设置参数名。
defaultValue 用于对参数设置默认值。
required 用于设置是否必需值,默认为true。为true时,如果参数为空,会报错。
demo1-post.jsp代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'demo1-post.jsp' starting page</title> </head> <body> <form method="post" action="/web/paramBind/demo1"> <input type="text" name="username" value="zhangsan" /> <input type="submit" value="提交" /> </form> </body> </html>
Controller部分代码如下所示:
@Controller @RequestMapping("/paramBind") public class ParamBindController { @RequestMapping(value={"/demo1-post"}) public ModelAndView demo1(){ ModelAndView modelAndView= new ModelAndView(); modelAndView.setViewName("demo1-post"); return modelAndView; } @RequestMapping(value={"/demo1"}) public ModelAndView demo1(@RequestParam(value="username") String username,@RequestParam(value="id",defaultValue="1",required=false) Integer id){ ModelAndView modelAndView= new ModelAndView(); modelAndView.addObject("username", username); modelAndView.addObject("id", id); modelAndView.setViewName("demo1-success"); return modelAndView; } }
demo1-success.jsp代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'demo1-success.jsp' starting page</title> </head> <body> 用户名为:${username} <br /> Id为:${id} </body> </html>
操作步骤和结果如下图所示:
此注解用于绑定URL中的参数值。它只有一个属性值value。
Controller部分代码如下所示:
@Controller @RequestMapping("/paramBind") public class ParamBindController { @RequestMapping(value={"/demo2/{id}"}) public ModelAndView demo2(@PathVariable(value="id") Integer id){ ModelAndView modelAndView= new ModelAndView(); modelAndView.addObject("id", id); modelAndView.setViewName("demo2"); return modelAndView; } }
demo2.jsp代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'demo2.jsp' starting page</title> </head> <body> id值为:${id } </body> </html>
运行结果如下图所示:
此注解用于绑定Cookie参数。
Controller部分代码如下所示:
@Controller @RequestMapping("/paramBind") public class ParamBindController { // @CookieValue示例 @RequestMapping(value={"/initCookie"}) public ModelAndView initCookie(HttpServletResponse response){ ModelAndView modelAndView= new ModelAndView(); response.addCookie(new Cookie("coolieId", "123456")); modelAndView.setViewName("demo3-initCookie"); return modelAndView; } @RequestMapping(value={"/demo3"}) public ModelAndView demo3(@CookieValue(value="coolieId",defaultValue="",required=false) String coolieId){ ModelAndView modelAndView= new ModelAndView(); modelAndView.addObject("coolieId", coolieId); modelAndView.setViewName("demo3"); return modelAndView; } }
在/paramBind/initCookie中设置cookie,在/paramBind/demo3中读取cookie。
执行结果如下图所示:
此注解用于绑定HTTP请求头参数。
Controller中部分代码如下所示:
@Controller @RequestMapping("/paramBind") public class ParamBindController { // @RequestHeader示例 @RequestMapping(value={"/demo4"}) public ModelAndView demo4(@RequestHeader(value="User-Agent",defaultValue="",required=false) String userAgent){ ModelAndView modelAndView= new ModelAndView(); modelAndView.addObject("userAgent", userAgent); modelAndView.setViewName("demo4"); return modelAndView; } }
运行结果如下所示:
此注解用于绑定Model参数。Model中数据的作用域是Requets级别的,也就是说在一个Request请求中是获取不到其它Request请求的Model的。
首先创建一个model,如User.java,代码如下:
package com.uni2uni.model; public class User { private Integer id; private String username; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
Controller的部分代码如下所示:
@Controller @RequestMapping("/paramBind") public class ParamBindController { // @ModelAttribute示例 @RequestMapping(value={"/demo5-post"}) public String demo5post(){ return "demo5-post"; } @RequestMapping(value={"/demo5"},method={RequestMethod.POST}) public String demo5(@ModelAttribute("user") User user){ return "demo5"; } }
demo5-post.jsp代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'demo1-post.jsp' starting page</title> </head> <body> <form modelAttribute="user" method="post" action="/web/paramBind/demo5"> <input type="text" name="username" value="zhangsan" /> <input type="password" name="password" value="111" /> <input type="submit" value="提交" /> </form> </body> </html>
demo5.jsp代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> </head> <body> 用户名是:${user.username } <br/> 密码是:${user.password } </body> </html>
操作结果如下图所示:
此注解用于绑定Session参数。与其它注解不同的是,@SessionAttributes(value="sessionId")是在Controller上加的。如下所示:
@Controller @RequestMapping("/paramBind") @SessionAttributes(value="sessionId") public class ParamBindController { }
设置Session的代码如下所示:
@RequestMapping(value={"/initSession"}) public String initSession(HttpServletRequest request){ request.getSession().setAttribute("sessionId", "111111"); return "demo6-initSession"; }
demo6.jsp代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> </head> <body> Session的值为:${sessionId } </body> </html>
执行结果如下图所示:
此注解用于将请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象。
将内容或对象作为 HTTP 响应正文返回,使用@ResponseBody将会跳过视图处理部分,而是调用适合HttpMessageConverter,将返回值写入输出流。一般返回json或xml。
Controller中部分代码如下所示:
@RequestMapping(value={"/demo7"}) public @ResponseBody User demo7(){ User user= new User(); user.setId(1); user.setUsername("zhangsan"); user.setPassword("111"); return user; }
返回Json如下所示:
{"id":1,"username":"zhangsan","password":"111"}
此注解用于绑定“multipart/data”参数。