【问题标题】:JSF valuechangelistener not called upon form submission表单提交时未调用 JSF valuechangelistener
【发布时间】:2012-02-17 02:43:13
【问题描述】:

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

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

【问题讨论】:

    标签: java javascript jsf


    【解决方案1】:

    您需要一个完整的 JSF &lt;h:form&gt; 组件,而不是一个普通的 HTML &lt;form&gt; 元素。没有任何 methodaction 属性的纯 HTML &lt;form&gt; 元素会在默认情况下在当前 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功能)

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

    【讨论】:

    • 你是对的,它现在像你说的那样工作。感谢您提供全面(快速)的答案!
    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多