被@ModelAttribute注解的方法会在该Controller类中的其他方法调用之前被调用。
如下代码中out方法被调用之前会先调用populateModel方法,在/jsp/hello页面中可直接通过${user.uid}和${user.usernmame}获取到3和xxx。
@ModelAttribute public void populateModel(User user, ModelMap model) { // 没有model也可以 user.setUid(3); user.setUsername("xxx"); } @RequestMapping(value = "/demo", params = "method=out") public String out() { return "/jsp/hello"; }
/** * 调用该方法前会先调用具有注解(@ModelAttribute)的其他方法,在这个方法中可进行初始化等操作 * @return */ @RequestMapping(value = "/demo", params = "method=out") public String out() { return "/jsp/hello"; } /** * 没有指定model的属性,由返回值类型隐含表示 * @return */ @ModelAttribute public User addUser() { User user = new User(); user.setUid(5); user.setUsername("ooo"); return user; }
/** * 通过@ModelAttribute(value="")来指定model属性的名称,及在页面中通过${attributeName.xxx}的形式来获取值,而不是${user.xxx} * @param uid * @param username * @return */ @ModelAttribute("attributeName") public User sendUser(Integer uid, String username) { User u = new User(); u.setUid(uid); u.setUsername(username); return u; } /** * 调用该方法前会先调用具有注解(@ModelAttribute)的其他方法,在这个方法中可进行初始化等操作 * * @return */ @RequestMapping(value = "/demo", params = "method=out") public String out() { return "/jsp/hello"; }
attributeName和其他方法中的属性相冲突,有可能会导致异常。
/** * 方法上同时使用注解RequestMapping和ModelAttribute,相当于request中封装了key=attributeName,value=hi * @return 返回值不在是名称为hi的视图,视图名称由RequestToViewNameTranslator根据请求"/hello.do"转换为逻辑视图hello.jsp。 */ @RequestMapping(value = "/jsp/hello.do") @ModelAttribute("attributeName") public String helloWorld() { return "hi"; }
@ModelAttribute("user") public User addAccount() { User s = new User(); s.setUid(132); s.setUsername("jz"); return s; } /** * @ModelAttribute("user") User * user注释参数,user的值来源addAccount()方法,scope为request,如果标注有@SessionAttributes( * "user"),则scope为session * * @param user * @return */ @RequestMapping(value = "/hello") public String helloWorld(@ModelAttribute("user") User user) { user.setUsername("jizhou"); return "/jsp/hello"; }
/** * 从Form表单或URL参数中获取(实际上,不做此注释也能拿到user对象) * @param user * @return */ @RequestMapping(value = "/helloWorld") public String hel(@ModelAttribute User user) { return "helloWorld"; }
在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap中的属性将销毁。如果希望在多个请求中共享 ModelMap 中的属性,必须将其属性转存到 session 中,这样ModelMap 的属性才可以被跨请求访问。
/** * 在controller类添加注解@SessionAttributes({"a1", "a2","a3"}),这样在整个session声明周期类可以跨请求访问ModelMap中a1,a2,a3的值 * @author liuyunlong * */ @Controller @SessionAttributes({"a1", "a2","a3"}) public class RegisterController extends BaseContrller { 。。。 }