会话数据在哪里属于Wicket?

时间:2011-12-07 14:10:16

标签: session wicket

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

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

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

我附加到应用程序对象的数据是我在许多页面中需要的状态,因此我没有将它附加到页面对象。这是在Wicket中做到这一点的正确方法吗?

1 个答案:

答案 0 :(得分:7)

  1. 是的,这就是拥有Application对象的重点。您可以随时通过Application子类存储和访问应用程序范围的数据(通常是配置)。
  2. 否。在某些情况下,您需要跨多个页面共享会话数据,将其存储在Session对象中更为合适。 (一个例子可能是用户登录,它肯定属于会话,可以被任何页面使用。)当然,你可以在页面之间传递数据,但这不是一个很好的策略。截止点将是您的决定:如果数据在两个页面之间共享,您可能希望将其从一个页面传递到另一个页面,如果有20个页面,您绝对不会想要。
  3. 您不应该在不同页面中重用组件实例。当然,您将重用该类,但您必须在每个页面上构建一个新类。这正是在Session对象中存储数据可能会派上用场的原因。
  4. 澄清:共享状态的页数表示数据的放置位置,但真正重要的是您希望项目共享数据的紧密程度:

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

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

    有多种方法可以获取当前的Session对象。检查the documentation of the class以了解具体方法。

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