2009-04-09 51 views
4

Spring的窗體控制器(如SimpleFormControllerBaseCommandController)使用命令在HTML窗體和控制器之間傳遞數據。我的問題是,將支持模型用作命令本身是否常見?或者,通常使用與支持模型中的屬性相對應的屬性創建單獨的命令。Spring窗體命令的含義

我的問題是,使用支持模型作爲命令,屬性編輯器是必要的轉換非字符串屬性。設想一個包含許多非字符串強類型自定義字段類型的數據模型。在表單提交時,屬性編輯器在調用驗證器之前執行轉換。如果類型轉換不可能(用戶輸入錯誤),則驗證程序永遠不會有機會提供詳細的錯誤消息。 HTML表單上顯示的所有內容都是一般性錯誤消息。看我的related Stackoverflow question

另一種方法是創建一個單獨的命令,它將備份模型中的每個字段作爲字符串進行復制。通過這種方式驗證器可以驗證每個字段的字符串表示形式。控制器的onSubmit然後負責將基於文本的命令轉換爲支持模型。從我對春季的研究中,這似乎是預期的用法。我沿着這條路走下去的猶豫是繁瑣的方式,需要爲每個數據模型創建一個單獨的命令。然後,需要在命令和數據模型之間進行編組的額外工作。讓表單直接編輯支持模型並使用屬性編輯器進行轉換更方便。那麼問題就是驗證。

所以我很好奇他人如何解決包含自定義類型非字符串字段的模型的基於表單的編輯問題。

回答

3

我建議你看看Spring binding and validation API。將表單元素綁定到服務層需要的對象中並讓控制器傳遞它們。

我的選擇是直接綁定到業務對象,而不是僅僅爲Web層創建DTO。我不喜歡平行層次結構。

2

恕我直言,這歸結爲你想如何設計你的域類。我更喜歡設計'em qiute,因爲它甚至不允許設置不合適的值等。這與Spring處理綁定和驗證的方式並沒有很好的結合。

因爲我想避免弱化我的領域模型,所以我傾向於使用DTO作爲命令對象,因爲通常情況下,演示文稿會在領域對象上獲得稍微不同的視圖。典型的例子是一個帶有密碼的用戶域類。在表示層中,您通常希望讓實際用戶輸入密碼兩次,並在驗證步驟中比較這些值。只有它們正確匹配,數據纔會綁定到域類。

可能會引入一些開銷,但允許將視圖中的域/應用程序層完全分開。