java - 提交表单时未调用 JSF valuechangelistener

标签 java javascript jsf

我查看了其他类似的帖子,但没有任何帮助。这是我的代码:

<script  type="text/javascript">
function submit1()
{
document.forms["form"].submit();
}
</script>

<form name="form">
    <h:selectOneMenu value="#{bean.categorySelected}" onchange="submit1()"
valueChangeListener="#{bean.changeCategory}">
    <f:selectItem itemLabel="Select a Category" itemValue="null" />
    <f:selectItems value="#{bean.items}" />
</h:selectOneMenu>
</form>

当我从下拉列表中选择时,它只会重新加载组件。这意味着调用了 bean.getItems,但没有调用 value 或 valueChangeListener,我的日志表明它只经历了第 1 阶段和第 6 阶段。如果我没记错的话,除非提交表单,否则不会触发第 2-5 阶段。我做错了什么?

最佳答案

你需要一个完全有值(value)的 JSF <h:form>组件而不是纯 HTML <form>元素。纯 HTML <form>没有任何元素 methodaction属性在默认情况下在当前 URL 上提交 GET 请求时触发。这完全证实了您所看到的行为。这就像您只是通过 F5 刷新当前请求的页面。

因此,按如下方式修复它:

<h:form>
    <h:selectOneMenu value="#{bean.categorySelected}" onchange="this.form.submit()" valueChangeListener="#{bean.changeCategory}">
        <f:selectItem itemLabel="Select a Category" itemValue="null" />
        <f:selectItems value="#{bean.items}" />
    </h:selectOneMenu>
</h:form>

(注意额外的JS函数是不必要的)

<h:form>将生成 <form method="post">以及至少两个 JSF 特定的隐藏输入字段,用于标识当前表单和 View 状态(在修复 JSF 代码后检查生成的 HTML 输出中的差异)。 POST 请求和两个隐藏字段的组合使 JSF 知道它必须处理什么 View 、它必须处理什么表单以及它必须调用什么监听器和操作。

关于java - 提交表单时未调用 JSF valuechangelistener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8976899/

相关文章:

javascript - 如何使用jquery在子菜单下动态添加子菜单?

NetBeans 8.2 中的 JSF 2.3 支持(f :importConstants, f :websocket, 等)

css - JSF 和 css 不工作

java - 减少执行时间

Java Regex - 电话号码验证

javascript - 导出类导入对象

用于增强参数化构建的 Javascript

jsf - javax.faces.FacesException : Target model Type is no a Collection or Array

java - 解析json文件的面向对象设计模式

java - 对象的数组列表只是创建对同一对象java的引用