SpringMVCワークフローを次の図に示します。
DispatcherServletは、ディストリビューターとして機能するコアクラスであることがわかります。その継承関係は次のとおりです。
DispatcherServletはFrameworkから継承し、HttpServletBeanから継承し、HttpServletから継承していることがわかります。
したがって、DispatcherServlerはサーブレットです。サーブレットコンテナから呼び出して実行できます。
ソースコードを使用してフローチャートを説明します。
1.ユーザーのリクエストはtomcatによってDispatchServletに送信されます
リクエストがTomcatを介してサーブレットに到達する方法:https://blog.csdn.net/sumengnan/article/details/111504047
2. dispatchServletは、最初にプロセッサマッパーにクエリを実行し、プロセッサ実行チェーン(インターセプターとハンドラーを含む)に戻ります。
サーブレットに到達した後、最終的にdoDispatchメソッドで実行されます
getHandlerメソッドの内容は次のとおりです。初期化の開始時に取得されたhandlerMappingに従って、適切なプロセッサマッパーを1つずつ見つけます。
図に示すように、handlerMappingの各実装クラスのgetHandlerInternalメソッドを1つずつ呼び出します。
可能であれば、ハンドラーを解析して実行を続行し、HandlerExecutionChain実行チェーンをカプセル化して戻ります。
次の図に示すように、新しいHandlerExecutionChainを使用して実行チェーンを作成し、addInterceptorを使用してインターセプターを追加します。
HandlerMappingには、さまざまなマッピング構成メソッドを処理するために使用されるさまざまな実装クラスがあります。
例えば:
- BeanNameUrlHandlerMapping: xmlのBeanタグ構成プロセッサー・メソッド。例:<bean id = "aController" name = "/ a.action" class = "com.xxx.simpleController" />
- SimpleUrlHandlerMapping: xmlのBean構成のurlMap属性は、要求URLからコントローラー(コントローラーハンドラーBean)へのマッピングを実装します。<bean class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name = "urlMap"> <map> <entry key = "a.action" value-ref = "aController" /> </ map > </ property> </ bean>
- RequestMappingHandlerMapping: @RequestMappingアノテーションの処理に使用されるハンドラーメソッド
プロセッサマッパーHandlerMappingをカスタマイズすることもできますが、注文の順序に注意してください(Orderインターフェイスまたは@Orderアノテーションを実装します)
3. dispatchServletは、対応するプロセッサアダプターにクエリを実行し、プロセッサーアダプターはカスタムコントローラーを呼び出し(インターセプターはメソッドの前にインターセプターを実行します)、ModelAndViewオブジェクト(論理ビューを含む)を返し、インターセプターのpostメソッドを実行します。
doDispatchメソッドをgetHandlerAdapaterメソッドまで実行し続けます
getHandlerAdapterメソッドの内容は次のとおりです。初期化の開始時に取得したhandlerAdapterに従って、適切なプロセッサアダプタを1つずつ見つけます。
HandlerAdapterインターフェースには、次のようなさまざまな実装クラスがあります。これらは、さまざまなハンドラーを呼び出すために使用されます。
例えば:
- HttpRequestHandlerAdapterは、HttpRequestHandlerインターフェイスを実装するコントローラーを呼び出すために使用されます
- SimpleControllerHandlerAdapterは 、コントローラーインターフェイスを実装するコントローラーを呼び出すために使用されます
- RequestMappingHandlerAdapterは 、@ RequestMappingアノテーション付きコントローラーを呼び出すために使用されます
これらの3つは一般的に使用されますが、興味があれば他の人も試すことができます。
SpringMVCがコントローラーコントローラーを実装する3つの方法は?
1.コントローラーインターフェイスを実装します(戻り値はModelAndViewです)
2. HttpRequestHandlerインターフェースを実装します(戻り値なし)
3. @ Controllerまたは@RestControllerアノテーション
コントローラーを呼び出すようにアダプターをカスタマイズする場合は、HandlerAdapterインターフェースを実装できますが、注文順序に注意してください(Orderインターフェースまたは@Orderアノテーションを実装してください)。
インターセプターを呼び出すタイミングは次のとおりです。
ここにはもう1つの重要なポイントがあります。つまり、アノテーション@RequestMappingが使用されている場合、リフレクション呼び出しのパラメーターはどのように解析されますか?
参照:https://blog.csdn.net/sumengnan/article/details/113774179
4. dispatchServletは、対応するビューリゾルバーを照会し、ビュー(実際のビュー)を返します。
doDispatchメソッドをprocessDispatchResultメソッドまで実行し続けます
ハンドラーがmvビューに戻ると、レンダリング操作を実行するためにrenderメソッドに入ります。それ以外の場合は、スキップします。
論理ビューviewNameの名前がModelAndViewオブジェクトに設定されている場合は、対応するビューリゾルバーを探して、ビューオブジェクトを返します。
ViewResolverビューリゾルバーインターフェイスの実装クラスは次のとおりです。
ビュービューインターフェイスの実装クラスは次のとおりです。
5.ビューをレンダリングしてから、インターセプターのAfterメソッドを実行します。
引き続きダウンして、ビューインターフェイスのrenderメソッドを呼び出します
メソッドの後にインターセプターを実行する
6.ユーザーに戻る
MVCカスタム構成
3つの方法:
- WebMvcConfigurerインターフェースを実装する
- WebMvcConfigurerAdapterクラスを継承します(廃止)
- WebMvcConfigrutionSupportクラスを継承します
springboot環境では、WebMvcConfigrutionSupportクラスを継承しないことをお勧めします。springboot自動構成クラスWebMvcAutoConfigurationには@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)アノテーションがあるため、springbootはそれを自動的に構成するのに役立ちません。また、ResourceHandlersなどのさまざまなコンポーネントを手動で構成する必要があります。そうしないと、静的リソースにアクセスするときに404が発生します。
WebMvcConfigurerインターフェイスの各メソッドの説明については、https ://blog.csdn.net/sumengnan/article/details/109064789を参照してください。
1. 2. WebMvcConfigurerインターフェースを実装し、WebMvcConfigurerAdapterクラスを継承することは実際には効果ですが、2番目のものは古くなっています。
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/nihao").setViewName("success");
}
//……其他方法
}
3.WebMvcConfigrutionSupportクラスを継承します
@Configuration
class MyMvcConfig extends WebMvcConfigurationSupport {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/nihao").setViewName("success");
}
//……其他方法
}
拡張:
springboot環境にいるときは、application.protiresで以下を構成できます。
# SPRING MVC
spring.mvc.locale=en_UK
spring.mvc.date-format=yyyy-MM-dd
実際、これは、最後にWebMvcConfigrutionSupportクラスを継承する方法で登録された構成です。
Springbootは、構成をWebMvcPropertiesクラスにカプセル化します