在Wicket中使用可收藏页面的Tomcat错误页面

时间:2014-01-23 13:08:16

标签: java tomcat wicket web.xml

我有这样的问题。

我需要在收到404 HTTP错误时显示自定义错误页面。我正在使用Wicket 1.4和Tomcat6。我在web.xml中实现了这些东西,比如

 <filter-name>wicket.filter</filter-name>
    <url-pattern>/*</url-pattern>         
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
 </filter-mapping>

<error-page>
    <error-code>404</error-code>
    <location>/404</location>
</error-page>

并在我的WebApplication中放置此类代码:

mount(new HybridUrlCodingStrategy("/404", PageNotFound.class));

PageNotFound类isErrorPage设置为true,isVersioned为false和

    @Override
    protected void configureResponse() {
       super.configureResponse();   
       getWebRequestCycle().getWebResponse().getHttpServletResponse().setStatus(HttpServletResponse.SC_NOT_FOUND);
    }

现在的问题是,当我输入一些无效的网址时,如http://localhost:8080/myApp-war/invalidUrl,我可以看到我的PageNotFound。 但是当我输入类似http://localhost:8080/myApp-war/?wicket:bookmarkablePage=:com.mypackage.invalidUrl的内容时,我只是在没有任何数据的情况下获得空白页面。

我注意到,在第一种情况下,tomcat只显示“ HTTP状态404 - / myApp-war / invalidUrl ” 在另一种情况下,它显示略有不同的消息:“ HTTP状态404 - 无法加载可收藏的页面

如何使这两个案例显示相同的页面?也许这个<error-page>标签需要修改?如果您需要,我会为您提供更多信息。

1 个答案:

答案 0 :(得分:1)

您的代码和期望是完美的。它只是一个Wicket bug或Tomcat对404 Exception的错误理解。我想它只是在1.4.x版之前的Wicket中。

修复是覆盖 AbstractRequestCycleProcessor 中的代码,您只能在WebApplication类的工厂方法中覆盖它:

@Override

protected IRequestCycleProcessor newRequestCycleProcessor() {

return new WebRequestCycleProcessor() {

    @Override
    protected IRequestTarget resolveBookmarkablePage(final RequestCycle requestCycle,
            final RequestParameters requestParameters) {
        IRequestTarget target = super.resolveBookmarkablePage(requestCycle, requestParameters);
        if(target == null) {
            return target;
        }
        if(target instanceof WebErrorCodeResponseTarget) {
            WebErrorCodeResponseTarget errorResponse = (WebErrorCodeResponseTarget) target;
            if(HttpServletResponse.SC_NOT_FOUND == errorResponse.getErrorCode()) {
                return null;
            }
        }
        return target;
    }

};

}

我将完整的工作示例放入我的Wicket14测试库https://repo.twinstone.org/projects/WISTF/repos/wicket-examples-1.4/browse