1. ホーム
  2. servlets

[解決済み] サーブレットマッピングのurlパターンにおける/と/*の違いについて

2022-04-16 19:57:55

質問

おなじみのコードです。

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

<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

私の理解では /*http://host:port/context/* .

どうですか? / ? それは確かに http://host:port/context ルートのみです。実際、それは http://host:port/context/hello は拒否されますが http://host:port/context/hello.jsp .

がどのようなものか説明できる人はいますか? http://host:port/context/hello をマッピングしてください。

どのように解決するのですか?

<url-pattern>/*</url-pattern>

/* は他のすべてのサーブレットを上書きします。その中には、デフォルトサーブレットやJSPサーブレットなど、サーブレットコンテナが提供するすべてのサーブレットも含まれます。どのようなリクエストを送っても、最終的にはそのサーブレットに到達します。このように、これはサーブレットにとって良くないURLパターンです。通常は /* の上に Filter だけです。を呼び出すことで、より特定のURLパターンでリッスンしているサーブレットに リクエストを継続させることができます。 FilterChain#doFilter() .

<url-pattern>/</url-pattern>

/ は他のサーブレットを上書きすることはありません。他の登録されたサーブレットにマッチしないすべてのリクエストに対して、 servletcontainer に組み込まれているデフォルトのサーブレットを置き換えるだけです。これは通常、静的なリソース (CSS/JS/image/etc) とディレクトリリストに対してのみ実行されます。サーブレットコンテナに内蔵されたデフォルトサーブレットは、HTTPキャッシュリクエスト、メディア(オーディオ/ビデオ)ストリーミング、ファイルダウンロードの再開にも対応します。通常、デフォルトサーブレットを上書きすることはありません。そうしないと、すべてのタスクを処理する必要があり、それは決して簡単なことではありません (JSF ユーティリティライブラリ オムニフェーズ には オープンソース ). このように、これもサーブレットにとっては良くないURLパターンです。なぜ JSP ページがこのサーブレットにヒットしないかというと、サーブレットコンテナに内蔵された JSP サーブレットが起動されるからです。 *.jsp .

<url-pattern></url-pattern>

また、空文字列のURLパターンもあります。 . これは、コンテキストルートが要求されたときに呼び出されます。これは <welcome-file> のアプローチでは、サブフォルダが要求されたときに呼び出されることはありません。これは、あなたが実際に探しているURLパターンである可能性が高く、" ホームページサーブレット "です。ただ、私は直感的に空文字列のURLパターンを期待してしまうので とスラッシュのURLパターン / このため、多くのスターターがこの件で混乱したことは理解できます。でも、それが現実なのです。

フロントコントローラ

を使用する場合 実際に フロントコントローラサーブレットが必要な場合は、以下のような URL パターンを使用するとよいでしょう。 *.html , *.do , /pages/* , /app/* などがあります。フロントコントローラーのURLパターンを隠し、静的なリソースを以下のような共通のURLパターンでカバーすることができます。 /resources/* , /static/* などを、サーブレットフィルタの助けを借りて実行します。以下も参照してください。 にマッピングされたフロントコントローラサーブレットで静的リソースを扱わないようにするには? . Spring MVC には静的リソースサーブレットが組み込まれているので、フロントコントローラを / を設定すれば、Springの静的リソースに共通のURLパターンを設定することができます。以下も参照してください。 Spring MVCで静的コンテンツを扱うには?