2

私はトムキャットを使用しています。私はいくつかの<error-page>inを定義し、エラーを pageweb.xmlにマッピングしました。リソースが存在するかどうかを検出し、リソースが利用できない場合は応答ステータスを 404 に設定する必要があります。404/error/error.jsp

response.setStatus(404);

しかし、Tomcat は私が定義した 404 ページにリダイレクトしないので、私の質問は、で定義されたページの場所を取得する API はありますweb.xmlか? 自分で解析したくありませんweb.xml

4

2 に答える 2

4

status codeHttpServletResponse#sendError()と一緒に使用してください。例えば

File resource = new File(path, name);
if (!resource.exists()) {
    response.sendError(HttpServletResponse.SC_NOT_FOUND); // Sends 404.
    return;
}

サーブレットコンテナは適切なエラーページを表示します。

注:returnステートメントは装飾用ではありません。これにより、同じメソッド ブロック内の残りのコードが引き続き実行IllegalStateExceptionされ、appserver ログに sが生成される可能性が回避されます。つまり、スターターはsendRedirect()forward()sendError()、 などのメソッドが呼び出されると、何らかの方法でメソッド ブロックを自動的に終了すると考えることがよくあります。したがって、これは真実ではありません;)

于 2010-01-12T11:53:41.653 に答える
1

いいえ、API はありません。設定は Tomcat の内部にあり、これを直接外部に公開することはありません。(あなたが言ったように、web.xmlを解析することができます.XMLなので、これを引き出すためにXQueryを書くのは簡単です)。

また、これがどのように機能するのか正確に混乱しているように見えると思います。404 応答の HTML 本文を提供するために使用する URI を Tomcat に提供します。リクエストで提供されたかのように、この URI を実際のリソースに解決できる必要があります。そのため、多くの場合、リソースが存在するかどうかを検出するためにサーブレットは必要ありません。提供されるリソースを含むサーブレットが必要です。例外は、Tomcat を使用していくつかの URL の静的ファイル システム データを提供する場合です。

サーブレットなしで Tomcat をセットアップした場合、とにかく何を提供することを期待していますか? error.jsp一体どこからページを取得することを期待していますか? それをどのように知っていると思いますか?必要なことは、少なくとも 1 つのサーブレットを (error.jspファイルを含む) Tomcat に追加し、web.xml が/error/error.jspURL をこのサーブレットにマップすること (およびリソースがサーブレットのエラー サブディレクトリに配置されること) を確認することです。

これが完了すると、eg に手動でアクセスしhttp://localhost:8080/<context>/error/error.jspて応答を返すことができるはずです (実際の例外はなく、ファイルが見つかるはずなので、奇妙な内容が含まれている可能性があります)。同様に、web.xml で error-page ディレクティブを正しく設定した場合、マッピングされていない URL (例: http://localhost:8080/<context>/asdfghjasgh) に移動すると、エラー ページが 404 応答として表示されます。

于 2010-01-12T08:34:51.173 に答える