0

私はキャッチオールサーブレットを使用しています:

@WebServlet(name="RequestHandler", urlPatterns="/*")
public class RequestHandler extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    new SeedPlanter(request, response).sow();   
}

}

すべてのリクエストを処理します。urlPattern /*に注意してください。その理由は、テンプレート化、オブジェクトの処理など、さまざまなものをロードするためです。サーブレットは、基本的に、すべての html レンダリングを処理するカスタム フレームワークの前にある単なるファサードです。

問題は、リソースに直接アクセスできなくなったことです。

たとえば、web-inf ディレクトリ ( localhost:8080/myapp/test.html) の外にある html ファイルを読み込もうとすると、404 エラーが発生します。実際、ページに画像 ( ) を読み込もうとしてもlocalhost:8080/myapp/images/test.png、404 リソースが見つからないというメッセージが表示されます。サーブレットを削除すると明らかにアプリケーション全体が台無しになりますが、それらのリソースをロードできるので、サーブレットが問題の原因であると確信しています。

私のようにサーブレットを使用し、それらのリソースをロードするにはどうすればよいですか?

4

3 に答える 3

0

パスを正しく書き換えるために、サーブレット フィルターを作成/使用することをお勧めします。参考になりそうなソース コードを備えた良い例がここにあります。

記述子の実際の機能は、実際の実装方法について誤解されることが多いため、参照用に以下を含めました。

SRV.11.2 マッピングの仕様

Web アプリケーションのデプロイメント記述子では、次の構文を使用してマッピングを定義します。

  • / 文字で始まり /* サフィックスで終わる文字列は、パス マッピングに使用されます。
  • * で始まる文字列。プレフィックスは拡張マッピングとして使用されます。
  • / 文字のみを含む文字列は、アプリケーションの「デフォルト」サーブレットを示します。この場合、サーブレット パスはリクエスト URI からコンテキスト パスを引いたものであり、パス情報は null です。

他のすべての文字列は、完全一致のみに使用されます。

于 2013-08-28T08:04:03.987 に答える