我试图使用Wicket 1.5.8使给定页面的所有先前版本到期。在wicket 1.4中,它由getPage().getPageMap().clear()
完成。现在在wicket 1.5中,页面图已经消失了,我无法弄清楚如何点缀它。
我的用例是我有一个向导(http://www.wicket-library.com/wicket-examples/wizard/)来创建/编辑实体。提交向导后,用户将被重定向到实体列表。此时我不希望用户能够使用浏览器后退按钮在状态下返回向导,因此希望使用向导使页面的先前版本到期(我正在使用{{ 1}}如果页面在用户返回时过期,那么挂载页面将以空白状态重新创建,这就是我想要的。
环顾四周,我发现可以使用getPageSettings().setRecreateMountedPagesAfterExpiry(true);
从会话中删除所有页面(我不知道1.4版本是删除了所有页面还是只是用于访问PageMap的页面的所有版本 - 哪个更适合多标签支持)。但是,使用它只能部分工作,因为最后一页未过期。
假设向导已安装在Session.get().clear();
,最后重定向到/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
根据Andrea的建议更新我最终做的事情
需要注意的是,我的应用程序使用自定义会话对象来扩展wicket的setResponsePage(new ListPage());
;我们称之为Session
。
AppSession
中,我添加了AppSession
属性(默认为false)boolean clearRequested
中,我添加了一个静态void方法AppSession
,它只是在会话中将 clearRequested 设置为true的快捷方式requestClear()
中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);
}
}
});
并在下一个请求中清除会话。
答案 0 :(得分:1)
您可以在ListPage中清除您的会话。由于此页面是可收藏的,因此您可以传递一个页面参数,指示ListPage必须删除会话中的页面。