Wicket setPageExpiredErrorPage仅针对特定页面?

时间:2013-08-05 08:39:12

标签: java apache request wicket

有没有办法做到这一点?

我听说过有关已实现的RequestCycle的一些内容,如何实现它?

尝试How can I get the responsePage from a RequestCycle in Wicket 1.5?这个,但不起作用。

2 个答案:

答案 0 :(得分:2)

你在Wicket中获得PageExpiredException的原因是因为Wicket无法找到该页面。无法确定不再可用的页面类型,因为页面实际上不再存在。它不复存在,遇到了它的制造者,失去了生命,安息,它的生命周期现在已经成为现实,被踢了一把。这是一个前页面。

所以Wicket唯一的办法就是为PageExpiredException提供服务,并且没有办法(在Wicket本身)检索试图复活的页面。

现在您可以尝试做的是将最后呈现的页面的类存储在会话中,并在onException()的RequestCycleListener实现中使用它,并返回相应的请求处理程序。在代码中:

@Override
public void onRequestHandlerExecuted(RequestCycle cycle, IRequestHandler handler) {
    Class<? extends Page> p = null;

    if(handler instanceof IPageRequestHandler)
        p = ((IPageRequestHandler)handler).getPageClass();
    else if(handler instanceof IComponentRequestHandler)
        p = ((IComponentRequestHandler)handler).getComponent().getPage().getClass();

    MySession.get().setLastPageClass(p);
}

@Override
public IRequestHandler onException(RequestCycle cycle, Exception ex) {
    Class<? extends Page> pageClass MySession.get().getLastPageClass();
    ... return some handler based on your logic
}

您可能想在onRequestHandlerExecuted中查看更多IRequestHandler implementations

答案 1 :(得分:1)

如果我理解正确,只有在特定页面发生pageExpired时才想重定向用户?您可以在Application的实现中尝试这样的事情:

getRequestCycleListeners().add(new AbstractRequestCycleListener() {
   @Override
   public IRequestHandler onException(RequestCycle cycle, Exception e) {
      if(e.getClass().equals(PageExpiredException.class)) {
         //check if url in request responds to correct mounted page type
         if(isPageUrl(cycle.getRequest().getUrl()))) {
            return new RenderPageRequestHandler(new PageProvider(MyPage.class));
         } else {
            return super.onException(cycle, e);
         }
      } else {
         return super.onException(cycle, e);
      }
   }
}

这假设很少 - 已经安装了获得异常的页面,并且您将能够解析请求URL以确保它是它。 我没有测试过,但我们正在做类似的事情。