带有CDI bean和@ConversationScoped的AJAX页面

时间:2013-03-15 07:49:42

标签: jsf jsf-2 cdi

我很感兴趣当我使用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();
}

2 个答案:

答案 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。