如何在JSF1.x中创建视图范围的bean?

如何在JSF1.x中创建视图范围的bean?,jsf,jsf-1.2,view-scope,Jsf,Jsf 1.2,View Scope,我在一个网页中有两个链接,一品脱链接到appserver/?dept=1,链接二是appserver/?dept=2。然后我有一个JSF阶段监听器,在那里,我可以获取后端bean并将dept1或dept2设置为bean参数,以便呈现不同的部门内容。如果用户从上面的网页启动两个窗口,dept1窗口的内容可以转到dept2窗口。一切都搞砸了。(注意,如果您从桌面快捷方式启动浏览器,请键入上面的链接,没有问题,因为将创建两个会话,并装入两个不同的后端bean实例) 关键原因是JSF在会话中存储后端be

我在一个网页中有两个链接,一品脱链接到appserver/?dept=1,链接二是appserver/?dept=2。然后我有一个JSF阶段监听器,在那里,我可以获取后端bean并将dept1或dept2设置为bean参数,以便呈现不同的部门内容。如果用户从上面的网页启动两个窗口,dept1窗口的内容可以转到dept2窗口。一切都搞砸了。(注意,如果您从桌面快捷方式启动浏览器,请键入上面的链接,没有问题,因为将创建两个会话,并装入两个不同的后端bean实例)

关键原因是JSF在会话中存储后端bean,因此来自同一父窗口的两个窗口共享相同的会话id(cookie),然后使用相同的后端bean类实例。在渲染结果时,结果可以转到任一窗口

如何避免这种窗口交叉内容的情况?这似乎是很久以前就应该解决的一个基本web应用问题。或者我可能真的做错了


我尝试了seam转换,没有帮助,JSF2.0有视图范围,CDO。这有帮助吗?由于各种原因,我们还不能转向JSF2.0。我正在使用JAVA6、Tomcat6.20和Icefaces。任何帮助都是适当的。

在JSF1.x中,最好的选择是。只需将其放在页面中,指定的请求范围bean将保留在后续请求中,该请求由同一页面触发,而不管浏览器选项卡/窗口如何

<t:saveState value="#{bean}" />


它的作用类似于JSF2.0视图范围。

在JSF1.x中,最好的选择是。只需将其放在页面中,指定的请求范围bean将保留在后续请求中,该请求由同一页面触发,而不管浏览器选项卡/窗口如何

<t:saveState value="#{bean}" />


它的作用类似于JSF 2.0视图范围。

您的问题可以通过使用seam对话轻松解决,您可以查看seam包附带的示例。您需要将支持bean范围从会话更改为对话,并使用页面参数。此外,seam in action book还用非常漂亮和简短的示例解释了此用例。

您的问题可以通过使用seam对话轻松解决,您可以查看seam软件包附带的示例。您需要将支持bean范围从会话更改为对话,并使用页面参数。另外,seam in action book用非常好的简单示例解释了这个用例。

看一看。

看一看。

是的,我也这么认为,我尝试了seam下载示例,只有一个示例可以在没有Jboss plubin的普通Tomcat上运行。但问题仍然存在。我添加了pages.xml、注释(如@conversation scope、@Begin等)没有帮助。我将研究您提到的“seam in action”书籍示例。谢谢。是的,我也这么认为,我尝试了seam下载示例,只有一个示例可以在没有Jboss plubin的普通Tomcat上运行。但问题仍然存在。我添加了pages.xml、注释(如@conversation scope、@Begin等)没有帮助。我将研究您提到的“seam in action”书籍示例。谢谢,是的。但乐团要求你们安装Spring,作为一个组织,我们还没有使用它。是的。但乐团要求您安装Spring,作为一个组织,我们尚未使用。谢谢。我试试看。另外,我在想,我可能会更改链接页面以使用不同的URL(一个应用服务器为每个部门提供不同的servlet),这可能会让每个窗口创建不同的会话,因为它们使用不同的URL。但若用户为同一部门打开多个窗口,那个么问题可能仍然存在。我认为这是最非侵入性和最简单的解决方案。我在一小时内完成了。只是为了给别人分享经验:1。您必须将bean范围定义为请求。2.使bean代码可序列化。3.我使用了:common-el-1.0.jar common-fileupload-1.2.1 jar,commons-io-1.3.2.jar Tomahawk 12-1.1.10.jar,从下载的Tomahawk lib下载。不客气。别忘了标出最有用的答案。另见,谢谢。我试试看。另外,我在想,我可能会更改链接页面以使用不同的URL(一个应用服务器为每个部门提供不同的servlet),这可能会让每个窗口创建不同的会话,因为它们使用不同的URL。但若用户为同一部门打开多个窗口,那个么问题可能仍然存在。我认为这是最非侵入性和最简单的解决方案。我在一小时内完成了。只是为了给别人分享经验:1。您必须将bean范围定义为请求。2.使bean代码可序列化。3.我使用了:common-el-1.0.jar common-fileupload-1.2.1 jar,commons-io-1.3.2.jar Tomahawk 12-1.1.10.jar,从下载的Tomahawk lib下载。不客气。别忘了标出最有用的答案。另见。