一、@ModelAttribute
1、@ModelAttribute註釋方法
被@ModelAttribute註解的方法會在該Controller類中的其他方法調用之前被調用。
1.1、@ModelAttribute註釋void類型的方法
如下代碼中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";
}
1.2、@ModelAttribute註釋有返回值的方法
/**
* 調用該方法前會先調用具有註解(@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;
}
1.3、@ModelAttribute(value="")註釋有返回值的方法
/**
* 通過@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";
}
1.4、@ModelAttribute和@RequestMapping同時註釋一個方法 ,注意
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";
}
2、@ModelAttribute註釋方法的參數
2.1、從model中獲取
@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";
}
2.2、從form表單或者URL參數中獲取
/**
* 從Form表單或URL參數中獲取(實際上,不做此註釋也能拿到user對象)
* @param user
* @return
*/
@RequestMapping(value = "/helloWorld")
public String hel(@ModelAttribute User user) {
return "helloWorld";
}
二、@sessionattributes詳解
在默認情況下,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 {
。。。
}