2010-03-19 252 views
14

當面對在JSF2應用程序中驗證屬性的問題時,有兩種主要方法。Bean驗證VS JSF驗證

使用註釋

@ManagedBean 
public class MyBean { 
    @Size(max=8) 
    private String s; 

    // Getters setters and other stuff. 
} 

或宣佈其JSF頁面上定義的ManagedBean驗證:

<h:inputText value="#{myBean.s}"> 
    <f:validateLength maximum="8"/> 
</h:inputText> 

它發生,我不能決定他們沒有。第一個是很好的,因爲它從jsf頁面中刪除了一些代碼(這總是很好,因爲這些頁面根據定義並不是很友好),但是更難以在檢查jsf文件時一目瞭然地看到頁面發生了什麼。

你認爲哪一個更清晰?更好?更好?

回答

17

我將在ManagedBean上進行驗證,這會從JSF VIEW模型視圖控制器中刪除邏輯。並且應該讓JSF負責顯示模型。 在託管bean上也有這個確保了應用更新驗證的地方。這是更幹(不要重複自己)。

+1

仍然在你的GUI重複大多數情況下,例如將最大長度或大小或任何其他visal值限制爲驗證中使用的相同值。 – djmj 2013-01-31 10:57:35

+0

@David Waters,都是bean驗證和jsf驗證發生在相同的生命週期或不同的生命週期中,我的意思是jsf驗證發生在bean驗證之前?並且jsf驗證發生在客戶端? – 2013-06-30 15:53:23

+0

@MahmoudSaleh - 嗨馬哈茂德,我可以建議問你的問題不是一個問題,你會得到一個更好的反應,並從更廣泛的人的答案。 – 2013-06-30 21:13:24

3

Richfaces允許您一起使用它們。請參閱<rich:graphValidator>(和beanValidator)。

這些標籤說:「應用基於javax.validation(或Hibernate驗證程序)規則的JSF驗證」。

+0

都是bean驗證和jsf驗證發生在相同的生命週期或不同的生命週期,我的意思是jsf驗證發生在bean驗證之前?並且jsf驗證發生在客戶端? – 2013-06-30 15:54:56

4

managedBean方法還有另一個優點。如果JSF顯示的信息也可以通過Web服務(WS)獲得,那麼可以將實際驗證代碼分解爲驗證類,並用於JSF和WS,以確保系統中的所有信息都是有效的。

0

我可能更喜歡JSF驗證,因爲我無法提供資源包錯誤消息作爲bean驗證的一部分。例如,你不能這樣做

@NotNull(message = ResourceBundleHelper.getString("error_message")) 

因爲「編譯常量只能是原語和字符串」。有解決常量消息的工作,但看起來很醜。

1

@ user1730904,您可以按照Bean驗證規範文檔中的說明在資源包文件中定義消息。所需的步驟很簡單:

  1. 創建一些類路徑的文件夾(例如src/main/resources/)命名ValidationMessages_xx_XX.properties文件。其中xx_XXes_ESen_US等凡內容可能是: field.message=The number of digits must be less or equal than {max}.
  2. 然後使用bean屬性註釋中的值: @Size(max = 20, message="{field.message}")