2010-06-01 29 views
5

我正在開發一個JSF應用程序,我有許多用戶表單,我使用JSF驗證。 我有一個令我煩惱的問題,用一個例子來說明會更容易。如何在JSF中清除h:message或rich:message值?

    <h:panelGroup> 
        <h:selectOneRadio id="gender" value="#{registrationController.person.gender}" 
             required="true" requiredMessage="#{msg.commonErrorBlankField}"> 
         <f:selectItems value="#{registrationController.genders}" /> 
        </h:selectOneRadio> 
        <rich:spacer /> 
        <rich:message for="gender" errorLabelClass="errorLabel"> 
         <f:facet name="errorMarker"> 
          <h:graphicImage value="#{msg.imageExclamation}" /> 
         </f:facet> 
        </rich:message> 
       </h:panelGroup> 

如果未選擇收音機選項,則會顯示所需的信息。當用戶做出選擇時,我會看到驗證錯誤解決方案。很公平 ! 我的問題是,當用戶導航到下一頁,然後通過使用瀏覽器的返回按鈕再次回到這個頁面,我可以看到我的性別字段相應地被選中,但驗證錯誤仍然顯示。

有沒有人知道是否有一個解決方法來清除h:消息字段,一旦我點擊命令按鈕,所以當我回到同一頁面時不會顯示驗證錯誤?

回答

1

不知道這是否有效。我沒有測試它:

//idComponent is the Component whose message you want to clear, e.g. gender 
void clearMessageForComponent (final String idComponent) { 
     if (idComponent != null) { 
      Iterator<FacesMessage> it = FacesContext.getCurrentInstance().getMessages(idComponent); 
      while(it.hasNext()){ 
       ((FacesMessage)it.next()).setDetail(""); 
      } 
     } 
    } 
0

清除從FacesContext中的消息不會解決你的問題,因爲這隻會影響您的應用程序的服務器端的狀態。按下瀏覽器後退按鈕將強制客戶端瀏覽器從本地瀏覽器緩存重新加載頁面。

瞭解瀏覽器後退按鈕不會觸發對服務器的請求很重要。

1

理解瀏覽器後退按鈕不會觸發對服務器的請求很重要。

這是不完全正確的,現代瀏覽器確實觸發了一個請求,如果數據發佈在導航的前幾個階段。