打开一个新选项卡不要创建新的ViewAccessScoped bean

问题描述:

我有一个示例用例:我有一个使用GET参数“id”的编辑页面。 例如。编辑?id = 1打开一个新选项卡不要创建新的ViewAccessScoped bean

此编辑页面由ViewAccessScoped(CODI)Bean支持。

在这个编辑页面中,我有一个链接到相同的“编辑”页面,但与另一个ID链接的数据表。 (例如,编辑?id = 2)

<h:link value="#{mecaPart.id}" outcome="edit" target="_blank"> 
    <f:param name="id" value="#{mecaPart.id}" /> 
</h:link> 

问题是,窗口打开正确,但它是使用相同的bean!所以我正在编辑相同的部分...

我已经在@PostConstruct中放置了一个日志,它是多次调用的相同的bean引用。 (即使有新的ID!)

我的问题,我怎么能告诉JSF创建一个新的ViewAccessScoped支持bean,当我点击链接,而不是重新使用实际使用的?

+0

ViewAccessScoped使用相同的bean实例,只要URL是相同的,显然它不考虑GET参数。你必须使用ViewScoped。您使用ViewAccessScoped的原因有哪些? – Damian 2013-04-29 17:59:22

+0

嗯,我认为ViewScoped只能使用@ManagedBean而不是CDI。我重新阅读CODI文档,你说得对,我没有理由使用ViewAccessScoped。 (CODI自动将CDI扩展添加到ViewScoped)。这正在工作,谢谢! – 2013-04-30 07:49:23

最后,我发现@ViewScoped CODI bean没有保留从页面刷新的支持bean。所以,我必须使用ViewAccessScoped。

根据格哈德Petracek:http://os890.blogspot.fr/2011/08/scopes-view-scope-vs-view-access-scope.html

视图-范围JSF2 +的被绑定到具体的JSF页面。这意味着:只要您导航到不同的页面,状态就会丢失。这总比没有好,但对许多用例不起作用。需要它的主要用例是页面上的ajax请求,而其他页面上不需要它们使用的数据,但它很容易被破坏,使用浏览器刷新页面,该页面将数据存储在视图范围的bean中,并且没有输入组件的表单。 (在之前的博客文章中,我描述了如何使用由codi提供的基础结构创建基于会话的视图范围,以通过将视图范围的bean存储为树状态的一部分来解决这些缺点。)

与视图范围视图访问范围 bean在页面上可用,但它们也可用于下一页。这意味着:它们被转发到下一页并被销毁。如果它们在下一页的第一个请求期间没有被使用。就是例如对巫师很有用。如果你有一个不使用这个bean的向导页面,或者你必须支持中断一个向导的可能性,你可以使用codi提供的分组对话范围(甚至是窗口范围)。但是,由于codi的强大API,您还可以随时手动销毁示波器(如果需要)。

所以,解决与其他“ID”打开一个新标签的问题,我必须设置“CODI客户端WindowHandler”,根据维基CODI。 https://cwiki.apache.org/confluence/display/EXTCDI/JSF+WindowHandler

于是我说:

<alternatives> 
    <class>org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.ClientSideWindowHandler</class> 
</alternatives> 

要将文件beans.xml中,我用@ViewAccessScoped。现在一切正常。

您可以使用@ViewScoped也可以工作在CODI