由于Wicket通过序列化我的页面中的组件来自动管理会话状态,我想知道,在哪个级别我应该附加我的状态数据。更具体地说,似乎我遇到的错误是由会话之间共享的WebApplication
对象引起的。
Page
实例?我猜,第三个要点取决于对象的身份。 Wicket使用什么来确定equals()
(例如,是否使用Map
)?
我附加到应用程序对象的数据是我在许多页面中需要的状态,因此我没有将它附加到页面对象。这是在Wicket中做到这一点的正确方法吗?
答案 0 :(得分:7)
Application
对象的重点。您可以随时通过Application
子类存储和访问应用程序范围的数据(通常是配置)。Session
对象中更为合适。 (一个例子可能是用户登录,它肯定属于会话,可以被任何页面使用。)当然,你可以在页面之间传递数据,但这不是一个很好的策略。截止点将是您的决定:如果数据在两个页面之间共享,您可能希望将其从一个页面传递到另一个页面,如果有20个页面,您绝对不会想要。Session
对象中存储数据可能会派上用场的原因。澄清:共享状态的页数表示数据的放置位置,但真正重要的是您希望项目共享数据的紧密程度:
如果您在页面之间传递数据作为参数,它们将形成一个紧密耦合的组。根据页面所代表的内容,这可能是可取的。这方面的一个例子可能是类似向导的页面序列,每个页面都知道之前和之后的页面是什么。
但是在登录示例中我们看到了相反的情况:填充登录名的组件(可能是某种登录表单)必须不知道其他组件将使用它。因此,逻辑解决方案是将登录名存储在会话中,并让每个组件在需要时获取它。
有多种方法可以获取当前的Session
对象。检查the documentation of the class以了解具体方法。
总结那里的信息:Wicket通过不提供类似通用setProperty
的方法来阻止类型不安全的会话属性。相反,您应该更广泛地扩展Session
,或者对于大多数项目,WebSession
并在该类中放置类型安全属性。然后,在应用程序类上覆盖newSession
。