2013-08-05 97 views

回答

2

您在Wicket中獲得PageExpiredException的原因是因爲Wicket無法找到該頁面。沒有辦法確定不再可用的頁面的類型,因爲,頁面實際上不再存在。它不復存在,遇見了它的製造者,失去了生命,安息了,它的生命週期現在是'歷史的,踢了一桶。這是一個前頁面。

所以Wicket唯一的辦法是服務於PageExpiredException,並且沒有辦法(在Wicket本身)檢索試圖重新生成的頁面。

現在你可以嘗試做的是將最後一次呈現的頁面的類存儲在會話中,並在你的RequestCycleListener實現中使用onException()並返回適當的請求處理程序。在代碼:

@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 
} 

您可能要爲您在onRequestHandlerExecutedIRequestHandler implementations

+0

嗨,我想你誤會了我的問題:) 我想要的是簡單地重定向用戶,而pageexpired發生到另一個頁面,所以他不會在他的頁面上看到「Page Expired」。我只想在一個特定的頁面上,所以getApplicationSettings()。setPageExpiredErrorPage(PAGE.class)不是一個好的選擇:( – SSV

+0

而我的答案圍繞通用setPageExpiredErrorPage工作...嘗試它 –

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,以確保就是這樣。 我還沒有測試過,但我們正在做類似的事情。

+0

它沒有安裝。它只是從鏈接調用她的setResponse:/ – SSV

相關問題