我需要根据一些输入字段显示响应页面。例如。下面的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设置。
所以我的服务器需要知道tabid以显示选择了正确选项卡的响应页面。
答案 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生命周期相反,我认为任何解决方案都会有点破解。