2012-01-23 58 views
4

我看了其他类似的帖子,但没有任何帮助。这里是我的代码:JSF valuechangelistener没有调用表单提交

<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不会触发,除非表单被提交。我究竟做错了什么?

回答

3

您需要一个完整的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>将生成具有至少两个JSF特定隐藏输入沿着<form method="post">

所以,如下解决它标识当前表单和视图状态的字段(在修复JSF代码后,检查生成的HTML输出的差异)。 POST请求和两个隐藏字段的组合使JSF知道它必须处理哪些视图,以及需要处理什么样的表单以及它必须调用哪些侦听器和操作。

+0

你是对的,它现在就像你说的那样工作。感谢您提供全面(快速)的答案! – Mark

+0

不客气。 – BalusC