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

これは、元の問題の最新のアーカイブです。

これは閉じた問題のページです。

したがって、2年以上前のリリースを使用していないことを確認する必要があるようです:)。また、SiteMeshフィルターがエラーページを処理するように構成されていることを確認する必要があります。

<dispatcher>ERROR</dispatcher>

あなたが必要とする他のものと一緒に...

于 2013-03-20T17:02:08.110 に答える
2

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置き換えるために のインスタンスを追加することです。

于 2014-03-14T15:42:09.447 に答える