Spring MVC3 複雜表單屬性綁定

	SpringMVC 文檔提到了 @SessionAttributes annotation,和 @ModelAttribute 配合使用可以往 Session 中保存或者從 Session 中取指定屬性名的具體對象。 
	@SessionAttributes 是用來在 controller 內部共享 model 屬性的。從文檔自帶的例子來看,標註成 @SessionAttributes 屬性的對象,會一直保留在 Session 或者其他會話存儲中,直到 SessionStatus 被顯式 setComplete()。那這個 annotation 對我們有什麼幫助呢?
	答案就是我們可以在需要訪問 Session 屬性的 controller 上加上 @SessionAttributes,然後在 action 需要的 User 參數上加上 @ModelAttribute,並保證兩者的屬性名稱一致。SpringMVC 就會自動將 @SessionAttributes 定義的屬性注入到 ModelMap 對象,在 setup action 的參數列表時,去 ModelMap 中取到這樣的對象,再添加到參數列表。只要我們不去調用 SessionStatus 的 setComplete() 方法,這個對象就會一直保留在 Session 中,從而實現 Session 信息的共享。
Controller的代碼如下:

@Controller
@SessionAttributes("currentUser")
public class GreetingController {
	@RequestMapping
	public void hello(@ModelAttribute("currentUser") User user) {
		//user.sayHello()
	}
}

	使用這種方案,還需要在 SpringMVC 配置文件的 ViewResolver 定義處,加上 p:allowSessionOverride="true",這樣如果你對 User 對象做了修改,SpringMVC 就會在渲染 View 的同時覆寫 Session 中的相關屬性。

=========================================================================================================


不管是多麼複雜的表單均可以通過Form Bean的方式進行處理,大大簡化複雜表單的處理。 

採用Spring的Form標籤,而我比較喜歡原始的JSP和HTML。

閒話少說,現在正式開始我們的複雜Form處理,我的Form Bean結構如下: 

FormBean的結構如下: 
	private String name;
	private int age;
	private String[] associate;
	private ComBen[] bens; //另一個數組對像 
	//ComBen的結構如下: 
	private String com;
	private int[] typevalue;
	private String[] typename;
	private ThirdBen[] thdben;//再一層數組對像 
	//ThirdBen的結構如下: 
	private String thdname;
	private String value[];//又一層數組值 


相信已經足夠複雜了,我們只需要new 一個FormBean並添加到 request : 
@RequestMapping(value="/test/testForm.do") 
public String testFormBean(ModelMap model){
	model.addAttribute("formBean", new FormBean());
	return "formbean.jsp"
}

 (注意:這個要與jsp中的modelAttribute相同)。 

再看看我們的formbean.jsp頁面中的Form如何編寫: 
<!-- 複雜form對像測試 --> 
	<form modelAttribute="formBean" method="POST" action="/test/testForm.do">
		<input name="name" value="name" /> 
		<input name="age" value="12" /> 
		<input name="associate[0]" value="ass1" /> 
		<input name="associate[1]" value="ass2" /> 
		<input name="associate[2]" value="ass3" /> 
		<input name="bens[0].com" value="bean common1" /> 
		<input name="bens[0].typevalue" value="1" /> 
		<input name="bens[0].typename" value="tname1" /> 
		<input name="bens[0].typevalue" value="2" /> 
		<input name="bens[0].typename" value="tname2" /> 
		<input name="bens[0].typevalue" value="3" /> 
		<input name="bens[0].typename" value="tname3" /> 
		<input name="bens[0].thdben[0].thdname" value="thdname1" /> 
		<input name="bens[0].thdben[0].value" value="thdvalu11" /> 
		<input name="bens[0].thdben[0].value" value="thdvalu12" /> 
		<input name="bens[0].thdben[1].thdname"	value="thdname2" /> 
		<input name="bens[0].thdben[1].value" value="thdvalu21" /> 
		<input name="bens[0].thdben[1].value" value="thdvalu22" /> 
		<input name="bens[1].com" value="bean common2" />
		<input name="bens[1].typevalue" value="21" /> 
		<input name="bens[1].typename" value="tname21" /> 
		<input name="bens[1].typevalue" value="23" /> 
		<input name="bens[1].typename" value="tname23" /> 
		<input type="submit" value="提交" />
	</form>


簡潔吧,我們只要把上述form提交到Controller,就可以在Controller中直接得到這個複雜的FormBean對像;

看完這個例子,相信大家可以處理任何的複雜表單了。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章