これは不可能です。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 が内部で行っていることです。ただし、デフォルトのサーブレットの作成は、条件付きリクエスト、キャッシュ リクエスト、ストリーミング リクエスト、レジューム リクエスト、ディレクトリ リスト リクエストなどに対応できる必要があるため、簡単な作業ではありません。
以下も参照してください。