【问题标题】:Tapestry - Persistent data is overridden when user opens a new tabTapestry - 当用户打开一个新选项卡时,持久数据被覆盖
【发布时间】:2013-12-27 13:08:10
【问题描述】:

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

问题是,当用户打开相同页面类型的新标签页时,持久性数据会被覆盖。

我希望数据在每个页面而不是每个会话中都是持久的,以便每个页面都有自己的一组持久数据。如何在 Tapestry 中实现这一点?

【问题讨论】:

  • 你想要的,完全有可能。请分享您的代码。没有它,将很难弄清楚发生了什么。

标签: java persistence tapestry


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 将尝试您建议的选项。如果需要,将添加一些代码。谢谢!
【解决方案2】:

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

我希望数据在每个页面而不是每个会话中都是持久的,这样 每个页面都有自己的一组持久数据。

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

请参阅上面的建议答案。如果你没有找到你想要的东西,并且你正在构建一些需要大量客户端的东西,我认为你可能需要使用 JavaScript 中的浏览器本地存储来实现你想要的东西。

【讨论】:

猜你喜欢
  • 2013-02-10
  • 2019-04-03
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多