JSF生命周期&x2013;选择一个菜单
我有一种行为,我不理解selectonemenu。我会试着解释,想知道是否有人知道发生了什么。我将JSF2与glassfish3一起使用。 我的xhtml代码如下:JSF生命周期&x2013;选择一个菜单,jsf,lifecycle,Jsf,Lifecycle,我有一种行为,我不理解selectonemenu。我会试着解释,想知道是否有人知道发生了什么。我将JSF2与glassfish3一起使用。 我的xhtml代码如下: <h:selectOneMenu binding="#{cetBacking1.menuFamilies}" valueChangeListener="#{cetBacking1.listenerFamilia}" onchange="this.form
<h:selectOneMenu binding="#{cetBacking1.menuFamilies}"
valueChangeListener="#{cetBacking1.listenerFamilia}"
onchange="this.form.submit()">
<f:selectItems value="#{cetBacking1.ompleFamiliesTemplate()}"></f:selectItems>
</h:selectOneMenu>
<h:commandButton value="Test" type="submit" action="#{cetBacking1.test()}"> </h:commandButton>
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.listenerFamilia: 1
INFO: cetBacking1.listenerFamilia: 1
INFO: cetBacking1.listenerFamilia: 1
INFO: cetBacking1.listenerFamilia: 1
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
调用bean的{}函数,它调用cetBacking1.ompleFamiliesTemplate,第二个cetBacking1.ompleFamiliesTemplate由f:selectItems调用。它按预期工作。现在我更改SelectOne菜单的值,并在日志中显示:
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
对cetBacking1.ompleFamiliesTemplate的最后一次调用我认为是由f:selectItems调用的。但我不知道为什么一开始会调用两次cetBacking1.ompleFamiliesTemplate,然后调用两次listener cetBacking1.listenerFamilia。
但下一个对我来说更令人惊奇。我再次更改SelectOne菜单,并在日志中显示:
信息:cetBacking1.ompleFamiliesTemplate!!!!!!
信息:cetBacking1.ompleFamiliesTemplate!!!!!!
信息:cetBacking1.李斯特家族:3
信息:cetBacking1.李斯特家族:3
信息:cetBacking1.李斯特家族:3
信息:cetBacking1.ompleFamiliesTemplate
与以前一样,cetBacking1.ompleFamiliesTemplate在开始时会被调用两次,但侦听器会被调用三次。每次我更改SelectOne菜单时,侦听器都会被再次调用。如果我将selectOneMenu值更改两次,则日志如下所示:
<h:selectOneMenu binding="#{cetBacking1.menuFamilies}"
valueChangeListener="#{cetBacking1.listenerFamilia}"
onchange="this.form.submit()">
<f:selectItems value="#{cetBacking1.ompleFamiliesTemplate()}"></f:selectItems>
</h:selectOneMenu>
<h:commandButton value="Test" type="submit" action="#{cetBacking1.test()}"> </h:commandButton>
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.listenerFamilia: 1
INFO: cetBacking1.listenerFamilia: 1
INFO: cetBacking1.listenerFamilia: 1
INFO: cetBacking1.listenerFamilia: 1
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.listenerFamilia: 2
INFO: cetBacking1.ompleFamiliesTemplate !!!!!!
问题是为什么在执行侦听器之前,当我更改selectOneMenu值时,会调用两次cetBacking1.ompleFamiliesTemplate。以及为什么监听器在我第一次更改selectOneMenu值时执行两次,然后每次更改该值时执行一次
在JSF中,可以在一个请求中多次调用getter。这里有一个很好的答案:一个月前,我也有同样的问题。 解决方案是SessionScope和binding不兼容 您必须删除jsf页面中的绑定,一切正常。
要填充SelectCombo,您可以使用
列表
中的项目。正如Jeremiah所回答的,您的具体问题是您使用了getter方法来处理业务逻辑。这是错误的。如果您使用的是JSF2.x,请不要过多地关注JSF1.x目标书籍/资源。无论您想要实现什么,都可以通过
轻松完成。