我正在尝试使用 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。
- 在 中
AppSession,我添加了一个boolean clearRequested属性(默认为 false) - 在中
AppSession,我添加了一个静态 void 方法requestClear(),它只是在会话中将clearRequested设置为 true的快捷方式 - 在
onFinish()我的向导中,就在调用之前setResponsePage,我调用AppSession.requestClear() 最后我只是在
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()并在下一个请求中清除会话。