Spring學習總結 - 註解

一、@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 {
	。。。
}


發佈了48 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章