表单提交时未调用JSF valuechangelistener

JSF valuechangelistener not called upon form submission

本文关键字:JSF valuechangelistener 调用 表单提交      更新时间:2023-09-26

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

<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被调用,但没有值或valueChangeListener,我的日志表明它只经历了阶段1和6。如果我没记错的话,除非提交表单,否则2-5阶段不会启动。我做错了什么?

您需要一个完整的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能够知道它必须处理什么视图,必须处理什么表单,以及必须调用什么侦听器和操作。