2013-01-23 102 views
3

我有這個小小的表單,並試圖理解在JSF驗證中使用ajax。這是表格。 (該支持Bean只是一個簡單的bean有兩個變量firstName和lastName。)JSF ajax驗證vs「正常」驗證

<h:form> 
    <h:outputLabel for="firstName" value="First Name: " /> 
    <h:inputText id="firstName" value="#{userBean.firstName}"> 
     <f:validateLength minimum="5" /> 
     <f:ajax event="keyup" render="firstNameMsg" /> 
    </h:inputText> 
    <h:message id="firstNameMsg" for="firstName" style="color: red" /> 
    <br /> 
    <h:outputLabel for="lastName" value="Last Name: " /> 
    <h:inputText id="lastName" value="#{userBean.lastName}"> 
     <f:validateLength minimum="5" /> 
     <f:ajax event="keyup" render="lastNameMsg" /> 
    </h:inputText> 
    <h:message id="lastNameMsg" for="lastName" style="color: red" /> 
    <br /> 
    <h:commandButton value="Submit"> 
     <f:ajax execute="firstName lastName" render=":greeting" /> 
    </h:commandButton> 
    <br /> 
</h:form> 
<h:outputText id="greeting" value="#{userBean.greeting}" /> 

我已經AJAX連接到我的按鈕,這使得與在提交這是很好的姓氏和名字的outputText標籤。我的問題是爲什麼我需要使用f:ajax標記f:validateLength標記來驗證這兩個字段?我的理解是,ajax執行所有生命週期階段直到渲染響應階段,即它包含驗證。無論是來自ajax請求還是常規提交/操作請求,驗證階段是否不會使用消息呈現頁面?如果我刪除附加到輸入字段的ajax標籤,驗證消息不會顯示出來,但是如果我完全刪除ajax並僅使用commandButtons操作事件的常規提交,就會顯示驗證消息。

謝謝, 艾倫

回答

7

這是因爲在僅方式(whihout任何客戶端腳本處理),以值提交給服務器正常請求處理是通過發送整個表格。當您刪除所有<f:ajax>時會發生這種情況。只有在輸入字段中輸入,纔有可能從服務器獲得響應(在這種情況下爲您的驗證消息)。

當您刪除<f:ajax>從元器件firstNamelastName和它說,它會執行firstNamelastName,這些字段做服務器端驗證,但因爲導致它會使僅:greeting組件只留下這最後一個與<h:commandButton>然後。要解決它,你可以添加到您的<h:commandButton>這樣的:

<f:ajax execute="firstName lastName" render=":greeting firstNameMsg lastNameMsg"/> 

但現在當您提交表單,而不是當你輸入輸入字段鍵這些郵件纔會顯示。

爲了得到一些總結:使用AJAX,您必須指定在發送請求後確切地顯示哪些組件(以及它的所有子組件)。

順便說一下,在輸入字段中發送用戶鍵入的每個鍵的服務器請求並不是一個好主意。更好地使用JavaScript或其他客戶端技術來做到這一點,並在服務器上只驗證整個,最終的價值。

我希望我的解釋能幫到你。

+0

謝謝你的工作。是的,我知道keyup事件不是一個好主意,我只是想要一個與AJAX一起工作的東西,你的解決方案更好。乾杯 –