對 於簡單的表單需求,通常透過繼承org.springframework.web.servlet.mvc.SimpleFormController來 定義Controller,並重新定義其onSubmit()或doSubmitAction()方法來完成表單功能,而實際上真正的表單處理流程定義在 org.springframework.web.servlet.mvc.AbstractFormController,在API文件中,有說明其一 連串的方法之作用,這邊整理一下當中的說明:
- 呼叫formBackingObject()方法,要返回一個commandClass的實例。
- 呼叫initBinder()方法,允許您對Command特定的Field作格式化等動作,例如日期格式、金錢格式等,提供非基本型態或String的設定。
- 呼叫showForm()方法,返回一個View物件,用於表單的展現。
- 如果"bindOnNewForm"屬性被設定為true,則應用ServletRequestDataBinder根據初始請求參數來填入一個新的表單物件,並且呼叫onBindOnNewForm()方法。
- showForm()方法會呼叫referenceData()方法,如果在展現表單的過程中,需要一些相關資料,可以回傳一個Map物件,例如:
protected Map referenceData(
HttpServletRequest request) throws Exception {
Map ref = new HashMap();
ref.put("defalutUser", "guest");
return ref;
}
這樣一來,您就可以在JSP網頁中使用如\${defaultUser}的寫法來呈現資料,例如所取得的值會是"guest"。
HttpServletRequest request) throws Exception {
Map ref = new HashMap();
ref.put("defalutUser", "guest");
return ref;
}
這樣一來,您就可以在JSP網頁中使用如\${defaultUser}的寫法來呈現資料,例如所取得的值會是"guest"。
- Model物件被展現,使用者可以看到表單並進行填寫。
使用者填寫完表單之後送出表單,將會依以下的流程進行:
- 接受使用者的表單送出,通常使用POST,如果不想用POST這樣的方式來判斷使用者是否送出表單,可以重新定義isFormSubmission()方法。
- 如果"sessionForm"屬性沒有設定,則會呼叫formBackingObject()方法以取得表單物 件,否則嘗試從session中取得表單物件,如果沒有找到則呼叫handleInvalidSubmit()方法,預設的動作是嘗試建立新的表單物件並 重新填寫表單。
- ServletRequestDataBinder根據目前的請求參數填入表單物件。
- 呼叫onBind()方法,在綁定資料之後,驗證資料之前您可以對表單物件進行一些自訂的修改動作。
- 如果"validateOnBinding"屬性被設定,則使用驗證器。
- 呼叫onBindAndValidate()方法,允許您在驗證資料之後對表單物件作一些處理。
- 表單物件處理完畢,最後呼叫processFormSubmission()方法,子類別要重新定義這個方法,以完成使用者的請求。