【问题标题】:Where does session data belong in Wicket?会话数据在 Wicket 中属于哪里?
【发布时间】:2011-12-07 14:10:16
【问题描述】:

由于 Wicket 通过序列化页面中的组件来自动管理会话状态,我不知道应该在哪个级别附加状态数据。更具体地说,我遇到的错误似乎是由会话之间共享的 WebApplication 对象引起的。

  • 应用程序实例是否在会话之间共享?
  • 我是否应该始终将会话数据附加到 Page 实例?
  • 如果我在多个页面上重用带有附加会话状态的组件会怎样?这些实例是否共享,即如果我在一个页面上设置组件的状态,它是否会转移到另一个页面?

我猜,第三个要点取决于对象身份。 Wicket 使用什么来确定equals()(例如,它是否使用Map)?

我附加到应用程序对象的数据是我在许多页面中需要的状态,所以我没有将它附加到页面对象。这是在 Wicket 中执行此操作的正确方法吗?

【问题讨论】:

标签: session wicket


【解决方案1】:
  1. 是的,这就是拥有Application 对象的意义所在。您可以随时通过 Application 子类存储和访问应用程序范围的数据(通常是配置)。
  2. 没有。在某些情况下,您需要跨多个页面共享会话数据,将其存储在 Session 对象中更为合适。 (一个例子可以是用户登录,它肯定属于会话并且可以被任何页面使用。)当然你可以在页面之间传递数据,但这不是一个很好的策略。截止点在哪里由您决定:如果数据在两个页面之间共享,您可能希望将数据从一个页面传递到另一个页面,如果有 20 个页面,您肯定不想这样做。
  3. 您不应该在不同的页面中重复使用组件实例。当然,您将重用该类,但您必须在每一页上构建一个新类。这正是在 Session 对象中存储数据可能会派上用场的地方。

澄清一下:共享状态的页面数是数据放置位置的指示,但真正重要的是您希望共享数据的项目耦合的紧密程度:

如果您在页面之间传递数据作为参数,它们将形成一个紧密耦合的组。根据页面所代表的内容,这可能是可取的。这方面的一个例子可能是一个类似向导的页面序列,每个页面都知道之前和之后的页面是什么。

但是在登录示例中,我们看到相反的情况:填充登录名的组件(可能是某种登录表单)必须不知道其他组件将使用它。因此,合乎逻辑的解决方案是将登录名存储在会话中,并让每个组件在需要时获取它。

有多种方法可以获取当前的Session 对象。检查the documentation of the class 看看如何。

总结那里的信息:Wicket 通过不提供通用的setProperty-like 方法来阻止类型不安全的会话属性。相反,您应该扩展Session,或者对于大多数项目,更充分地,WebSession 并将类型安全属性放在该类中。然后在您的应用程序类上覆盖 newSession

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多