SpringMVC数据绑定
一、数据绑定的相关注解
@RequestMapping(value = "/ok1",method = {RequestMethod.GET}) public String ok1(User user){ System.out.println(user.getUsername()); System.out.println(user.getPwd()); return "success"; }
最基本的传值方法。
二、Spring Web MVC提供Model、Map或ModelMap让我们能去暴露渲染视图需要的模型数据。虽然此处注入的是三个不同的类型(Model model,Map model2,ModelMap model3),但是三者是同一个对象。
@RequestMapping(value = "/ok2") public String ok2(User user, Map map,ModelMap mm,Model m){ // map.put("username",user.getUsername()+"˧"); // mm.addAttribute("username",user.getUsername()+"˧"); m.addAttribute("username",user.getUsername()+"˧"); return "success"; }
三、@RequestParam
绑定单个请求参数值,@RequestParam用于将请求参数区数据映射到功能处理方法的参数上。如以下代码:
public String requestparam(@RequestParam String username)
请求中包含username参数(如/requestparam?username=zhang),则自动传入。
@RequestMapping(value = "/ok3") public String ok3(@RequestParam String username,@RequestParam String pwd){ System.out.println(username); System.out.println(pwd); return "success"; }
也可以在里面加上参数value:
@RequestMapping(value = "/ok4") public String ok4(@RequestParam(value = "user") String username){ System.out.println(username); return "success"; }
<a href="/his/ok4?user=weikun">ok4</a>
前端的名字必须为user。
也可以传入一个列表或者是一个数组
<a href="/his/ok5?user=weikun&user=mike">ok5</a> <a href="/his/ok6?user=weikun&user=mike">ok6</a>
@RequestMapping(value = "/ok5") public String ok5(@RequestParam(value = "user") String[] users){ System.out.println(users[0]); System.out.println(users[1]); return "success"; } @RequestMapping(value = "/ok6") public String ok6(@RequestParam(value = "user") List users){ System.out.println(users.get(0)); System.out.println(users.get(1)); return "success"; }
四、@CookieValue
@Cookievalue用于将请求的Cookie数据映射到功能处理方法的参数上。
public String test(@CookieValue(value="JSESSIONID",defaultValue="")String sessionID){}
如上配置将会自动将JSESSIONID值传入到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。
实例:
<body> COOKIE:${cookie.hit.value} </body>
${}这种传值方法是JSP的EL表达式。
@RequestMapping(value = "/ok7") public String ok7( @CookieValue(value="hitCounter", defaultValue = "8") Long hit, HttpServletResponse response){ Cookie cookie=new Cookie("hit",new Long(++hit).toString()); response.addCookie(cookie); return "success"; }
将hitCounter传入到hit参数上,然后利用传入的response将cookie加到返回的页面上。
五、@ModelAttribute
绑定请求参数到命令对象
@ModelAttribute一共具有如下三个作用:
1、绑定请求参数到命令对象:放在功能处理方法的入参时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
2、暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
3、暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。
绑定请求参数到命令对象如用户登录,我们需要捕获用户登录的请求参数(用户名、密码)并封装为用户对象,此时我们可以使用@ModelAttribute绑定多个请求参数到我们的命令对象。
public String test(@ModelAttribute("user") User user)
public String ok1(@ModelAttribute("user1") User user){ System.out.println(user.getUsername()); System.out.println(user.getPwd()); return "success"; }
上面的是参数中加上@ModelAttribute注解。还可以用到返回值中,但是,加到返回值中的时候,原来要返回的页面名称就不会返回了,这时,我们可以在视图层创建一个对应的jsp文件,将会自动转到这个页面。
@RequestMapping(value="/ok2") public @ModelAttribute("user1") User ok2(User user,Map map){ System.out.println(map.containsKey("user")); user.setUsername(user.getUsername()+"帅"); return user; }
ok2.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>${user.username}</h1> </body> </html>
返回列表的形式:
@RequestMapping(value="/ok3") public @ModelAttribute List<String> ok3(){ return Arrays.asList("北京","上海","杭州"); }
返回键值对即hashmap:
@RequestMapping(value="/ok5") public @ModelAttribute Map<String,User> ok5(){ Map<String,User> map=new HashMap(); map.put("A",new User("Mike","119")); map.put("B",new User("Rose","888")); return map; }
六、@SessionAttribus
@SessionAttributes绑定命令对象到session
有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。在控制器类前就要加上@SessionAttribute注解
@SessionAttributes(value = {"username","pwd"})
方法为:
@RequestMapping(value="/ok7") public void ok7(){ }
jsp为:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${sessionScope.username} </body> </html>