我很感兴趣当我使用CDI时,使用AJAX的JSF页面的正确方法是什么。
我测试了用@SessionScoped
配置CDI bean但我发现AJAX存在问题。
将AJAX与配置了@ConversationScoped
的CDI bean一起使用是否合适?
我发现我必须将conversation.begin();
放入Bean构造函数并将conversation.end();
放入Java方法,这必须在会话完成时。我能以某种方式自动执行此操作吗?
P.S我可以使用此代码在用户关闭页面时自动释放资源吗?
@Remove
public void finishIt(){
conversation.end();
}
答案 0 :(得分:2)
我发现我必须将
conversation.begin();
放入Bean构造函数并将conversation.end();
放入Java方法中,这必须是在会话完成时。
这是对的。另请参阅How to replace @ManagedBean / @ViewScope by CDI in JSF 2.0/2.1以获取具体的代码示例。
我能以某种方式自动执行此操作吗?
没有。考虑安装MyFaces CODI。它将把JSF @ViewScoped
连接到CDI。这样您就可以使用@Named @ViewScoped
。但缺点是它使用windowId
请求参数污染了URL。
MyFaces CODI还提供@ViewAccessScoped
,只要您在视图中引用所需的bean,就会生效{{1}},无论您正在查看哪个视图。一旦您导航到不参考的视图豆在任何地方都会被摧毁。
或者,如果您有耐心,请等待JSF 2.2发布。它将伴随a CDI compatible @ViewScoped
,因此您不需要MyFaces CODI。
答案 1 :(得分:1)
默认情况下,Conversation对象处于瞬态状态。调用begin方法将其标记为长时间运行(当真正的对话开始时)。结束会话(通过调用end方法)将Conversation对象标记为瞬态。
瞬态会话范围bean将在单个请求的生命周期中生存。
长期会话(由conversation.begin启动)将运行,除非调用conversation.end。