Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 验证失败时如何访问POST参数_Jsf_Jsf 2_Jsf 2.2 - Fatal编程技术网

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

Jsf 验证失败时如何访问POST参数,jsf,jsf-2,jsf-2.2,Jsf,Jsf 2,Jsf 2.2,我需要根据一些输入字段显示响应页面。例如,下面的“授权”选项卡: #{controllerBean.tabId} ... <h:form id="edit"> <h:inputHidden value="#{controllerBean.tabId}" id="tabid" /> <h:inputText value="#{controllerBean.name}" id="name" /> </h:form> 或使用绑定: #{tabI

我需要根据一些输入字段显示响应页面。例如,下面的“授权”选项卡:

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

#{tabId.value}
<h:inputHidden value="#{controllerBean.tabId}" id="tabid" binding="tabId" />
#{tabId.value}
我的问题是,这两种做法中哪一种更好或最好?还是有更好的方法


更新:

注意。在我的特定案例中,tabid由客户端javascript设置

  • 服务器回复html中的一些项目
  • Javascript将这些项目放入页面上的不同选项卡中
  • 其中一个选项卡使用表单中的当前选项卡ID将数据发布到服务器
  • 因此,我的服务器需要知道选项卡ID以显示选择了正确选项卡的响应页面。

    
    
    <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。我想这就是你想要的。

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

    由于在验证失败时更新模型值与JSF生命周期背道而驰,我认为任何解决方案都有点像黑客。

    您可以向组件添加一个新的组件并从中选择值。我将推荐
    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>
    

    但是在managedBean中哪里需要它,但是如果发生验证错误,您的managedBean将不会被调用。需要它的不是我的bean,而是我的页面。具体来说,我的页面需要tabid来知道要显示哪个选项卡您是否有机会使用
    @ViewScoped
    ?这将允许您在bean中保留当前选项卡id。该选项卡id由客户端javascript指定,因此原始页面没有它。我认为视图范围也没有帮助(不使用ajax):(用我的具体案例更新了问题。你是否需要
    tabId
    在bean中用于其他目的?或者你是否只有一个属性+getter+setter在bean中其他地方没有使用,例如操作?谢谢你的快速回答。我的controllerBean是requestScope,我认为ajax方式不起作用?@Kai然后使用
    @ViewScoped
    至少是这样。我不建议每个键都使用ajax,文本中每个新字符可能会有很多请求。tabid由客户端javascript指定,而原始页面没有。因此我认为视图范围也没有帮助(不使用ajax):(根据我的具体情况更新了问题。)
     <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>
    
       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();
       }