3

サーブレットをにマップしたいのですが/*、無限ループで失敗しました。

<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>my.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Javaコードは次のとおりです。

public class HelloServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response){
        request.getRequestDispatcher("/WEB-INF/jsps/hello.jsp").forward(request, response);
    }

}

にマップすると/hello、すべてが正常に機能します。

HelloServletマップされると/*、も呼び出されRequestDispatcher#forward()、無限ループが発生します。

これはどのように発生し、どうすれば解決できますか?

4

2 に答える 2

5

これは不可能です。JSP は実際にコンテナーの組み込みを呼び出す必要がありJspServletます。ただし、/*webapp によって定義されたマッピングの方が優先されます。

のようなより具体的な URL パターンにサーブレットをマップし、/pages/*非静的リクエストをそのサーブレットに転送するサーブレット フィルターを作成する必要があります。はい、非静的リクエスト (画像/CSS/JS ファイル) も でカバーされ/*ますが、サーブレットで処理するべきではありません。

/resourcesフォルダーにすべての静的リソースがあると仮定すると、次のようにする必要があります。

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/pages/*</url-pattern>
</servlet-mapping>

フィルターの次のようにdoFilter():

HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/resources")) {
    chain.doFilter(request, response); // Goes to container's own default servlet.
} else {
    request.getRequestDispatcher("/pages" + uri).forward(request, response); // Goes to controller servlet.
}

/pagesこれは、URLを変更することなく完全に透過的に行われます。JSP への転送は、フィルターまたはサーブレットをトリガーしません。デフォルトでは、フィルタは転送時に開始されず、JSP 転送パスはコントローラ サーブレットの URL パターンと一致しなくなります。

または、独自のデフォルト サーブレット実装がある/場合は、リクエストがフロント コントローラー リクエストとして適用できない場合に、サーブレットをマップしてデフォルト サーブレットに委譲させることができます。これは、Spring MVC が内部で行っていることです。ただし、デフォルトのサーブレットの作成は、条件付きリクエスト、キャッシュ リクエスト、ストリーミング リクエスト、レジューム リクエスト、ディレクトリ リスト リクエストなどに対応できる必要があるため、簡単な作業ではありません。

以下も参照してください。

于 2012-12-18T14:29:56.127 に答える
-1

これは、JSF のマッピングで FORWARD が使用されている場合に無限ループに陥るサーブレット フィルターと重複する可能性があります。

それ以外の場合は、JSP に何が含まれているかを確認する必要があります。この動作を引き起こす可能性のある css または画像ファイルを要求している可能性があります。また、ワイルドカードなしで試すことをお勧めします。

于 2012-12-18T14:25:10.167 に答える