我有一个没有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>
感谢。
答案 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}}。