2010-05-24 40 views
3

如果我在表單中有很多輸入控件(每個輸入控件都有獨立的驗證器 - 像所需的,長度等等),還有一個命令按鈕,用於提交表單和調用一個動作方法。要求是 - 雖然輸入控制值是單獨好的 - 這些值的組合應該可以在表單提交後一起處理它們 - 我將代碼放在一起驗證它們的位置?做jsf表單驗證的最佳方法

1)我可以爲命令按鈕添加一個自定義驗證器並驗證組合嗎?像validate(FacesContext arg0, UIComponent arg1, Object value)但即使如此,我不會有除命令按鈕的/組件的值右側的其他輸入控件的值?

2)我可以在操作方法中對組合進行驗證,並使用FacesMessage添加驗證消息嗎?

或者你有什麼建議嗎?

謝謝你的時間。

回答

4

2點已經被Bozho回答。只需使用FacesContext#addMessage()即可。 A null客戶端ID將讓它登陸<h:messages globalOnly="true">。像formId:inputId這樣的固定客戶端ID將讓它登陸<h:message for="inputId">

點1是可行的,你可以抓住其他組件使用UIViewRoot#findComponent()驗證方法中:

UIInput otherInput = (UIInput) context.getViewRoot().findComponent("formId:otherInputId"); 
String value = (String) otherInput.getValue(); 

但是您需要將f:validator最後UIInput組件。將它放在UICommand組件(如按鈕)中將不起作用。

確實,對客戶端ID進行硬編碼是令人討厭的,但這是JSF中一點不靈活的驗證機制的收益。

+0

如何根據第二種方法添加消息後停止執行? – gekrish 2010-05-26 09:00:55

+0

返回到同一頁面。 – BalusC 2010-05-26 11:15:02

3

我已經成功地使用第2個方法:

FacesMessage facesMessage = 
     new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg); 
FacesContext.getCurrentInstance().addMessage(null, facesMessage); 
+0

感謝Bozho。我寧願使用第二種方法。 – gekrish 2010-05-26 09:01:57

4

我剛剛登陸您的帖子後有相同的問題。

文章到目前爲止,我已閱讀識別有四種類型的驗證,用於以下用途:

  1. 內置到組件(訂閱獨立的領域;需要= TRUE,LengthValidator等)
  2. 「支持驗證」添加到支持Bean中的操作(業務邏輯)
  3. 自定義驗證器(訂閱單個字段)
  4. 用作自定義驗證器(訂閱單個字段)的支持Bean中的方法。

參考驗證器:JSF中的驗證機制旨在驗證單個組件。(See S/O Question here)

在要驗證整個窗體作爲字段的邏輯分組的情況下,它似乎與標準JSF/Apache的MyFaces的,最適合做的是爲應用驗證,作爲一套獨立在這一點上,領域承擔集體業務的意義。

BalusC想出了shoehorning表單驗證到附加在最後的表單項單驗證的方式(同樣,見S/O問題here和其他工作例如在他的網站here),但是它不一定是可擴展的/可重用,因爲對錶單ID的引用必須進行硬編碼,因爲您無法附加到validate()方法的簽名。如果你只使用一次表單,你會得到它,但如果它彈出幾次,或者如果你編程生成你的ID,你卡住了。

Seam的JSF實現部分有一個<s:validateForm />控件,它可以將表單中其他位置的字段的ID作爲參數。不幸的是,似乎沒有任何MyFaces/Mojara/Sun JSF實現具有相同的功能,因爲它不是標準的一部分。

+0

+1感謝您的努力和指導... – dakait 2013-01-30 09:20:54

相關問題