SpringMVCとSpringの関係は何ですか?

著者:
Zhuangsheng Wen リンク:https://www.zhihu.com/question/39678061/answer/312545961
出典:
著者の著作権のほとんどを知っている商用転載については、著者に連絡して承認を得てください。非商用転載については、出典を明記してください。

Spring Web Frameworkの基本プロセス

Spring MVCフレームワークについて理解しました。次に、そのプロセスを見てみましょう

Spring MVCフレームワークはプロセスと同じ大きさです。Webプログラムが起動すると、ContextLoaderServletは対応する構成ファイル情報を読み取り、インジェクションを通じてコン​​トローラーDispatchServletを初期化します。HTTPリクエストを受信すると、DispatchServletはHandlerMappingを実行しますこのリクエストを処理します。HandlerMappingは、リクエストURLに応じてコントローラーを選択します(URLである必要はありません。カスタマイズ可能で、非常に柔軟です)。DispatchServletは、選択されたコントローラーのhandlerRequestメソッドを呼び出し、このメソッドの前後にコントローラーを呼び出しますインターセプター(構成されている場合)、次にビューとモデルのコレクションModelAndViewを返します。フレームワークはViewResolverを介してビューを解決し、Viewオブジェクトを返し、最後にViewのrenderメソッドを呼び出してクライアントに返します。

DispatcherServlet

これはフレームワークのコントローラであり、実行時にコンテキストオブジェクトによって初期化される具象クラスです。コントローラ自体はプロセスを制御せず、単なるコントローラの「コントローラ」です。リクエストの処理の責任を委任するだけです対応するコントローラー。コントローラー
は抽象基本クラスFrameworkServletから継承し、その属性webApplicationContextはWebプログラムコンテキストを表します。このコンテキストオブジェクトのデフォルト実装は、XMLファイルから構成情報を読み取ることです(もちろん、他のファイル形式にすることもできます)。 。WebApplicationContextは実際にはBeansパッケージです。このパッケージは、Springフレームワーク全体の基本構造を提供します。今後、このパッケージのコンテンツを分析します。ただし、WebApplicationContextがWebアプリケーションのコンテキストオブジェクトを表すことだけを知っていれば十分です。

次に、DispatchServletの仕組みを見てみましょう。

DispatchServletは抽象基本クラスFrameworkServletを継承し、FrameworkServletのdoGet()およびdoPost()メソッドはserviceWrapper()を呼び出し、serviceWrapper()にジャンプして確認します。特定の実装がdoService(request)に委譲されていることがわかります。 、response);メソッドです。DispatchServletがdoService()メソッドの機能を実際に実装していることが明確になりました。
特に、FrameworkServletのinitFrameworkServlet()メソッドは、HandlerMappingsなどのオブジェクトを初期化するために使用されるコントローラの初期化メソッドです、これもサブクラスの実装に遅延されます。実際、これはテンプレートパターンの実装です。私たちを呼び出さないで、uを呼び出します。一般に、Springはこの方法で制御の反転を実装します。フレームワークを使用してユーザーではなくフローを制御する

doService()にジャンプして見てみると、実際に機能しているのは別のヘルパー関数doDispatch(request、response)であることがわかります。方法はありません。この2行のコードを読み続けてください。

HandlerExecutionChain mappedHandler = null;
mappedHandler = getHandler(processedRequest、false);

HandlerExecutionChainのソースコードを見ると、コントローラーとそのインターセプターを実際にラップしていることがわかります。

getHandler()は、対応するhandlerMappingオブジェクトをHandlerMappings(これはリストであり、格納されているhandlerMappingオブジェクトです)から取得します。各HandlerMappingオブジェクトは、コントローラーとURLマッピングを表します(実際には、実行時に、HandlerExecutionChainとURLマッピングです。 HandlerExecutionChainオブジェクトは、実際にはコントローラとそのインターセプタのラッパーです。HandlerMappingは、コントローラとURLの間のマッピングと見なすことができます。このHandlerMappingは、実行時に構成ファイルを通じて注入されます。通常、SimpleUrlHandlerMappingサブクラス
はHandlerMappingオブジェクトを取得します。 、引き続き見下ろして見つけます:

if(mappedHandler.getInterceptors()!=null)

    {
    
    
        for (int i = 0; i < mappedHandler.getInterceptors().length; i++) {
    
    
            HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i];
            if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {
    
    
                triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
                return;
            }
            interceptorIndex = i;
        }
    }

これがコントローラーを呼び出すインターセプターです、原則はこの文です:

interceptor.preHandle(processedRequest, response,mappedHandler.getHandler(), mv);

preHandleメソッドは、mapdHandler.getHandler()パラメータを渡して再帰呼び出しを実装します!interceptor.postHandleメソッドは非常に一般的です。このメソッドは、handleRequestメソッドの後に呼び出されるだけです。

読み続けます:

HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

ControllerのhandleRequestの実際の操作がHandlerAdapterのhandleメソッドに委任され、ModelAndViewが返されることがわかりました。ここにレイヤーを追加する意味は、ControllerとDispatchServletを分離することだと思います。

次に、それは非常に簡単です。render()メソッドを呼び出します。このメソッドでは、ViewResolerがビュー名を解析し、ビューオブジェクトのrenderメソッドを呼び出して、適切なビューをユーザーに表示します。

この時点で、コントローラーのプロセスは終了しました

HandlerMapping

HandlerMappingを使用することにより、コントローラーはURLを使用してコントローラーで標準マッピングを実行し、URLマッピングの特定のサブクラスのUrlHandlerMappingを実現できます。

Springでは、セッション、Cookie、またはユーザー状態によるマッピングなどのマッピングをカスタマイズすることもできます。これらすべては、HandlerMappingインターフェースを実装するだけで済みますが、URLマッピングはすでにほとんどの要件を満たすことができます

コントローラ

ControllerはStructs Actionに似ています。Controllerインターフェースには、ModelAndViewオブジェクトを戻すメソッドhandleRequest()が1つだけあります。設計目標が述べたように、各ControllerはJavaコンポーネントであるため、コンテキスト、コンポーネントプロパティで任意に設定できます初期化中に構成されます。Springはいくつかの特定の実装を提供します。

ViewResolver

コントローラは通常、ビューオブジェクトの代わりにビューの名前を含むModelAndViewオブジェクトを返します。これにより、コントローラとビューの間の結合関係が完全に削除され、ここで国際化サポートを提供することもできます。構成ファイルでは、次のことができます。

welcomeView.class = org.springframework.web.servlet.view.InternalResourceView
welcomeView.url=/welcome.jsp
也可以
welcomeView.class = org.springframework.web.servlet.view.xslt.XsltView
welcomeView.url=/xslt/default.xslt

見る

これもJavaコンポーネントです。リクエスト処理やビジネスロジックは行われません。モデルから渡されたデータを取得してデータを表示するだけです。その中のrenderメソッドは次のプロセスに従って機能します。

  1. モデルのデータをリクエストスコープに設定する
  2. ビューのURLを取得する
  3. 対応するURLに転送

おすすめ

転載: blog.csdn.net/qq1350975694/article/details/108735186