-
如何实现一个controller,在源码中其实将controller叫做handler,我们通常知道实现controller的方式就是在类上添加一个
@Controller
和 @RequestMapping
注解,但是还有其他的方式定义一个controller
实现Controller
@Component(value = "/user/test.do")
public class UserControllerimplements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)throws Exception {
System.out.println("userController run.....");
return null;
}
}
实现HttpRequestHandler
@Component(value = "/prod/test.do")
public class ProductControllerimplements HttpRequestHandler{
@Override
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)throws ServletException, IOException {
System.out.println("prodController run .....");
}
}
使用注解
@EnableWebMvc
-
该注解使Spring MVC 开启高级功能的入口,主要的作用就是加载了一个配置类
DelegatingWebMvcConfiguration
,其中创建了MVC默认的一些组件,比如 viewControllerHandlerMapping
、 RequestMappingHandlerMapping
、 BeanNameUrlHandlerMapping
、 RequestMappingHandlerAdapter
等等。
DispatcherServlet
- 一个用于分发请求的Servlet,一个请求进来之后,Servlet会根据HandlerMapping将请求转发给对应的Handler(controller)处理。
-
其中重要的方法如下:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response)
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)
HandlerMapping
-
顾名思义,就是保存Handler和Mapping之间的对应的关系,当然这种关系是多种的,有 uri to beanName
,有 uri to HandlerMethod
,不同的对应关系有不同的实现类处理,因此就衍生了后续的三种实现类。
BeanNameUrlHandlerMapping
-
见名思意,这种肯定是uri to beanName的实现,用于存储实现了
Controller
和 HttpRequestHandler
接口的Handler的映射关系
SimpleUrlHandlerMapping
-
这种也是uri to Handler的实现,不过这种用于存储
View-controller
、 ResourceHttpRequestHandler
的映射关系
RequestMappingHandlerMapping
-
这种用于实现uri to HandlerMethod的关系,从名称可以看出,这种是用于使用
@RequestMapping
注解的
HandlerExecutionChain
HandlerAdapter
-
简单的说就是执行的Handler的适配类,定义了三个方法,如下:
-
boolean supports(Object handler);
:判断当前的HandlerAdapter是否支持这个Handler
-
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
:执行Handler的方法
-
long getLastModified(HttpServletRequest request, Object handler);
:获取请求都中的 LastModified
-
该接口有多个实现类,如下:
-
RequestMappingHandlerAdapter
:匹配HandlerMethod
-
HttpRequestHandlerAdapter
:匹配实现了 HttpRequestHandler
接口的Handler
-
SimpleControllerHandlerAdapter
:匹配实现了Controller接口的Handler
原文
https://chenjiabing666.github.io/2019/07/31/Springmvc源码解读/