1

有没有办法做到这一点?

我听说了一些关于已实现的 RequestCycle,如何实现它?

尝试过如何从 Wicket 1.5 中的 RequestCycle 获取 responsePage?这个,但不起作用。

4

2 回答 2

2

您在 Wicket 中获得 a 的原因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

于 2013-08-05T20:48:18.183 回答
1

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

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 以确保它是它。我还没有测试过,但我们正在做类似的事情。

于 2013-08-06T09:00:10.897 回答