Spring 的 AbstractFormController (转载)

来源:互联网 发布:windows live id密码 编辑:程序博客网 时间:2024/06/01 11:41
以下是 Spring 的 AbstractFormController 處理流程,這些資料是附在 API 文件中的 AbstractFormController 內
我在這邊作一個整理,目前剛好有使用到 Spring
可能可以參考一下他的 Controller 使用方法
不過很多人說 webwork 比較好用,撰寫 action 比較好用
先試試看吧.....

以下為在處理 Controller 的時候,每個步驟會呼叫的 method (意思就是說如果針對某個步驟,需要作處理的話,就要實作這個 Method)
前面的幾個部分,是在準備的階段
1. formBackingObject
  預設如果使用 Get 的方式呼叫 Action,就會先呼叫
  可以在這個 Method 回傳一個已經定義好的 Object
  在 form 初期設定的時候可以使用

2. initBinder
  可以在這個方法裡面去替某些不是 primitive-type or String 的資料型態
  去作一些特別的處理,讓這些欄位的資料可以在 HTML 展現的時候,會是你所想要的樣子
  比如說日期的格式轉換、數字的千分位格式等
  
  這時候要使用 ServletRequestDataBinder.registerCustomEditor()
  
  public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)
  public void registerCustomEditor(Class requiredType, String field, PropertyEditor propertyEditor)
  
  如果只是要針對某一種型態的資料作特別的轉換,就用第一種方法
  如果必須要針對某一個欄位作特別的設定,就要用第二種方法
  處理的方式將要使用 PropertyEditor 來實作
  
  日期格式
  org.springframework.beans.propertyeditors.CustomDateEditor(DateFormat dateFormat, boolean allowEmpty)
  Example: binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy/MM/dd"), true));
  
  數字格式
  org.springframework.beans.propertyeditors.CustomNumberEditor(Class numberClass, NumberFormat numberFormat, boolean allowEmpty)
  
  其他的 PropertyEditor 可以參考 org.springframework.beans.propertyeditors 這個 Package
  
  PropertyEditor 為 java.bean 的 Interface
  要參考 java.beans.PropertyEditorSupport
  
  (only if bindOnNewForm is set to true)
3. showForm
  回傳一個 ModelAndView 給前端,實際上展現的 View 會在這裡決定
  但是如果不想在這裡設定的話,就必須要繼承 SimpleFormController,並且要設定 formView 這個 Property

4. referenceData
  如果在編輯 form 的過程當中,還需要一些與 form 有相關連的資料需要使用
  可以在這裡回傳一個 Map,讓前端可以使用,主要是以 BeanName/BeanInstance 的方式回傳
  這裡回傳的資料,同樣會放置到 ModelAndView 內的 map 中
  
5. 接下來 Model 將會真正展現畫面,這時候就是讓使用者開始填寫 form 的資料的時候了

接下來的部分,當使用者填寫完資料以後,要將資料送到後端來的處理,一般來說是 POST 的方式
6. 如果使用者使用 POST 的方式,預設就會開始以下的處理,如果使用者不想根據 POST/GET 這樣的判斷方式來決定
  可以 Override isFormSubmission(javax.servlet.http.HttpServletRequest) method.

7. 如果 sessionForm 這個屬性沒有設定 (預設為 false),就會去呼叫 formBackingObject 取得 form object
  如果有設定 sessionForm=true, 將會試著去找尋 session 內有沒有相關的 form object 的存在
  如果沒有找到,就會觸發 handleInvalidSubmit 這個 method
  出現的情況可能是 reSubmit
  預設的作法是會重新 submit,產生一個新的 form object 再處理
  如果要避免duplicate submissions,那就要自己 Override 這個 method,看是要顯示 "invalid submit" 的訊息,還是呼叫 showNewForm 重設 form object
  
8. 取得 form object 之後,會根據ServletRequestDataBinder來決定要怎樣設定資料
  我想這邊就是反向處理吧,在前面是將特定的資料型態轉換成字串顯示
  這裡可能就是將特定的字串轉換成資料格式吧(我猜的)

9. onBind
  在 bind 與 validation 之間,會呼叫這個 method,可以在這邊在作一些 customer bind 的動作
  
10. 如果 validateOnBinding 有被設定,那麼就會去呼叫被註冊的 validation object

11. 當 validate object 處理完畢,但是又想作一些 custom validate 的動作,可以在 onBindAndValidate 內實作

12. 如果 validate 失敗,就會呼叫 showForm 重新回到 formView 讓使用者重新修改後 submit
  但是如果成功的話,就會到 processFormSubmission,這時候就可以處理這次 request 的動作了
  這個 method 是一定要實作的
  
以上為 AbstractCommandController 的處理流程,如果是繼承 SimpleFormController 就簡單很多
在 processFormSubmission處理完畢之後,僅需要考慮要實作那個 onSubmit method,來決定當回到 successView 前要作的事情
 
原创粉丝点击