springmvc 소스 해석 (소개)

 

1, 클라이언트 요청은 DispatcherServlet에 제출
도 2에서, 모든 HandlerMapping 하나 이상의 쿼리 제어기 처리 요구하는 결과의 DispatcherServlet 제어기.
3, DispatcherServlet은 컨트롤러에 요청을 전달한다.
4 후, 컨트롤러는 비즈니스 로직 계층 처리의 ModelAndView를 반환 전화
5, DispatcherServlet에 쿼리 하나 이상의 ViewResoler 뷰 리졸버는, 지정된 뷰의 ModelAndView를 찾을 수
6,보기는 클라이언트에 결과를 표시 할 책임이

 

소스 설명 : 첫째, 우리는 DispatcherServlet이와 핸들러의 시작을 얻을 수있는 방법을 찾아

 

 

 

그러면 결국 처리기 또는 널 (null)을 반환 할 수이 방법으로, HandlerExecutionChain을 된 (핸들러의 유형은 반환되지 않고, 실행 체인) 형식을 반환

  첫째, HandlerMapping에이 비어 있지, 성립 된 경우, while 루프를 입력합니다 여부를 확인 후 HandlerMapping에는 무엇입니까? 우리는 디버그를 엽니 다 보면

 

그래서 중단 어디를 추가해야 하는가? 우리는 여기서 방법 () 플러스의 핵심하는 doDispatch한다.

 

 

그런 다음 및 getHandler를 입력 처리기 방법을 가서 () 메소드

알 수있는 바와 같이, 두 객체들의 집합도이다 HandlerMapping에 수집하고, 두 개체가 핸들러 일치한다

 

BeanNameUrlHandlerMapping은, 컬렉션에 우리가 BeanNameUrlHandlerMapping 객체가 볼 수있는, 다음, 핸들러가 비어 문이 아닌 경우, 루프에서 반환 핸들러를 입력 : 다음 단계를 입력, 우리는지도를 볼 수 있습니다

 

반환 핸들러, 방법 및 getHandler

 

 

说了这么多,那么handlerMappings这个集合里面的两个对象到底是什么呢?我们再走下一步,进入 if 语句,我们看输出台上的mappingHandler,里面存了一个对象,内容里面有一个我们自己写的控制器,和一个拦截器

它将我们的控制器和拦截器封装成一个HandlerExecutionChain , 拦截器是spring系统自己定义的,每次执行的时候都会自带一个拦截器。

找到handler后,返回到中央控制器DispatcherServlet,中央控制器又拿着handler去请求handlerAdapter处理适配器,为什么需要适配器呢?我们带着这个疑问来看一下,跟获取handler的方法一样,找到获取适配器的方法

进入方法,这个方法藏得比较深,我们要进入多次

继续进入该方法

再进入该方法

到了,该方法返回的类型是HandlerAdapter,这个方法跟getHandler方法差不多一样,也有一个handlerAdapter集合,集合里有3个适配器,打个比方,这三个适配器就相当于笔记本的电源充电线,不同的笔记本需要使用不同的适配器,不同的handler就要使用不同的handlerAdapter,通过循环,找到匹配的适配器。为什么一上来就有这三个适配器呢?其实这三个是系统提前定义好的

在我们的jar包中可以找到,前端控制器的配置文件,我们来进入配置文件,可以看到我们之前看到的handler和handlerAdapter中,两个集合的对象。

这样我们就知道为什么我们一进去就已经有东西了,原来是在这里提前加载了。

逻辑思维:

说直白一点,首先拿到handler的目的是为了拿到控制器,比如在我们的请求路径是 localhost:8080/test ,通过获得handler,返回我们定义的控制器和一个拦截器,找到我们写的代码,那么Adapter就是找出与让控制器执行的方法。

那么为什么要搞这么麻烦呢?是为了解耦、提高程序的灵活性。

 

拿到适配器之后,接下来我们继续走,途中经过方法请求方式的判断

이 점에 관해서는, 우리는 applyPreHandler 방법을 찾아 이동

이 방법은 인터셉터의 배열을 얻기 위해, 우리의 핸들러 전에 실행되고, 인터셉터는 하나 하나 실행

인터셉터 개방의 완성, 시작 핸들러 후, 결국 MV를 반환, MV 우리가 가서보고, 우리의 ModelAndView입니다

이동 계속

그런 다음 이동

그것은 볼 수있다하려면 최종 실행 핸들러 메소드는 핸들러 컨트롤러에 캐스팅,의 ModelAndView를 반환, 그래서 우리는 실행 컨트롤러를 정의 할 수 있습니다.

 

요약하면 :

첫번째는 2 처리기에서 적합한 컨트롤러를 찾을

@의 833153a을 BeanNameUrlHandlerMapping, XML 구성 방향 컨트롤러

3602f818 주석 모드 @ 컨트롤러 RequestMappingHandlerMapping

 

두 번째는 세 어댑터에서 적합한 프로세서를 찾을

HttpRequestHandlerAdapter 28dc72d7, SimpleControllerHandlerAdapter의 구성 6b712691 @, XML의 어댑터, 주석 @

어댑터 RequestMappingHandlerAdapter @ 4d763f47 주석 모드

 

 

 

 

 

 

 

 

 

 

1, 클라이언트 요청은 DispatcherServlet에 제출

추천

출처www.cnblogs.com/wdss/p/11210573.html