2014-03-28 64 views
0

我是Spring的新手,之前我曾在PHP和Python工作過。我在理解Spring表單如何工作和驗證方面存在一些問題。到目前爲止,我的理解是,當您使用表單時,您的表單由一個bean支持,這意味着您必須向JSP提供一個bean。您也可以使用站點HTML表單,但您必須手動檢索控制器中的請求參數。Spring Forms和Validation的問題

這裏是我遇到的問題。我有一個使用Hibernate Validator的User bean,並且爲用戶添加,編輯頁面。問題是我不希望密碼字段出現在編輯頁面上,密碼因爲使用了BCrypt而會變成垃圾。但是,當提交表單時,驗證失敗,因爲它期望密碼存在。反正用Spring Form做部分bean實現似乎沒有。

我想如果可能的話,因爲它減少了重複的驗證代碼使用Spring的形式,和它總是很高興與對象一起工作。我現在的想法是創建一箇中間對象,然後將數據從該對象轉換爲我的bean。看起來很乏味,可以導致創建許多對象的方式。我的另一個想法是隻使用簡單的舊HTML表單並自己拉參數並在對象中設置值。

我不知道什麼是最好的辦法,或者如果我甚至在正確的軌道上的思考。 Spring Forms和驗證提供看起來很棒,但似乎不是特別靈活。就像我說的,我是Spring的新手,所以我可能會錯過某些東西或不理解。

另一個問題,我一直在摔跤是有需要的形式在多個對象。比方說,我有一個用戶bean,它具有以下屬性。

私人角色角色; 私人國家國家;

所以我需要通過用戶,列表和列表我的JSP。我可以讓它們顯示正常,但是如果表單驗證在返回到該頁面時失敗,則我將失去我的角色和國家/地區對象,除非在返回視圖名稱之前將它們重新添加到模型中。我在這裏錯過了什麼或者是規範嗎?這是一個請求對象,所以我認爲這是有道理的,但每次都必須重新添加它們似乎很繁瑣。

回答

1

我的理解到目前爲止,當你使用你的表格是 支持一個bean,這意味着你必須提供一個bean到JSP。

我想說的主要是真實的。表單由bean支持,但Spring JSTL標籤知道如何根據set modelAttribute獲取bean。這個bean生活在你將會考慮的「頁面」範圍內,除非你添加了將你的模型屬性設置爲會話。無論哪種方式,如果您使用的是Spring JSTL標籤,他們會去一個或另一個地方來獲取它。

您也可以使用支架HTML表單,但您必須手動 檢索控制器中的請求參數。

不正確。你可以「模擬」Spring JSTL標籤正在做的事情。瞭解JSTL標籤非常像宏。它們只是將一些預先確定的代碼塊複製到輸出中,並帶有一些非常基本的條件語句。 Spring MVC需要連接控制器端的模型屬性的關鍵是namevalue,它們很容易破譯這些如何生成/連接在一起。

但是,當提交表單時,驗證失敗,因爲它期望 密碼存在。

可以創建一個「DTO」或「數據傳輸對象」,這基本上是一箇中間人從UI採用的值,並且被轉換在控制器/服務層對真實模型對象後端。或者,如果您像我一樣懶惰,請將用戶放在會話範圍內,在這種情況下,您不必發佈該值,因爲Spring將會將該值帶出會話,並且只更新了您發佈的一個或兩個字段。不要發佈密碼,Spring不會設置密碼。

我的想法現在做我創建一箇中間對象,然後從 的數據轉化爲我的豆。

是的,這是我提到的DTO。你只需要在需要的地方做。

我不確定什麼是最好的方法,或者我甚至想在 正確的軌道上。

可能有成千上萬的方式編碼做任何事,多了一些正確或錯誤比別人。我知道一些設計開發人員 - 納粹的,並會說你應該總是這樣或那樣做,但我不是那些人之一。我認爲,只要你是一貫的,而且你沒有完全做到頭腦發熱,你就走在正確的軌道上。我對編寫的所有代碼的關注是可維護性。我

  1. 不想花20小時想重新學習我做什麼6mo前,所以我傾向於選擇更簡單的選擇
  2. 恨重複的代碼,所以我傾向於選擇更多的模塊設計
  3. 討厭不得不花20小時想重新學習我做什麼6mo前,所以往往大量使用的JavaDoc和評論,我找到的代碼是棘手的(大量的循環,這樣做很奇怪,等)

我一直在摔跤的另一個問題是有多在窗體上需要多個對象 。

有幾種方法可以解決這個問題。我從來沒有使用它,但實際上可以有多個與同一個窗體和控制器處理程序關聯的模型屬性。我想你使用了一個<spring:bind>標籤或其他東西。我看過周圍的樣本,所以如果你認爲你需要Google的話。

我的方法通常是將任何東西放在會議中或建立一個DTO來容納我需要的所有東西。首先,我更多地使用列表來驅動構建視圖,例如,如果我從表格中刪除了某些國家/地區,我會有一份列入會議的國家名單,並從那裏使用它們,這樣我就只會追趕他們一次並完成任務。

當我需要一次性更改所有事物時,我使用DTO方法(有些人可能稱之爲Form Bean),但事情不一定是直接連接的。只需指出:您可以在模型屬性中嵌套對象,並在Spring JSTL標籤中使用它們。您也可以在模型屬性中包含集合(列表,集合,映射)並獲得這些集合,儘管Spring並沒有很好地處理嵌套集合。

希望有所幫助。

+0

哇,很好的回答,謝謝你的解釋。這有助於我指出正確的方向。我會研究DTO概念。再次感謝您抽出寶貴的時間來解答您的問題! – greyfox