当我在URI中调用一个带有param的页面中的方法时,除非我再次传递uri的参数,否则不会调用该方法。例如,如果我有:
http://maywebsite/myapp/mypage.xhtml?mykey=myvalue
此方法导致错误(显然是因为它在没有params的情况下再次呈现页面,但永远不会调用方法foo):
<h:commandLink value="Do Action" actionListener="#{mybean.foo}"/>
所以我添加了一个ajax只更新组件,但按钮没有被触发:
<h:commandLink value="Do Action" actionListener="#{mybean.foo}">
<f:ajax render="somecomponent"/>
</h:commandLink>
当我再次传递param值时,按钮调用方法就好了:
<h:commandLink value="Do Action" actionListener="#{mybean.foo}">
<f:param name="mykey" value="myvalue"/>
<f:ajax render="somecomponent"/>
</h:commandLink>
但是,在包含不同参数键和值的许多页面中包含此按钮(ui:include)。如何在不传递参数值的情况下调用方法?
我使用glassfish 3.1.2,jsf 2.0
答案 0 :(得分:2)
显然bean是请求作用域,参数在命令链接的呈现方式中起作用(例如,通过其父组件之一的rendered
属性,或者通过包含模板的动态包含命令链接)。
所有这些条件即在表单提交的申请请求值阶段重新评估。开发人员必须确保所有这些条件与将表单呈现给最终用户时完全相同。因此,当bean是请求范围并且参数不存在时,命令链接在组件树中显示为非呈现,这样就不会调用其操作。
将bean放在视图范围内是解决此问题的最简单方法(除非您使用动态<ui:include>
,这样会更复杂,您需要关闭部分状态保存特定视图。)