我假设您使用 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
替换旧的实例。