我正在尝试使用 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()
并在下一个请求中清除会话。