web-dev-qa-db-ja.com

サーブレット@WebServleturlPatterns

これは簡単な質問ですが、簡単な答えは見つかりませんでした。これで、ユーザーが以下のURLのいずれかを要求すると、サーブレットBaseServletが作成されました。

Host
host/
Host/BaseServlet

常に同じサーブレットを参照し、ホームページにリダイレクトする必要があります。

設定したとき

@WebServlet({"/BaseServlet", ""})

のみ

Host/
Host/BaseServlet

動作します

設定した場合

@WebServlet({"/BaseServlet", "", "/"})

BaseServletは常にループで要求されます...

どうして?

編集:BaseServletは、WEB-INFフォルダーに隠されたindex.htmlに転送します。それだけです。

getServletContext().getRequestDispatcher("/WEB-INF/index.html").forward(request,response);

サーブレット仕様には、「/文字のみを含む文字列は、アプリケーションの「デフォルト」サーブレットを示します」と記載されています。したがって、BaseServletをデフォルトにします。なぜそれが機能しないのですか?

9
kakacii
  1. Qで述べているように、次のことが必要な場合:

    Host/
    Host/BaseServlet
    

    使用する

    @WebServlet({"/BaseServlet", ""})
    
  2. 以下が必要な場合:

    Host
    

    これをウェルカムファイルに追加します(アノテーションを使用してウェルカムファイルを指定することはできません)

    <welcome-file-list>
        <welcome-file>/BaseServlet</welcome-file>
    </welcome-file-list>
    
  3. サーブレット仕様によると"'/'文字のみを含む文字列は、アプリケーションの「デフォルト」サーブレットを示します。"

    しかし、それはすぐに言います

    この場合、サーブレットパスはリクエストURIからコンテキストパスを引いたものであり、パス情報はnullです。

    言い換えれば、あなたのURLが

    Host
    

    サーブレットパスは次のようになります

    "" (empty string)
    

    したがって、ウェルカムファイルリストが必要になります(ただし、WEB-INFではなくwebappディレクトリのindex.htm [l]とindex.jspは、開始ウェルカムファイルリストとして暗黙的に含まれます)

11
Glen Best

編集:

前処理が必要な場合は、URLパターン「/ *」を指定してフィルターを使用し、ディスパッチャーをREQUESTに設定すると、転送が無視されます。

最後の値「/」はすべてのリクエストを意味します。

チェックアウトディスカッション: http://www.coderanch.com/t/366340/Servlets/Java/servlet-mapping-url-pattern

また、サーブレット内で、index.htmlに対する別の転送要求が生成されます。これもサーブレットによってインターセプトされます。

@WebServlet({"/ BaseServlet"、 ""、 "/"})と同じ@WebServlet({"/ BaseServlet"、 "/"})を試してみると、同じエラーが発生します。

これを確認するには、サーブレットに次の出力ステートメントを入力します。

System.out.println(req.getRequestURL());
2
Snehal Patel