3

我正在尝试使用 Wicket 1.5.8 使给定页面的所有先前版本过期。在 wicket 1.4 中,它由getPage().getPageMap().clear(). 现在在 wicket 1.5 中,页面地图不见了,我不知道如何添加它。

我的用例是我有一个向导 (http://www.wicket-library.com/wicket-examples/wizard/) 来创建/编辑实体。提交向导后,用户将被重定向到实体列表。在这一点上,我不希望用户能够使用浏览器后退按钮返回到向导的状态,因此希望使用向导使以前版本的页面过期(我正在getPageSettings().setRecreateMountedPagesAfterExpiry(true);使用如果用户返回时页面过期,挂载的页面将在空白状态下重新创建,这是我想要的)。

环顾四周,我发现可以使用Session.get().clear();which 从会话中删除所有页面(我不知道 1.4 版本是删除所有页面还是仅删除用于访问 PageMap 的页面的所有版本 - 这对于多选项卡会更好支持)。但是,使用它只能部分工作,因为最后一页没有过期。

假设向导安装在/wizard,最后重定向到/list,流程将类似于:/wizard?1, /wizard?2, /wizard?3, /list。现在,当我使用后退按钮/wizard?3时,虽然/wizard?1/wizard?2预期的一样,但并没有过期。会话清除和发送到列表页面是在onFinish向导的方法中完成的,如下所示:

@Override
public void onFinish() {
  Session.get().clear();
  Session.get().getFeedbackMessages().add(new FeedbackMessage(..));
  setResponsePage(ListPage.class);
}

所以,回到问题本身:有人知道如何获得预期的行为,即过期/wizard?3吗?

谢谢

注意:ListPage是一个可收藏的页面,我也尝试过setResponsePage(new ListPage());


根据安德里亚的建议更新我最终所做的事情

需要注意的是,我的应用程序使用自定义会话对象扩展 wicket 的Session;让我们称之为AppSession

  1. 在 中AppSession,我添加了一个boolean clearRequested属性(默认为 false)
  2. 在中AppSession,我添加了一个静态 void 方法requestClear(),它只是在会话中将clearRequested设置为 true的快捷方式
  3. onFinish()我的向导中,就在调用之前setResponsePage,我调用AppSession.requestClear()
  4. 最后我只是在RequestCycleListener我的应用程序中添加一个。

    getRequestCycleListeners.add(new AbstractRequestCycleListener() {
      @Override
      public void onBeginRequest(RequestCycle cycle) {
        super.onBeginRequest(cycle);
        AppSession session = AppSesssion.get();
        if (session.isClearRequested()) {
          session.clear();
          session.setClearRequested(false);
        }
      }
    });
    

现在,每当我需要在操作后清除会话以使页面过期时,我只需调用AppSession.requestClear()并在下一个请求中清除会话。

4

1 回答 1

1

您可以在 ListPage 中清除会话。由于此页面是可收藏的,您可以向它传递一个页面参数,指示 ListPage 必须删除会话中的页面。

于 2012-10-09T14:40:19.120 回答