验证失败时如何访问POST参数

时间:2013-10-31 12:11:19

标签: jsf jsf-2 jsf-2.2

我需要根据一些输入字段显示响应页面。例如。下面的tabid inputHidden:

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

但是当同一表单中的某些其他输入具有验证错误时(例如“name”inputText)。不会分配“controllerBean.tabId”值,因为JSF在验证阶段返回。

我仍然需要tabId来正确显示页面并记住两个想法:

#{param['edit:tabid']}

或使用绑定:

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

我的问题是,这两个中哪一个更好或最佳实践?或者有更好的方法来做到这一点?


更新

请注意。在我的特定情况下,tabid由客户端javascript设置。

  1. 服务器回复html中的一些项目。
  2. Javascript将这些项目放在页面上的不同标签中。
  3. 其中一个选项卡使用表单中的当前tabid将数据POST到服务器。
  4. 所以我的服务器需要知道tabid以显示选择了正确选项卡的响应页面。

3 个答案:

答案 0 :(得分: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();
   }

答案 1 :(得分: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。那就是你想要的。

答案 2 :(得分:0)

实现此目的的另一种非完美方法是将验证逻辑移动到您的操作方法。如果验证失败,您只需停止处理(并添加适用的FacesMessage)。您只需要知道所有模型值都已更新,如有必要,您可以清除它们。

由于更新失败验证的模型值与JSF生命周期相反,我认为任何解决方案都会有点破解。

相关问题