4

我有一个没有被 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>

谢谢。

4

2 回答 2

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的页面才会被过滤器缓冲。为了克服这个问题,您需要以某种方式使用其他构造函数并设置includeErrorPagestrue.

这可以通过子类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"))
    }
}

以上将指示构建器使用自定义选择器,该选择器现在将装饰错误页面。剩下的唯一一件事就是添加一个实例ErrorPageEnabledSiteMeshFilterServletContext替换旧的实例。

于 2014-03-14T15:42:09.447 回答
2

是原始问题的最新存档。

是已关闭的问题页面。

因此,您似乎需要确保您没有使用超过 2 年的版本:),并且您需要确保您的 SiteMesh 过滤器配置为通过包括以下内容来处理错误页面:

<dispatcher>ERROR</dispatcher>

以及您需要的其他任何东西...

于 2013-03-20T17:02:08.110 回答