Sitemesh 3 をデコレータとして使用していると仮定します。質問の構成は、Sitemesh 2 を使用していることを示していますが、@kschneid の回答へのコメントで Sitemesh 3 の使用について言及しました。
Sitemesh 3 はSelector
実装を使用して、バッファリング (装飾) できるリクエストを選択します。デフォルトでは、これはorg.sitemesh.webapp.contentfilter.BasicSelector
. このセレクターには、次の 2 つのコンストラクターがあります。
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
置き換えるために のインスタンスを追加することです。