186

おなじみのコード:

<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誰かがどのようにマッピングされているか説明できますか?

4

5 に答える 5

285

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

サーブレットの/*は、デフォルトのサーブレットや JSP サーブレットなど、サーブレットコンテナによって提供されるすべてのサーブレットを含む、他のすべてのサーブレットをオーバーライドします。どのようなリクエストを発行しても、最終的にそのサーブレットに送信されます。したがって、これはサーブレットの不適切な URL パターンです。通常は/*aFilterのみで使用します。FilterChain#doFilter(). _

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

/他のサーブレットをオーバーライドしません。他の登録済みサーブレットと一致しないすべてのリクエストに対して、サーブレットコンテナの組み込みのデフォルトサーブレットのみを置き換えます。これは通常、静的リソース (CSS/JS/image/etc) とディレクトリ リストでのみ呼び出されます。servletcontainer に組み込まれているデフォルトのサーブレットは、HTTP キャッシュ要求、メディア (オーディオ/ビデオ) ストリーミング、およびファイル ダウンロードの再開を処理することもできます。通常、デフォルトのサーブレットをオーバーライドする必要はありません。そうしないと、すべてのタスクを処理する必要があり、これは簡単ではありません (JSF ユーティリティ ライブラリOmniFacesにはオープン ソースの 例があります)。)。したがって、これはサーブレットの不適切な URL パターンでもあります。JSP ページがこのサーブレットにヒットしない理由は、servletcontainer のビルトイン JSP サーブレットが呼び出されるためです。これは、デフォルトでより具体的な URL パターンにマッピングされています*.jsp

<url-pattern></url-pattern>

次に、空の文字列の URL パターンもあります 。これは、コンテキスト ルートが要求されたときに呼び出されます。<welcome-file>これは、サブフォルダーが要求されたときに呼び出されないというアプローチとは異なります。これは、「ホームページ サーブレット」が必要な場合に実際に探している URL パターンである可能性が高いです。 空の文字列の URL パターンとスラッシュの URL パターン/がまったく逆に定義されることを直感的に期待していたことを認めなければならないだけなので、多くの初心者がこれについて混乱したことは理解できます。しかし、それはそれが何であるかです。

フロントコントローラー

実際にフロント コントローラー サーブレットを使用する場合は*.html*.do/pages/*、などのより具体的な URL パターンにマップすることをお勧めします/app/*。フロント コントローラーの URL パターンを非表示にして、共通の URL パターンで静的リソースをカバーできます。 、 などのよう/resources/*/static/*、サーブレット フィルターを使用します。/* にマッピングされたフロントコントローラーサーブレットによって静的リソースが処理されないようにする方法も参照してください。Spring MVC には静的リソース サーブレットが組み込まれていることに注意してください。そのため/、Spring で静的リソースに共通の URL パターンを構成すると、そのフロント コントローラーをマップできます。Spring MVC で静的コンテンツを処理する方法も参照してください。

于 2010-11-10T02:13:46.577 に答える
47

マッピング ルールと例を使用して、BalusC の回答を補足したいと思います。

サーブレット 2.5 仕様からのマッピング ルール:

  1. 正確な URL をマップする
  2. ワイルドカード パスをマップする
  3. マップ拡張機能
  4. デフォルトのサーブレットにマップする

この例では、3 つのサーブレットがあります。/ は、当社がインストールしたデフォルトのサーブレットです。Tomcat は、jsp と jspx を提供するために 2 つのサーブレットをインストールします。だから地図にhttp://host:port/context/hello

  1. 次に、正確な URL サーブレットがインストールされていません。
  2. ワイルドカード パス サーブレットはインストールされていません。次へ。
  3. どの拡張子とも一致しません。次へ。
  4. デフォルトのサーブレットにマップして、戻ります。

マッピングするhttp://host:port/context/hello.jsp

  1. 次に、正確な URL サーブレットがインストールされていません。
  2. ワイルドカード パス サーブレットはインストールされていません。次へ。
  3. 拡張サーブレットが見つかりました。戻ります。
于 2010-11-10T17:00:00.267 に答える
26

404私は何時間も苦しんでいたので、おそらく URL がどのようにマップされるかを知る必要があるでしょう。リクエストを処理するハンドラには 2 種類あります。BeanNameUrlHandlerMappingSimpleUrlHandlerMapping。を定義したときservlet-mapping、 を使用してSimpleUrlHandlerMappingいます。知っておく必要があることの 1 つは、これら 2 つのハンドラーが、alwaysUseFullPathデフォルトでと呼ばれる共通のプロパティを共有していることfalseです。

falseこれは、Spring がフルパスを使用して URL をコントローラーにマップしないことを意味します。どういう意味ですか?を定義すると、次のことを意味しますservlet-mapping

<servlet-mapping>
    <servlet-name>viewServlet</servlet-name>
    <url-pattern>/perfix/*</url-pattern>
</servlet-mapping>

ハンドラーは実際に*パーツを使用してコントローラーを見つけます。たとえば、次のコントローラーを404使用してリクエストすると、エラーが発生します。/perfix/api/feature/doSomething

@Controller()
@RequestMapping("/perfix/api/feature")
public class MyController {
    @RequestMapping(value = "/doSomething", method = RequestMethod.GET) 
    @ResponseBody
    public String doSomething(HttpServletRequest request) {
        ....
    }
}

パーフェクトマッチですよね?しかし、なぜ404。前述のように、のデフォルト値alwaysUseFullPathは false です。つまり、リクエストで/api/feature/doSomethingは、対応するコントローラーを見つけるためにのみ使用されますが、そのパスを気にするコントローラーはありません。URL をMyController baseに変更する/perfix/perfix/api/feature/doSomethingか、削除する必要があります。perfix@RequestingMapping

于 2015-09-15T07:01:48.833 に答える
2

との本質的な違いは/*/マッピング/*を含むサーブレットは拡張マッピングを含むサーブレットよりも前に選択される (のように*.html) のに対して、マッピングを含むサーブレットは/拡張マッピングが考慮された後にのみ選択される (そして、 t は他のものと一致します---それは「デフォルトのサーブレット」です)。

特に、/*マッピングは常に/マッピングの前に選択されます。どちらかを指定すると、リクエストがコンテナ自体のデフォルト サーブレットに到達するのを防ぎます。

いずれかが選択されるのは、正確に一致する ( のような/foo/bar) サーブレット マッピングと、より長いパス マッピングである/*(のような) サーブレット マッピングの後でのみ/foo/*です。空の文字列のマッピングは、コンテキスト ルート ( ) と完全に一致することに注意してくださいhttp://host:port/context/

http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.htmlでバージョン3.1で入手可能なJavaサーブレット仕様の第12章を参照してください。

于 2017-07-27T20:49:00.500 に答える