2013-10-31 63 views
0

我需要根據某些輸入字段顯示響應頁面。例如。在下面tabid inputHidden:驗證失敗時如何訪問POST參數

#{controllerBean.tabId} 
... 
<h:form id="edit"> 
    <h:inputHidden value="#{controllerBean.tabId}" id="tabid" /> 
    <h:inputText value="#{controllerBean.name}" id="name" /> 
</h:form> 

但是當以相同的形式的一些其他輸入具有驗證錯誤(例如「姓名」的inputText)。將不會分配「controllerBean.tabId」值,因爲JSF在驗證階段返回。

我仍然需要tabId正確和具有2個的領悟顯示頁面:

#{param['edit:tabid']} 

或使用綁定:

#{tabId.value} 
<h:inputHidden value="#{controllerBean.tabId}" id="tabid" binding="tabId" /> 

我的問題是,這些2的是更好還是最佳實踐?或者有更好的方法來做到這一點?


更新:

注意。在我的具體情況中,tabid由客戶端javascript設置。

  1. 服務器回覆html中的一些項目。
  2. Javascript將這些項目放在頁面上的不同選項卡上。
  3. 其中一個選項卡將數據發送到服務器,並使用表單中的當前tabid。

所以我的服務器需要知道tabid來顯示選擇了正確選項卡的響應頁面。

+0

但如果你需要它在managedBean但如果驗證錯誤occures託管bean將不會被調用。 – BholaVishwakarma

+0

這不是我的bean需要它,而是我的頁面。具體來說,我的頁面需要tabid才能知道要顯示哪個選項卡 – Kai

+1

您是否有機會使用'@ ViewScoped'?這將允許您在bean中保留當前標籤ID。 –

回答

0
<h:form id="edit"> 
<h:inputHidden value="#{controllerBean.tabId}" id="tabid" /> 
<h:inputText value="#{controllerBean.name}" id="name" > 
    <p:ajax process="tabid" immediate="true" event="keyup" /> 
</h:inputText> 
</h:form> 

上面的代碼會做的是,當用戶把一些值的價值將被處理,並將被設置managedBean。你想要我想的。

+0

感謝您的快速回答。 requestScoped,我認爲ajax的方式不會工作嗎? – Kai

+0

@Kai然後至少使用'@ ViewScoped'。我不會推薦每個keyup使用ajax,它可能是一個文本中每個新字符的請求很多 –

+0

tabid由客戶端javascript指定,並且原始頁面沒有它。所以我認爲視圖範圍也沒有幫助(不使用ajax):(更新與我的具體案例的問題 – Kai

0

完成此操作的另一個非完美方式是將驗證邏輯移至您的操作方法。如果驗證失敗,您只需停止處理(並添加適用的FacesMessage)。你只需要知道所有的模型值將被更新,並且你可以在必要時清除它們。

由於在驗證失敗時更新模型值違背了JSF生命週期,所以我認爲任何解決方案都有些破綻。

1

您可以將lifecycle event listener添加到組件並從中選取值。我要推薦preValidate聽衆:

<h:form id="edit"> 
    <h:inputHidden value="#{controllerBean.tabId}" id="tabid"> 
     <f:event type="preValidate" listener="#{controller.grabTabId}"/> 
    </h:inputHidden> 
    <h:inputText value="#{controllerBean.name}" id="name" /> 
</h:form> 

這將註冊監聽器只請求的驗證階段之前解僱。現在,您必須在您的支持bean定義的監聽器的樣子:

public void grabTabId(ComponentSystemEvent cse){ 
    //obtain a reference to the component 
    HtmlInputHidden hiddenElement = (HtmlInputHidden)cse.getComponent(); 
    //get the value from the component. 
    String hiddenValue = hiddenElement.getValue(); 
    }