一、@SessionAttribute详解
如果多个请求之间需要共享数据,就可以使用@SessionAttribute。
配置的方法:
在控制器类上标注@SessionAttribute。
配置需要共享的数据范围。
这样,就可以将model中的属性同步到session中了。
注意:
默认情况,SpringMVC会将model的数据存放在request域中。
此时,当一个请求结束之后,数据将会失效。
因此,当数据需要跨页面使用时,就需要将数据存放到session中。
@SessionAttributes就是将指定的model中的数据拷贝到session中。
使用方法:
@SessionAttribute中,
value指定需要放入会话的属性名称。
type指定需要放入会话的属性类型。
@SessionAttributes(types=User.class)会将model中所有类型为 User的属性添加到会话中。
@SessionAttributes(value={“user1”, “user2”}) 会将model中属性名为user1和user2的属性添加到会话中。
@SessionAttributes(types={User.class, Dept.class}) 会将model中所有类型为 User和Dept的属性添加到会话中。
@SessionAttributes(value={“user1”,“user2”},types={Dept.class})会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。
@SessionAttributes(value={"user"}) @Controller public class UserController { @RequestMapping("/testSessionAttributes") public String testSessionAttributes(Model model){ User user = new User("jack","123456"); model.addAttribute("user", user); return "success"; } }
在前端取值:
${requestScope.user}
${sessionScope.user}
二、@ModelAttribute详解
主要的作用:
将数据添加到model对象中,用于视图页面展示的时候使用。
@ModelAttribute注解的方法,在controller中每个处理方法被调用之前,都会按照先后顺序被执行一次。
因此,当一个controller映射多个URL,使用该注解需要谨慎。
注解使用情形:
(1) @ModelAttribute 注释没有返回值的方法:
@Controller @RequestMapping(value="/") public class TestModelAttributeController { @RequestMapping(value="/result") public String login(Model model) { //如果测试成功,控制台输出true System.out.println(model.containsAttribute("username")); System.out.println(model.containsAttribute("pwd")); return "result"; } @ModelAttribute public void user( @RequestParam("username") String username, @RequestParam("pwd") String pwd,Model model) { model.addAttribute("username", username); model.addAttribute("pwd", pwd); } }
在@RequestMapping注解的方法被调用时,在这个方法之前,@ModelAttribute方法将会先被执行。
model.addAttribue("key",value)绑定键值。
上面这种情况,当URL或者post没有传递参数时,会报错。
(2) @ModelAttribute 注释返回具体类的方法
@ModelAttribute public User userModel(@RequestParam("username") String username,@RequestParam("pwd") String pwd){ User user = new User(username,pwd); return user; }
这里,model属性的名称没有指定。
由返回类型隐含表示。
属性名称是user。
(3)@ModelAttribute(value="")注释返回具体类的方法
@Controller @RequestMapping(value="/") public class TestModelAttributeController{ @RequestMapping(value="result") public String login(Model model) { model.containsAttribute("username"); return "result"; } /* * 返回的是username的值 *相当于model.addAttribute("username", username); */ @ModelAttribute(value="username") public String userModel(@RequestParam("username") String username) { return username; } }
(4)@ModelAttribute和@RequestMapping同时注释一个方法
@Controller @RequestMapping(value="/") public class TestModelAttributeController{ @ModelAttribute("username") @RequestMapping(value="/result") public String login(@RequestParam("username") String username,Model model) { System.out.println(model.containsAttribute("username")); return username; } }
@ModelAttribute(“xxx”)的属性值作为model的attributeName,login方法返回值作为attributeName的属性值;
RequestMapping("/yyy")作为请求路径,也同时作为视图名,即跳转页面的名称