通用错误页面未装饰

时间:2013-03-12 06:40:14

标签: spring servlets error-handling sitemesh

我有一个没有SiteMesh修饰的通用错误页面。

我可以知道是什么原因吗?

<filter>
  <display-name>SiteMesh_Filter</display-name>
  <filter-name>SiteMesh_Filter</filter-name>
  <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>SiteMesh_Filter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

<error-page>
  <error-code>404</error-code>
  <location>/pages/error.jsp</location>
 </error-page>

感谢。

2 个答案:

答案 0 :(得分:2)

This是原始问题的最新档案。

This是已关闭的问题页面。

所以,看起来你需要确保你没有使用超过2年的版本:),你需要确保你的SiteMesh过滤器配置为处理错误页面,包括:< / p>

<dispatcher>ERROR</dispatcher>

以及您需要的任何其他内容......

答案 1 :(得分:2)

我将假设您使用Sitemesh 3作为装饰器。您在问题中的配置告诉我您正在使用Sitemesh 2,但您提到在@kschneid答案的评论中使用Sitemesh 3。

Sitemesh 3使用Selector实现来选择它可以缓冲(装饰)的请求。默认情况下,这是org.sitemesh.webapp.contentfilter.BasicSelector。这个选择器有两个构造函数,即:

public BasicSelector(String... mimeTypesToBuffer) {
    this(false, mimeTypesToBuffer);
}

public BasicSelector(boolean includeErrorPages, String... mimeTypesToBuffer) {
    this.mimeTypesToBuffer = mimeTypesToBuffer;
    this.includeErrorPages = includeErrorPages;
}

默认情况下BaseSiteMeshFilterBuilder使用前者来构造选择器。这意味着includeErrorPages属性将设置为false,并且过滤器将仅缓存状态为 200 OK 的页面。要解决此问题,您需要以某种方式使用其他构造函数并将includeErrorPages设置为true

这可以通过继承org.sitemesh.config.ConfigurableSiteMeshFilter并覆盖受保护的applyCustomConfiguration(SiteMeshFilterBuilder builder)方法来完成,该方法的结尾类似于:

public class ErrorPageEnabledSiteMeshFilter extends ConfigurableSiteMeshFilter {
    @Override
    protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
        builder.setCustomSelector(new BasicSelector(true, "text/html", "application/xhtml+xml", "application/vnd.wap.xhtml+xml"))
    }
}

以上将指示构建器使用现在将装饰错误页面的自定义选择器。剩下的唯一事情就是向ErrorPageEnabledSiteMeshFilter添加ServletContext的实例,替换原来的{{1}}。