0

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

#{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 来正确显示页面并记住两个想法:

#{param['edit:tabid']}

或使用绑定:

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

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


更新:

笔记。在我的具体情况下,tabid 是由客户端 javascript 设置的。

  1. 服务器回复 html 中的一些项目。
  2. Javascript 将这些项目放入页面上的不同选项卡中。
  3. 选项卡之一使用表单中的当前 tabid 将数据发布到服务器。

所以我的服务器需要知道 tabid 以显示选择了正确选项卡的响应页面。

4

3 回答 3

1

您可以向组件添加生命周期事件侦听器并从中选择值。我要推荐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();
   }
于 2013-11-04T19:21:05.533 回答
0

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

由于在验证失败时更新模型值违反了 JSF 生命周期,因此我认为任何解决方案都会有点像 hack。

于 2013-10-31T13:02:58.497 回答
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。这就是你想要的,我想。

于 2013-10-31T12:27:46.567 回答