JSF会话作用域Bean刷新页面时@PostConstruct未触发,如何实现每次刷新调用方法?
解决JSF会话Bean每次刷新页面触发方法的问题
嗨,这个场景我太熟悉了!会话作用域的Bean本身就是在用户会话创建时初始化一次,所以@PostConstruct标注的init方法只会在首次加载页面、Bean被实例化的时候跑一次,之后刷新页面不会重新创建Bean,自然不会再执行。要实现每次刷新页面都调用某个方法,有个简单直接的办法:
用<f:event>绑定preRenderView事件
这个事件会在JSF渲染视图每次请求时触发,不管是首次加载还是刷新页面,完美匹配你的需求。
步骤1:在XHTML页面中添加事件绑定
在页面的<f:view>标签内部(或者直接放在页面根元素里)加入这段代码:
<f:event type="preRenderView" listener="#{yourSessionBean.onPageRefresh}" />
把yourSessionBean换成你实际的会话Bean名称,onPageRefresh换成你想每次触发的方法名。
步骤2:在会话Bean中实现对应方法
在你的会话作用域Bean里添加这个方法,不需要额外注解,只要符合JSF监听器方法的签名(无返回值,可接受ComponentSystemEvent参数,也可以不带参数):
import javax.faces.event.ComponentSystemEvent; import javax.faces.bean.SessionScoped; import javax.inject.Named; import java.io.Serializable; @Named @SessionScoped public class YourSessionBean implements Serializable { // 你的其他属性和方法... public void onPageRefresh() { // 这里写每次刷新页面要执行的逻辑 System.out.println("页面刷新了,方法执行!"); } // 或者带参数的版本,如果你需要获取事件相关信息: // public void onPageRefresh(ComponentSystemEvent event) { // // 逻辑代码 // } }
注意事项
- 如果你的项目用的是JSF 2.0及以上版本,这个方法完全适用,不需要额外依赖。
- 如果多个页面都需要触发这个方法,把
<f:event>放在你的模板页面(比如template.xhtml)里就行,所有继承模板的页面都会自动触发。 - 别担心重复触发:
preRenderView只会在当前页面的渲染请求中执行一次,不会有多余的调用。
内容的提问来源于stack exchange,提问作者Ajmal Khan
相关产品推荐
相关产品推荐

