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

时间:2013-04-29 16:37:28

标签: jsf-2 codi

我有一个示例用例:我有一个使用GET参数“id”的编辑页面。 例如。编辑?ID = 1

此编辑页面由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,而不是重复使用实际使用的那个?

2 个答案:

答案 0 :(得分:2)

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

根据Gerhard Petracek的说法:http://os890.blogspot.fr/2011/08/scopes-view-scope-vs-view-access-scope.html

  

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

     

与视图范围 view-access-scoped 一样,bean在页面上可用,但它们也存在于下一页。这意味着:它们被转发到下一页并被销毁。如果在下一页的第一次请求期间没有使用它们。那是例如对向导很有用。如果你有一个不使用bean的向导页面,或者你必须支持中断向导的可能性,你可以使用codi提供的分组对话范围(甚至是窗口范围)。但是,由于codi强大的api,你也可以随时手动破坏范围(如果需要)。

因此,为了解决用另一个“ID”打开新选项卡的问题,我必须根据CODI Wiki设置“CODI Client Side WindowHandler”。 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。现在一切都很顺利。

答案 1 :(得分:0)

您可以使用也适用于CODI的@ViewScoped