処理

DispatcherServlet は、リクエストを次のように処理します。

  • WebApplicationContext が検索され、コントローラーおよびプロセス内の他の要素が使用できる属性としてリクエストでバインドされます。デフォルトでは、DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE キーにバインドされています。

  • ロケールリゾルバーはリクエストにバインドされ、プロセス内の要素がリクエストの処理(ビューのレンダリング、データの準備など)に使用するロケールを解決できるようにします。ロケール解決が不要な場合、ロケールリゾルバーは必要ありません。

  • テーマリゾルバーはリクエストにバインドされ、ビューなどの要素が使用するテーマを決定できるようにします。テーマを使用しない場合、無視できます。

  • マルチパートファイルリゾルバーを指定すると、リクエストはマルチパートについてインスペクションされます。マルチパートが見つかった場合、リクエストはプロセス内の他の要素によるさらなる処理のために MultipartHttpServletRequest にラップされます。マルチパート処理の詳細については、マルチパートリゾルバーを参照してください。

  • 適切なハンドラーが検索されます。ハンドラーが見つかると、そのハンドラー(プリプロセッサー、ポストプロセッサー、コントローラー)に関連付けられた実行チェーンが実行され、モデルをレンダリング用に準備します。あるいは、アノテーション付きコントローラーの場合、ビューを返す代わりに、レスポンスを(HandlerAdapter 内で)レンダリングできます。

  • モデルが返されると、ビューがレンダリングされます。モデルが返されない場合(おそらくセキュリティ上の理由で、プリプロセッサーまたはポストプロセッサーがリクエストをインターセプトしているため)、リクエストはすでに満たされている可能性があるため、ビューはレンダリングされません。

WebApplicationContext で宣言された HandlerExceptionResolver Bean は、リクエスト処理中にスローされた例外を解決するために使用されます。これらの例外リゾルバーを使用すると、ロジックをカスタマイズして例外に対処できます。詳細については、例外を参照してください。

HTTP キャッシングをサポートするために、ハンドラーは WebRequest の checkNotModified メソッドと、コントローラーの HTTP キャッシングで説明されているアノテーション付きコントローラーの追加オプションを使用できます。

web.xml ファイルのサーブレット宣言にサーブレット初期化パラメーター(init-param 要素)を追加することにより、個々の DispatcherServlet インスタンスをカスタマイズできます。次の表に、サポートされているパラメーターを示します。

表 1: DispatcherServlet 初期化パラメーター
パラメーター 説明

contextClass

インスタンス化され、このサーブレットによってローカルに設定される ConfigurableWebApplicationContext を実装するクラス。デフォルトでは、XmlWebApplicationContext が使用されます。

contextConfigLocation

コンテキストの場所を示すために、コンテキストインスタンス(contextClass で指定)に渡される文字列。文字列は、複数のコンテキストをサポートするために、潜在的に複数の文字列で構成されます(区切り文字としてコンマを使用)。Bean が 2 回定義されている複数のコンテキストロケーションの場合、最新のロケーションが優先されます。

namespace

WebApplicationContext の名前空間。デフォルトは [servlet-name]-servlet です。

throwExceptionIfNoHandlerFound

リクエストのハンドラーが見つからなかったときに NoHandlerFoundException をスローするかどうか。次に、例外を HandlerExceptionResolver でキャッチし(たとえば、@ExceptionHandler コントローラーメソッドを使用して)、他の例外として処理できます。

6.1 以降、このプロパティは true に設定され、非推奨になりました。

デフォルトのサーブレット処理も設定されている場合、未解決のリクエストは常にデフォルトのサーブレットに転送され、404 は決して発生しないことに注意してください。