クラス DispatcherServlet

実装されたすべてのインターフェース:
ServletEEServletConfigEESerializableSEAwareApplicationContextAwareEnvironmentAwareEnvironmentCapable

public class DispatcherServlet extends FrameworkServlet
HTTP リクエストハンドラー / コントローラー用の主要ディスパッチャー。Web UI コントローラーまたは HTTP ベースのリモートサービスエクスポーター用。Web リクエストを処理するために登録されたハンドラーにディスパッチし、便利なマッピングおよび例外処理機能を提供します。

このサーブレットは非常に柔軟です。適切なアダプタークラスをインストールすることで、ほぼすべてのワークフローで使用できます。他のリクエスト駆動型 Web MVC フレームワークと区別する次の機能を提供します。

  • JavaBeans 構成メカニズムに基づいています。
  • 事前構築済みまたはアプリケーションの一部として提供される HandlerMapping 実装を使用して、ハンドラーオブジェクトへのリクエストのルーティングを制御できます。デフォルトは BeanNameUrlHandlerMapping および RequestMappingHandlerMapping です。HandlerMapping オブジェクトは、サーブレットのアプリケーションコンテキストで Bean として定義でき、HandlerMapping インターフェースを実装し、存在する場合はデフォルトの HandlerMapping をオーバーライドします。HandlerMappings には、任意の Bean 名を付けることができます(型ごとにテストされます)。
  • 任意の HandlerAdapter を使用できます。これにより、任意のハンドラーインターフェースを使用できます。デフォルトのアダプターは、それぞれ Spring の HttpRequestHandler および Controller インターフェース用の HttpRequestHandlerAdapterSimpleControllerHandlerAdapter です。デフォルトの RequestMappingHandlerAdapter も登録されます。HandlerAdapter オブジェクトは、デフォルトの HandlerAdapters をオーバーライドして、アプリケーションコンテキストに Bean として追加できます。HandlerMappings と同様に、HandlerAdapters には任意の Bean 名を付けることができます(型ごとにテストされます)。
  • ディスパッチャーの例外解決戦略は、HandlerExceptionResolver を介して指定できます。たとえば、特定の例外をエラーページにマッピングします。デフォルトは ExceptionHandlerExceptionResolverResponseStatusExceptionResolverDefaultHandlerExceptionResolver です。これらの HandlerExceptionResolvers は、アプリケーションコンテキストによってオーバーライドできます。HandlerExceptionResolver には、任意の Bean 名を付けることができます(型ごとにテストされます)。
  • そのビュー解決戦略は、ViewResolver 実装を介して指定でき、シンボリックビュー名をビューオブジェクトに解決します。デフォルトは InternalResourceViewResolver です。ViewResolver オブジェクトは、デフォルトの ViewResolver をオーバーライドして、アプリケーションコンテキストに Bean として追加できます。ViewResolvers には、任意の Bean 名を付けることができます(型ごとにテストされます)。
  • View またはビュー名がユーザーによって提供されない場合、構成された RequestToViewNameTranslator は現在のリクエストをビュー名に変換します。対応する Bean 名は "viewNameTranslator" です。デフォルトは DefaultRequestToViewNameTranslator です。
  • マルチパートリクエストを解決するためのディスパッチャーの戦略は、MultipartResolver 実装によって決定されます。標準のサーブレットマルチパート処理の実装が含まれています。MultipartResolver Bean の名前は "multipartResolver" です。デフォルトはなしです。
  • そのロケール解決戦略は LocaleResolver によって決定されます。すぐに使用できる実装は、HTTP Accept ヘッダー、Cookie、セッションを介して機能します。LocaleResolver Bean 名は "localeResolver" です。デフォルトは AcceptHeaderLocaleResolver です。
  • そのテーマ解決戦略は ThemeResolver によって決定されます。固定テーマと Cookie およびセッションストレージの実装が含まれています。ThemeResolver Bean の名前は "themeResolver" です。デフォルトは FixedThemeResolver です。テーマのサポートは 6.0 の時点で廃止されており、直接の代替はありません。

注: @RequestMapping アノテーションは、対応する HandlerMapping (型レベルアノテーション用)および / または HandlerAdapter (メソッドレベルアノテーション用)がディスパッチャーに存在する場合にのみ処理されます。これはデフォルトです。ただし、カスタム HandlerMappings または HandlerAdapters を定義する場合は、@RequestMapping を使用する場合は、対応するカスタム RequestMappingHandlerMapping および / または RequestMappingHandlerAdapter も定義する必要があります。

Web アプリケーションは、任意の数の DispatcherServlets を定義できます。各サーブレットは独自の名前空間で動作し、マッピングやハンドラーなどを使用して独自のアプリケーションコンテキストをロードします。ContextLoaderListener によってロードされたルートアプリケーションコンテキストのみが共有されます。

DispatcherServlet には、内部で独自のコンテキストを作成するのではなく、Web アプリケーションコンテキストを挿入することができます。これは、サーブレットインスタンスのプログラムによる登録をサポートする Servlet 3.0+ 環境で役立ちます。詳細については、DispatcherServlet(WebApplicationContext) javadoc を参照してください。

作成者:
Rod Johnson, Juergen Hoeller, Rob Harrop, Chris Beams, Rossen Stoyanchev, Sebastien Deleuze
関連事項:
  • フィールドの詳細

  • コンストラクターの詳細

  • メソッドの詳細

    • setDetectAllHandlerMappings

      public void setDetectAllHandlerMappings(boolean detectAllHandlerMappings)
      このサーブレットのコンテキストですべての HandlerMapping Bean を検出するかどうかを設定します。それ以外の場合、"handlerMapping" という名前の Bean が 1 つだけ期待されます。

      デフォルトは "true" です。コンテキストで複数の HandlerMapping Bean が定義されているにもかかわらず、このサーブレットで単一の HandlerMapping を使用する場合は、これをオフにします。

    • setDetectAllHandlerAdapters

      public void setDetectAllHandlerAdapters(boolean detectAllHandlerAdapters)
      このサーブレットのコンテキストですべての HandlerAdapter Bean を検出するかどうかを設定します。そうでない場合は、"handlerAdapter" という名前の単一の Bean のみが期待されます。

      デフォルトは "true" です。コンテキストで複数の HandlerAdapter Bean が定義されているにもかかわらず、このサーブレットで単一の HandlerAdapter を使用する場合は、これをオフにします。

    • setDetectAllHandlerExceptionResolvers

      public void setDetectAllHandlerExceptionResolvers(boolean detectAllHandlerExceptionResolvers)
      このサーブレットのコンテキストですべての HandlerExceptionResolver Bean を検出するかどうかを設定します。それ以外の場合、"handlerExceptionResolver" という名前の単一の Bean のみが予期されます。

      デフォルトは "true" です。コンテキストで複数の HandlerExceptionResolver Bean が定義されているにもかかわらず、このサーブレットで単一の HandlerExceptionResolver を使用する場合は、これをオフにします。

    • setDetectAllViewResolvers

      public void setDetectAllViewResolvers(boolean detectAllViewResolvers)
      このサーブレットのコンテキストですべての ViewResolver Bean を検出するかどうかを設定します。それ以外の場合、"viewResolver" という名前の単一の Bean のみが期待されます。

      デフォルトは "true" です。コンテキストで複数の ViewResolver Bean が定義されているにもかかわらず、このサーブレットで単一の ViewResolver を使用する場合は、これをオフにします。

    • setThrowExceptionIfNoHandlerFound

      @DeprecatedSE(since="6.1", forRemoval=true) public void setThrowExceptionIfNoHandlerFound(boolean throwExceptionIfNoHandlerFound)
      非推奨、削除予定: この API 要素は、将来のバージョンで削除される可能性があります。
      6.1 では、このプロパティはデフォルトで true に設定されており、カスタマイズする必要はありません。実際には、DispatcherServlet は常に NoHandlerFoundException を生成し、HandlerExceptionResolver を通じて処理できるようにする必要があります。
      このリクエストのハンドラーが見つからなかった場合、NoHandlerFoundException をスローするかどうかを設定します。この例外は、HandlerExceptionResolver または @ExceptionHandler コントローラーメソッドでキャッチできます。

      DefaultServletHttpRequestHandler が使用される場合、リクエストは常にデフォルトのサーブレットに転送され、その場合 NoHandlerFoundException は決してスローされないことに注意してください。

      デフォルトは "false" です。これは、DispatcherServlet がサーブレットレスポンスを介して NOT_FOUND エラーを送信することを意味します。

      導入:
      4.0
    • setCleanupAfterInclude

      public void setCleanupAfterInclude(boolean cleanupAfterInclude)
      インクルードリクエストの後にリクエスト属性のクリーンアップを実行するかどうか、つまり、DispatcherServlet がインクルードリクエスト内で処理した後にすべてのリクエスト属性の元の状態をリセットするかどうかを設定します。そうでない場合は、DispatcherServlet 自身のリクエスト属性のみがリセットされますが、JSP のモデル属性やビューによって設定される特別な属性(JSTL など)はリセットされません。

      デフォルトは "true" です。これを強くお勧めします。ビューは、(動的)インクルードによって設定されたリクエスト属性に依存すべきではありません。これにより、含まれているコントローラーによってレンダリングされた JSP ビューは、副作用を引き起こすことなく、メイン JSP と同じ名前であっても、任意のモデル属性を使用できます。特別な必要がある場合のみ、これをオフにします。たとえば、メインの JSP が意図的に含まれているコントローラーによってレンダリングされた JSP ビューの属性にアクセスできるようにする場合です。

    • onRefresh

      protected void onRefresh(ApplicationContext context)
      この実装は initStrategies(org.springframework.context.ApplicationContext) を呼び出します。
      オーバーライド:
      クラス FrameworkServletonRefresh 
      パラメーター:
      context - 現在の WebApplicationContext
      関連事項:
    • initStrategies

      protected void initStrategies(ApplicationContext context)
      このサーブレットが使用する戦略オブジェクトを初期化します。

      さらに戦略オブジェクトを初期化するために、サブクラスでオーバーライドされる場合があります。

    • getThemeSource

      @DeprecatedSE @Nullable public final ThemeSource getThemeSource()
      使用すべきではありません。
      このサーブレットの ThemeSource があれば、それを返します。そうでない場合は null を返します。

      ThemeSource インターフェースを実装している場合、デフォルトでは WebApplicationContext を ThemeSource として返します。

      戻り値:
      ThemeSource(ある場合)
      関連事項:
    • getMultipartResolver

      @Nullable public final MultipartResolver getMultipartResolver()
      このサーブレットの MultipartResolver がある場合は入手します。
      戻り値:
      このサーブレットが使用する MultipartResolver。ない場合は null (マルチパートサポートが利用できないことを示す)
    • getHandlerMappings

      @Nullable public final ListSE<HandlerMapping> getHandlerMappings()
      WebApplicationContext の型ごとに検出された、または DispatcherServlet.properties の戦略のデフォルトセットに基づいて初期化された、構成済みの HandlerMapping Bean を返します。

      注意 : onRefresh(ApplicationContext) の前に呼び出された場合、このメソッドは null を返すことがあります。

      戻り値:
      設定されたマッピングを持つ不変リスト、またはまだ初期化されていない場合は null 
      導入:
      5.0
    • getDefaultStrategy

      protected <T> T getDefaultStrategy(ApplicationContext context, ClassSE<T> strategyInterface)
      指定された戦略インターフェースのデフォルト戦略オブジェクトを返します。

      デフォルトの実装は getDefaultStrategies(org.springframework.context.ApplicationContext, java.lang.Class<T>) に委譲し、リスト内の単一のオブジェクトを期待します。

      パラメーター:
      context - 現在の WebApplicationContext
      strategyInterface - 戦略インターフェース
      戻り値:
      対応する戦略オブジェクト
      関連事項:
    • getDefaultStrategies

      protected <T> ListSE<T> getDefaultStrategies(ApplicationContext context, ClassSE<T> strategyInterface)
      特定の戦略インターフェースのデフォルト戦略オブジェクトのリストを作成します。

      デフォルトの実装では、"DispatcherServlet.properties" ファイル(DispatcherServlet クラスと同じパッケージ内)を使用して、クラス名を決定します。コンテキストの BeanFactory を通じて戦略オブジェクトをインスタンス化します。

      パラメーター:
      context - 現在の WebApplicationContext
      strategyInterface - 戦略インターフェース
      戻り値:
      対応する戦略オブジェクトのリスト
    • createDefaultStrategy

      protected ObjectSE createDefaultStrategy(ApplicationContext context, ClassSE<?> clazz)
      デフォルト戦略を作成します。

      デフォルトの実装では AutowireCapableBeanFactory.createBean(Class) を使用します。

      パラメーター:
      context - 現在の WebApplicationContext
      clazz - インスタンス化する戦略実装クラス
      戻り値:
      完全に構成された戦略インスタンス
      関連事項:
    • doService

      protected void doService(HttpServletRequestEE request, HttpServletResponseEE response) throws ExceptionSE
      DispatcherServlet 固有のリクエスト属性を公開し、実際のディスパッチのために doDispatch(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse) に委譲します。
      次で指定:
      クラス FrameworkServletdoService 
      パラメーター:
      request - 現在の HTTP リクエスト
      response - 現在の HTTP レスポンス
      例外:
      ExceptionSE - あらゆる種類の処理が失敗した場合
      関連事項:
    • doDispatch

      protected void doDispatch(HttpServletRequestEE request, HttpServletResponseEE response) throws ExceptionSE
      ハンドラーへの実際のディスパッチを処理します。

      ハンドラーは、サーブレットの HandlerMappings を順番に適用することにより取得されます。HandlerAdapter は、サーブレットにインストールされている HandlerAdapters を照会して、ハンドラークラスをサポートする最初の HandlerAdapter を見つけることによって取得されます。

      すべての HTTP メソッドは、このメソッドによって処理されます。許容されるメソッドを決定するのは、HandlerAdapters またはハンドラー自身です。

      パラメーター:
      request - 現在の HTTP リクエスト
      response - 現在の HTTP レスポンス
      例外:
      ExceptionSE - あらゆる種類の処理が失敗した場合
    • buildLocaleContext

      protected LocaleContext buildLocaleContext(HttpServletRequestEE request)
      指定されたリクエストの LocaleContext を構築し、リクエストのプライマリロケールを現在のロケールとして公開します。

      デフォルトの実装では、ディスパッチャーの LocaleResolver を使用して現在のロケールを取得しますが、これはリクエスト中に変更される可能性があります。

      オーバーライド:
      クラス FrameworkServletbuildLocaleContext 
      パラメーター:
      request - 現在の HTTP リクエスト
      戻り値:
      対応する LocaleContext
      関連事項:
    • checkMultipart

      protected HttpServletRequestEE checkMultipart(HttpServletRequestEE request) throws MultipartException
      リクエストをマルチパートリクエストに変換し、マルチパートリゾルバーを使用可能にします。

      マルチパートリゾルバーが設定されていない場合は、既存のリクエストを使用します。

      パラメーター:
      request - 現在の HTTP リクエスト
      戻り値:
      処理されたリクエスト (必要に応じてマルチパートラッパー)
      例外:
      MultipartException
      関連事項:
    • cleanupMultipart

      protected void cleanupMultipart(HttpServletRequestEE request)
      指定されたマルチパートリクエストで使用されているリソースをクリーンアップします(存在する場合)。
      パラメーター:
      request - 現在の HTTP リクエスト
      関連事項:
    • getHandler

      @Nullable protected HandlerExecutionChain getHandler(HttpServletRequestEE request) throws ExceptionSE
      このリクエストの HandlerExecutionChain を返します。

      すべてのハンドラーマッピングを順番に試行します。

      パラメーター:
      request - 現在の HTTP リクエスト
      戻り値:
      HandlerExecutionChain、またはハンドラーが見つからなかった場合は null 
      例外:
      ExceptionSE
    • noHandlerFound

      protected void noHandlerFound(HttpServletRequestEE request, HttpServletResponseEE response) throws ExceptionSE
      ハンドラーが見つかりません → 適切な HTTP レスポンスステータスを設定します。
      パラメーター:
      request - 現在の HTTP リクエスト
      response - 現在の HTTP レスポンス
      例外:
      ExceptionSE - レスポンスの準備に失敗した場合
    • getHandlerAdapter

      protected HandlerAdapter getHandlerAdapter(ObjectSE handler) throws ServletExceptionEE
      このハンドラーオブジェクトの HandlerAdapter を返します。
      パラメーター:
      handler - アダプターを見つけるためのハンドラーオブジェクト
      例外:
      ServletExceptionEE - ハンドラーの HandlerAdapter が見つからない場合。これは致命的なエラーです。
    • processHandlerException

      @Nullable protected ModelAndView processHandlerException(HttpServletRequestEE request, HttpServletResponseEE response, @Nullable ObjectSE handler, ExceptionSE ex) throws ExceptionSE
      登録された HandlerExceptionResolvers を介してエラー ModelAndView を判別します。
      パラメーター:
      request - 現在の HTTP リクエスト
      response - 現在の HTTP レスポンス
      handler - 実行されたハンドラー、または例外時に何も選択されなかった場合は null (たとえば、マルチパート解決が失敗した場合)
      ex - ハンドラーの実行中にスローされた例外
      戻り値:
      転送する対応する ModelAndView
      例外:
      ExceptionSE - エラー ModelAndView が見つからなかった場合
    • render

      protected void render(ModelAndView mv, HttpServletRequestEE request, HttpServletResponseEE response) throws ExceptionSE
      指定された ModelAndView をレンダリングします。

      これは、リクエストを処理する最後の段階です。ビューを名前で解決する必要がある場合があります。

      パラメーター:
      mv - レンダリングする ModelAndView
      request - 現在の HTTP サーブレットリクエスト
      response - 現在の HTTP サーブレットレスポンス
      例外:
      ServletExceptionEE - ビューが欠落しているか、解決できない場合
      ExceptionSE - ビューのレンダリングに問題がある場合
    • getDefaultViewName

      @Nullable protected StringSE getDefaultViewName(HttpServletRequestEE request) throws ExceptionSE
      指定されたリクエストをデフォルトのビュー名に変換します。
      パラメーター:
      request - 現在の HTTP サーブレットリクエスト
      戻り値:
      ビュー名 (または、デフォルトが見つからない場合は null )
      例外:
      ExceptionSE - ビュー名の変換に失敗した場合
    • resolveViewName

      @Nullable protected View resolveViewName(StringSE viewName, @Nullable MapSE<StringSE,ObjectSE> model, LocaleSE locale, HttpServletRequestEE request) throws ExceptionSE
      指定されたビュー名を(レンダリングされる)View オブジェクトに解決します。

      デフォルトの実装は、このディスパッチャーのすべての ViewResolvers をリクエストします。潜在的に特定のモデル属性またはリクエストパラメーターに基づいて、カスタム解決戦略のためにオーバーライドできます。

      パラメーター:
      viewName - 解決するビューの名前
      model - ビューに渡されるモデル
      locale - 現在のロケール
      request - 現在の HTTP サーブレットリクエスト
      戻り値:
      View オブジェクト、または何も見つからない場合は null 
      例外:
      ExceptionSE - ビューを解決できない場合 (通常、実際の View オブジェクトの作成に問題がある場合)
      関連事項: