ajax - 不处理条件渲染组件中的表单提交

标签 ajax jsf jsf-2 conditional-rendering

我有一个带有表单的自定义标记文件:

<h:form>
    <h:commandButton value="click">
        <f:ajax event="click" listener="#{bean[method]}" />
    </h:commandButton>
</h:form>

我通过 ajax 有条件地渲染它,如下所示:

<h:panelGroup id="test">
  <h:form>
    <h:commandButton value="click">
      <f:ajax event="click" listener="#{backingTest.updateFlag}" render=":test"/>
    </h:commandButton>
  </h:form>
  <h:panelGroup rendered="#{backingTest.flag}">
    <my:customtag bean="#{backingTest}" method="printMessage"/>
  </h:panelGroup>
</h:panelGroup>

这是关联的支持 bean:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class BackingTest {

    private boolean flag = false;

    public void printMessage() {
        System.out.println("hello");
    }

    public void updateFlag() {
        flag = true;
    }

    public boolean getFlag() {
        return flag;
    }
}

当我单击第一个命令按钮时,会正确调用 updateFlag() 方法,并正确显示第二个命令按钮。但是,当我单击第二个命令按钮时,它永远不会命中 printMessage() 方法。在网络浏览器的 JS 控制台和 HTTP 流量监视器中,我可以看到 click 事件已成功触发,并且 XHR POST 请求已成功发送。

如果我删除 rendered 属性,那么一切都会按预期工作。

这是怎么造成的以及如何解决?我正在使用 Mojarra 2.1.25。

最佳答案

您的具体问题是由两个事实引起的:

  1. 当 JSF 需要解码表单提交操作或提交的输入值时,它还会检查组件是否已呈现(以防止黑客攻击/篡改请求)。
  2. 请求范围的 Bean 会在每个 HTTP 请求上重新创建(一个 ajax 请求也算作一个请求!)。

在您的具体情况下,rendered状况已评估 false而 JSF 需要解码表单提交操作,因此从未处理非渲染的输入/命令组件。

将 bean 放入 View 范围内应该可以修复它。下面的示例假设 JSF 2.x。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped

下面的示例假设 JSF 2.2+ 带有 CDI:

import javax.inject.Named;
import javax.faces.view.ViewScoped;

@Named
@ViewScoped

或者,如果技术要求是将bean保持在请求范围内,则将rendered后面的条件带入 <o:inputHidden> 中的属性。调整您的代码片段以将其包含在 <h:form> 中.

<o:inputHidden value="#{backingTest.flag}" />

另请参阅:

关于ajax - 不处理条件渲染组件中的表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18782503/

相关文章:

javascript - CORS 是执行跨域 AJAX 请求的安全方法吗?

javascript - 如何让 jQuery 实时搜索在 javascript 数组中更准确?

javascript - 返回 AJAX 内容后无法调用用户定义的 JS 函数

JSF 2.0 菜单导航问题

java - 使用 JavaScript 的普通 JSF 应用程序?

java - 如何在不提交的情况下测试数据库中是否存在某个值?

javascript - 在 HTML 元素的边框上制作 Javascript 可调整大小的处理程序

jsf - 使用相同的 JMeter 测试脚本在多个服务器上测试 JSF 应用程序

java - 抛出异常后的 FacesContext 消息

jsf - f :param in JSF的条件渲染