JSF表单提交时valuechangelistener未被调用

3

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

<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阶段只有在提交表单时才会触发。我做错了什么?

1个回答

3
您需要使用一个完整的JSF <h:form>组件,而不是一个简单的HTML <form>元素。没有任何methodaction属性的纯HTML <form>元素默认情况下会在提交时向当前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特定的隐藏输入字段,用于标识当前表单和视图状态(在修复JSF代码后检查生成的HTML输出中的差异)。 POST请求和这两个隐藏字段的组合使JSF知道它必须处理哪个视图,处理哪个表单以及调用哪些监听器和操作。

你说得对,现在它按照你所说的工作了。感谢你全面(并且快速)的回答! - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接