2011-09-05 54 views
2

更新:現在更新一次。我想我以前的分析是錯誤的,因爲我現在已經能夠爲此創建一個例子。它似乎與複合組件和insertChildren標記有關。cc:insertChildren內的UIInput值在驗證失敗後不會重新顯示

這是我的facelet:

<?xml version='1.0' encoding='UTF-8' ?> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:form="http://java.sun.com/jsf/composite/composite/form" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head> 

<h:body> 
     <h:form> 
     <form:workspace> 

      <h:inputText id="email" value="#{user.email}" size="45" 
       required="true" requiredMessage="Required"> 
       <f:validateRegex pattern="([^[email protected]]+)(\.[^[email protected]]+)*@([^[email protected]]+\.)+([^[email protected]]+)" /> 
      </h:inputText> 
      <h:message for="email" /> 
      <br /> 
      <h:commandButton action="#{user.update}" value="Update"/> 

     </form:workspace> 
     </h:form> 
</h:body> 
</html> 

形式:工作空間複合分量被定義爲如下:

<?xml version='1.0' encoding='UTF-8' ?> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:cc="http://java.sun.com/jsf/composite"> 

<cc:interface> 
</cc:interface> 

<cc:implementation> 
    <cc:insertChildren/> 
</cc:implementation> 
</html> 

#{user}變量指的是微不足道的豆只需字段稱爲電子郵件和getter和setter。更新方法什麼都不做。

我得到的行爲如下所述。當我輸入一個無效值時,它將恢復到它存儲在bean中的值。如果我通過form:workspace組件刪除包裝,它就像我期望的那樣工作 - 值不會被還原。 JSF的錯誤?


我有一個JSF窗體,有許多輸入組件。其中一些有驗證者附在他們身上。例如,一個簡單的是電子郵件地址,這是強制性的:

<h:inputText id="email" value="#{profile.user.email}" size="45" 
    required="true" requiredMessage="Required"> 

現在,我們已經收到了這是無效的領域應該保持提交的值在他們的要求,所以用戶不必爲簡單的拼寫錯誤重新輸入大量文本。這對我來說似乎很合理,我甚至認爲這是驗證的默認行爲。但它似乎並不是 - 價值恢復到之前的水平(當它仍然有效時)。

問題是,我什至不能找到什麼行爲應該是一個參考。我在某處讀到它是驗證後顯示的UIInput的本地值。檢查UIInput的代碼告訴我,如果驗證失敗,則故意不設置本地值。但是這似乎並不是全部真相,因爲所有輸入字段都被還原 - 不僅僅是驗證失敗的字段!所以看起來更像是它再次從模型中獲取值。

無論如何,有沒有辦法繞過這種行爲?

我正在使用JSF 2.0.4-b09。我覺得我失去了一些明顯的東西。

編輯:我將電子郵件驗證器更改爲下面發佈的正則表達式BalusC,並且我仍然得到相同的行爲。我張貼了說明問題的圖片。圖像的上半部分顯示了表單的初始狀態。然後中間的部分顯示我改變了字段「名字」,「姓氏」和「電子郵件」。底部顯示了我點擊保存按鈕後的結果。如您所見,電子郵件字段已恢復。不僅如此,名字和姓氏字段也被還原。

Problem illustrated in three steps.

+0

可能的重複:http://stackoverflow.com/questions/1953350/jsf-validation-error-lost-value –

+0

@Zenzen:我沒有重複那個,但它似乎專門針對h:inputHidden。 – waxwing

回答

4

有一些混亂回事。當提交的值爲時爲空(即,用戶移除了初始值或者什麼都不輸入),該值僅恢復爲初始值。我不確定如何重新鍵入整個文本的問題與此相關,因爲實際上沒有輸入任何內容。

當提交的值爲空或null時,JSF將重新顯示模型值,否則它將重新顯示提交的值,完全如您所期望的那樣。這是在JSF規範中指定的。要親自查看,請添加例如

<f:validateRegex pattern="([^[email protected]]+)(\\.[^[email protected]]+)*@([^[email protected]]+\\.)+([^[email protected]]+)" /> 

到電子郵件輸入字段。您會看到,如果電子郵件格式無效,則會保留任何非空(!)提交的值。


更新:根據您的更新事實證明,您的輸入組件實際上是被<cc:insertChildren>渲染。這種行爲確實是莫哈拉的一個錯誤。見issue 1991。如問題單中所述,解決方法是將<cc:insertChildren />置於<h:panelGroup><ui:fragment>之內。

<cc:implementation> 
    <ui:fragment>   
     <cc:insertChildren/>   
    </ui:fragment> 
</cc:implementation> 

MyFaces 2.1.1沒有這個bug,它在那裏工作正常。

+0

我很確定空值也被保留(required =「true」驗證)。只有當提交的值爲空時,纔會重新讀取模型值。 – Andrey

+0

然後,我的配置確實有問題。我添加了一個截圖來說明問題。我用你的正則表達式驗證器得到相同的行爲/問題。往上看。 – waxwing

+0

@Andrey:啊對了,我有一個'javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL'上下文參數設置爲'true'。 @Waxwing:有趣的是,你使用ajax嗎?什麼組件庫?也許它是重新渲染零件的過度熱情?你能展示最低的視圖代碼嗎? – BalusC

0

也許你有一些代碼,做panelGroup裏面輸入組件明確提交值(例如panelGroup具有特定id,或代碼做更多的通用分析查找用於panelGroups內部形式)。

試圖通過項目源代碼做全文搜索setSubmittedValue電話。

+0

搜索返回無匹配項。我們嘗試儘可能少地直接與JSF組件樹進行交互。更具體地說:我可以在模型類中放置一個斷點,並實際看到它在渲染階段重新讀取模型中的值。 – waxwing

相關問題