在表单提交时未调用JSF valuechangelistener

时间:2012-01-23 18:45:00

标签: 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不会触发。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您需要一个完整的JSF <h:form>组件,而不是纯HTML <form>元素。没有任何<form>method属性的普通HTML action元素会在默认情况下触发当前网址上的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能够知道它必须处理什么视图以及它必须处理什么形式以及它必须调用哪些侦听器和操作。