不容易理解的几个handler
1.HandlerMapping ---> Handler(Controller) ---> HandlerAdapter(RequestMapping)
2.DispatcherServlet在找到controller(Handler)之前需要经过handlerMapping,handler是根据注解找到对应的controller。具体可以参看详解SpringMVC请求的时候是如何找到正确的Controller
3.HandlerMapping 可以拆解来看A:Handler(controller) B:mapping(RequestMapping)
4.DispatcherServlet类似于微服务的网关Zuul
5.http请求是通过ip+端口找到对应的应用程序,我暂时理解为tomcat容器
1、用户向服务器发送请求,根据IP+端口号找到对应ip的机器和端口对应的tomcat容器。请求被SpringMVC的前端控制器DispatcherServlet截获。
2、DispatcherServlet对请求的URL(统一资源定位符)进行解析,得到URI(请求资源标识符),
然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象,
包括Handler对象以及Handler对象对应的拦截器,这些对象都会被封装到一个HandlerExecutionChain对象当中返回。
3、DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。HandlerAdapter的设计符合面
向对象中的单一职责原则,代码结构清晰,便于维护,最为重要的是,代码的可复制性高。
HandlerAdapter会被用于处理多种Handler,调用Handler实际处理请求的方法。
4、
提取请求中的模型数据,开始执行Handler(Controller)。在填充Handler的入参过程中,根据配置,
spring将帮助做一些额外的工作
5、Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象,ModelAndView对象中应该包含视图名或视图模型。
6、根据返回的ModelAndView对象,选择一个合适的ViewResolver(视图解析器)返回给DispatcherServlet。
7、ViewResolver结合Model和View来渲染视图。
8、将视图渲染结果返回给客户端。
工作流程:
1. 用户发送请求至前端控制器DispatcherServlet
2. DispatcherServlet收到请求调用HandlerMapping。
3. 通过HandlerMapping得到HandlerAdapter.
4. 调用handle()方法返回ModelAndVIew
5. DispatcherServlet将ModelAndView送给ViewResolver视图解析器处理,解析返回具体的view
6. 将Model渲染到view视图
7. 最后向用户response响应
springmvc的controller是单例还是多例的? 答:是单例的,只要controller里面不定义属性,线程就是安全的。主要是单例性能好。