@ModelAttribute
@ModelAttribute使用大致有有两种,一种是是直接标记在方法上,一种是标记在方法的参数中,两种标记方法产生的效果也各不相同。
直接标记在方法上
当同一个controller(控制器)中有任意一个方法被@ModelAttribute注解标记,页面请求只要进入这个控制器,不管请求那个方法,均会先执行被@ModelAttribute标记的方法,所以我们可以用@ModelAttribute注解的方法做一些初始化操作。当同一个controller中有多个方法被@ModelAttribute注解标记,所有被@ModelAttribute标记的方法均会被执行,按先后顺序执行,然后再进入请求的方法。
标记在方法的参数中
Spring MVC中,将方法入参 对象 添加到模型中,仅需要在对应的入参前使用 (1)@ModelAttribute注解即可。(2)当然也可以不使用@ModelAttribute,直接在Model入参,并将对象放入.
@RequestMapping(value="/useradd",method=RequestMethod.GET)
public String addUser(@ModelAttribute("user") User user){
//@ModelAttribute("user")表示将user放入Model当中
return "useradd";
}
相当于:
@RequestMapping(value="/useradd",method=RequestMethod.GET)
public String addUser(User user,Model model){
model.addAttribute("user", user);
return "useradd";
}
@sessionAttributes
@sessionattributes注解应用到Controller上面,可以将Model中的属性同步到session当中。
@Controller
@RequestMapping("/Demo.do")
@SessionAttributes(value={"attr1","attr2"})
public class Demo {
@RequestMapping(params="method=index")
public ModelAndView index() {
ModelAndView mav = new ModelAndView("index.jsp");
mav.addObject("attr1", "attr1Value");
mav.addObject("attr2", "attr2Value");
return mav;
}
@RequestMapping(params="method=index2")
public ModelAndView index2(@ModelAttribute("attr1")String attr1, @ModelAttribute("attr2")String attr2) {
ModelAndView mav = new ModelAndView("success.jsp");
return mav;
}
}
index方法返回一个ModelAndView 其中包括视图index.jsp 和 两个键值放入model当中,在没有加入@sessionattributes注解的时候,放入model当中的键值是request级别的。
现在因为在Controller上面标记了@SessionAttributes(value={“attr1”,“attr2”}) 那么model中的attr1,attr2会同步到session中,这样当你访问index 然后在去访问index2的时候也会获取这俩个属性的值。
当需要清除session当中的值得时候,我们只需要在controller的方法中传入一个SessionStatus的类型对象 通过调用setComplete方法就可以清除了。
@RequestMapping(params="method=index3")
public ModelAndView index4(SessionStatus status) {
ModelAndView mav = new ModelAndView("success.jsp");
status.setComplete();
return mav;
}