Tapestry - 当用户打开新选项卡时,将覆盖持久性数据

时间:2013-12-27 13:08:11

标签: java persistence tapestry

我正在使用注释@Persist(PersistenceConstants.SESSION)来使一些数据持久化。

问题是,当用户打开相同页面类型的新选项卡时,将覆盖持久数据。

我希望数据是每页持久而不是每个会话,以便每个页面都有自己的持久数据集。我怎样才能在Tapestry中实现这一目标?

2 个答案:

答案 0 :(得分:2)

当有人想要使用会话时,我总是会问的第一个问题是"你真的需要使用会话吗?"

如果没有看到您的代码,很难帮助您,但我总是在不使用会话的情况下解决这些问题。如果您始终传递URL中的标识符,那么您可以在多个浏览器窗口中为不同的实体打开相同的页面,一切都将正常工作。

选项1:使用页面激活上下文(用于页面加载)和事件上下文(用于eventlink / actionlink)来维护请求之间的实体ID。

选项2:使用@Persist(PersistenceConstants.CLIENT),它将使用请求参数每次在客户端和服务器之间传递实体ID。

如果您真的想使用HTTPSession,可以使用tapestry-conversations,但在考虑了我上面提到的两种无状态/基于URL的方法后,请将此视为最后的手段。

答案 1 :(得分:1)

将页面属性定义为:@Persist(PersistenceConstants.SESSION)表示它存储在Web容器中的用户会话中,并由同一用户的所有请求共享。在浏览器中打开一个新选项卡会将其标识为服务器的同一客户端,从而重用相同的用户会话。

  

我希望每页的数据都是持久的,而不是每个会话   每个页面都有自己的持久数据集。

这可能不是Tapestry开箱即可支持的东西,除非您实现自己的持久策略,该策略采用在同一页面的多个选项卡中唯一的客户端页面ID。但这听起来不错,我可能永远不会尝试做那样的事情。

请参阅上面的建议答案。如果你找不到你想要的东西而你正在构建一个客户端密集的东西,我想你可能需要使用JavaScript中的浏览器本地存储来实现你想要的东西。