【问题标题】:preserving component state across multiple request cycles在多个请求周期中保留组件状态
【发布时间】:2011-08-30 13:58:13
【问题描述】:

关于使用 Apache Wicket 1.4.x 进行组件状态管理的问题

我有一个可添加书签的有状态页面,其中包含一个带有设置搜索条件的表单。用户搜索与所选标准匹配的项目,然后离开页面(例如,转到详细的项目视图)。在某个时间点,用户可以使用可收藏链接返回搜索页面。我希望预先选择最后一个搜索条件作为默认选择。但是,BookmarkablePageRequestTarget aways 似乎在其 #respond(RequestCycle) 方法中创建了目标页面的新实例,因此丢失了之前的状态(支持搜索表单的 bean)。

当然,我可以手动管理表单状态并将其存储在 WebSession 子类中,但我想知道是否有更好的方法来跨多个请求周期保留组件状态,例如让 Wicket 重复使用目标页面的现有实例?理想情况下,这将适用于书签链接。

【问题讨论】:

    标签: java wicket state


    【解决方案1】:

    通常,组件的状态存储在组件实例本身中。 (直接在其中,或间接在模型中。)

    所以你真正需要做的就是创建一个指向搜索页面instance的链接,或者使用页面实例或类似的东西调用setResponsePage(),具体取决于你的重定向方式用户。

    通常情况下,您甚至根本不应该触摸请求目标,除非实际情况比您描述的要复杂得多。

    【讨论】:

    • 原谅我的无知,但是可以创建指向特定页面实例的链接吗?更重要的是,如何获得对特定页面实例的引用?
    • @oleg 抱歉,我没有意识到这是问题所在。要创建指向现有页面的链接,您可以使用 PageLink 类。并且您可以将其传递给参考。因此,当您从搜索页面打开详细信息页面时,您基本上传递了this,然后当详细信息页面必须链接回来时,您可以使用该参考。
    • 对。问题是用户可以从详细视图导航到应用程序的大量不同领域,而不仅仅是搜索。在整个应用程序中拖动对 SearchPage 实例的引用是不可行的。
    • @oleg 在这种情况下,最简单的事情就是将表单模型对象存储在 Web 会话中。它并不像听起来那么糟糕。您只需扩展 WebSession 并为您的模型对象添加一个字段加上 getter/setter 并在您的表单中您有一个 Model 从那里获取它的值。
    【解决方案2】:

    使用HybridUrlCodingStrategy 或其子类安装您的可收藏页面。这会将页面标识符附加到 URL 并确保后退按钮适用于可收藏的链接。

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2013-03-24
      • 2022-08-03
      • 2012-08-10
      • 2018-05-13
      相关资源
      最近更新 更多