2011-07-15 84 views
8

我即將開始使用Struts 1.2的e項目。沒有計劃轉移到另一個框架。Struts 1 ActionForms - 表單中日期的約定是什麼?

我想知道在窗體中處理日期時會有什麼約定?

  1. 我應該創建一個日期變量,並創建一個setDate(String date)方法將發生轉換?

  2. 創建日期變量,setDate(Date date)和鏈的某個地方註冊一個特殊的轉換器? (不知道是否有可能)

  3. 創建一個字符串變量setDate(String date)並讓ActionForm bean中的validate方法轉換/驗證?

還是別的辦法?

另外,如果您有任何意見得到了這個框架,加快,我真的很感激它。

回答

16

之前我對你的問題作出迴應,讓我說這句話的開始:人們不明白的ActionForm或者什麼的ActionForm不

ActionForm表示用戶填入HTML表單中的數據。 Struts讀取請求參數,並通過名稱與提交的目標Action的已配置ActionForm進行匹配。它是用戶輸入的數據,簡單明瞭。

請求中出現的數據總是類型java.lang.String。但是人們可能會有一個名爲「年齡」的表單字段,這是他們的模型數據中的一個int。或者,也許不是「年齡」,他們有一個「birthDate」,在他們的模型數據中偏離了java.util.Date。所以他們認爲在ActionForm中放置int和Date類型是一個好主意,並允許Struts將按請求到達的字符串轉換爲ints和Dates。

它是一種非常有用的轉換,你作爲一個開發人員不必處理它,Struts的一樣。這是一點框架魔法。

但這並不是讓哈利波特嚇壞了! 轉換可能會在整數和日期上失敗。爲什麼?

int是一個原始類型,因此它必須始終有一個值。默認初始化爲零。在執行綁定時(對ActionForm對象屬性的請求參數),Struts在ActionForm上看到一個int類型,並嘗試將請求字符串值轉換爲int。

如果用戶插入字符串「5」,該字段設置爲5,這很好!

但是如果用戶插入「bla」會怎麼樣?我們會得到一個例外嗎?不!我們得到零值,因爲轉換(無聲)失敗。 Ups!

日期又是一個問題。爲什麼?因爲它們的值按照字符串的要求到達。他們的格式可能很簡單,比如「12/01/2011」,這些信息完全沒用。爲什麼?因爲表示爲字符串的日期必須與Locale齊頭並進以便轉換爲它所表示的正確的Date實例。

"12/01/2011" + Locale.US = 01 December 2011 
"12/01/2011" + Locale.FRENCH = 12 January 2011 

Ups!

好的,所以這是介紹! 現在我們來看你的問題

  1. 應創建一個日期變量,並創建一個的setDate(字符串日期)方法,其中將發生轉換。

在某些時候,你必須將日期發送回視圖和Struts html tags通常會去一個getDate()返回字符串。如果getter返回Date(Struts將對getter值執行toString()),則用戶輸入的「12/01/2011」可能會顯示爲「2011年1月12日00:00:00」。所以你實際上需要Date域和Date類型的setter/getter和String類型的setter/getter。在Action類中使用Date類型,並使用String與視圖標籤進行交互。

有問題?你如何處理ActionForm中正確的Locale值?

  • 創建日期變量,一個的setDate(日期爲準),並在鏈的某個地方註冊一個特殊的轉換器(不知道這是否是可能的)
  • It is possible。您可以創建並註冊一個自定義轉換器,它可能會將日期的字符串表示形式轉換爲日期。如果您使用ISO 8601格式,我認爲您會安全。

    有問題?您是否可以在不破壞通過使用各種格式或區域設置將字符串轉換爲日期的代碼的情況下將其納入現有應用程序?

  • 在ActionForm Bean的創建字符串變量,一個的setDate(字符串日期),並讓轉換/驗證到validate方法
  • 這韓元沒有工作。在ActionForm對象的參數綁定之後調用validate方法。當你達到這一點時已經遲到了。 Struts做了轉換。如果您有一個int值爲零的字段,則無法知道用戶是否實際插入了零和轉換工作,或者用戶是否插入了「bla」,並且轉換失敗,並且您的默認初始值爲零。如果你的應用程序的零值是一個有效的值,那麼你會遇到更大的麻煩。

    那麼約定是什麼?

    沒有約定。根據您的情況使用以上信息並應用常識。

    理想情況下,您應該將ActionForm中的所有屬性設置爲Strings,以便在綁定過程中不會丟失任何信息。但是這涉及在使用它們之前手動將屬性轉換爲Action類中的正確類型。你有完全的控制權(Struts不再進行轉換,因爲源和目標值的類型是String),但是你也有很多的鍋爐代碼要寫,以適當的方式做到某些時候會變得煩人。

    P.S.在結束這個並且去睡覺之前(我的國家的時間是凌晨1點:D)我只想提一個人們經常看不到的東西。 ActionForm不是模型的一部分,它也不應該直接與模型交互。

    如果您需要ActionForm中的數據在模型中進行處理,則將其映射爲與Model DTO(數據傳輸對象)的一對一關係。如果你不這樣做,那麼你在Model和Struts框架之間建立了緊密的耦合,因爲你的ActionForm對象不是POJO。您的課程必須從我們一直在討論的Struts擴展ActionForm類。人們不這樣做並直接將ActionForm發送給模型。更糟糕的是,他們也使用validate方法來執行業務驗證,而不是基本驗證,例如「是必需的」,「有價值的範圍」等。

    ActionForms只是Action(控制器)和視圖。像這樣對待它。