我在使用JSF2.0 Ajax标记时遇到了一个非常奇怪的问题。以下是导致我出现问题的步骤
- 我的项目使用了JSF2.0和Spring3.0。JSF连接到spring控制器,生命周期由spring管理
- 我的控制器已被请求范围化
到目前为止一切都很好
我有一个selectOne下拉列表,在下拉列表中选择一个值时,它会渲染屏幕底部的另一个下拉列表。我使用父面板组上的渲染属性来显示和隐藏此下拉列表。
然而,对于新呈现的值选择下拉列表,ajax侦听器(F:ajax标记在其中定义)不会被调用。我看到以下情况正在发生
- bean被重新认证为请求范围。我看到我的后构造被执行了
- 我在客户端的数据对象中看到了成功消息
唯一缺少的是没有调用侦听器方法。
有没有办法调试生命周期并找出问题所在?
如果<f:ajax>
的父组件之一的rendered
属性在处理ajax请求期间评估false
,则不会调用ajax操作侦听器。
每个请求都会重新创建一个请求范围的bean,因此它的所有属性都将重新设置为默认值,除非在(post)构造函数中进行了初始化。如果rendered
属性后面的属性没有根据一些请求参数正确地重新初始化,那么它将像初始请求一样评估false
。
要修复它,您需要根据请求参数在bean(post)构造函数中进行适当的初始化,或者只将bean放在JSF视图范围中。
另请参阅:
- 如何选择正确的bean作用域
- commandButton/commandLink/ajax-action/listaner方法未调用或输入值未更新