1

我有一个示例用例:我有一个使用 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 引用。(即使是新身份证!)

我的问题是,当我单击链接时,如何告诉 JSF 创建一个新的 ViewAccessScoped 支持 bean,而不是重新使用实际使用的支持 bean?

4

2 回答 2

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

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

于 2013-04-30T12:05:15.203 回答
0

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

于 2013-04-30T20:33:53.393 回答