1.SpringMVC框架
1.1定义
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。
1.2 工作原理
- 浏览器发出request,DispatcherServlet接收request并向HandlerMapping请求获取andler
- HandlerMapping返回执行后的Handler
- DispatcherServlet调用HandlerAdapter处理Handler,执行完毕后返回ModelAndView
- DispatcherServlet接收到后请求ViewResolver对ModelAndView进行解析,解析完毕后返回视图
- DispatcherServlet对视图进行渲染呈现在客户端并向浏览器返回response
1.3 组件说明
(1) DispatcherServlet(核心组件)
SpringMVC的核心,类比cpu,在接受Http请求后负责各个组件的协调,主要工作有以下三点:
- 截获符合特定格式的URL请求。
- 初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、
持久化层的WebApplicationContext建立关联。 - 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
(2)HandlerMapping:
能够完成客户请求到Controller映射。
(3)Controller:
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。
Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,
(4)ViewResolver:
Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
(5)Handle(需要程序员开发)
编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
ModelAndView中包含了模型(Model)和视图(View)。
从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
2.源码分析
2.1工作机制
在容器初始化时会建立所有url和controller的对应关系,保存到Map<url,controller>中.tomcat启动时会通知spring初始化容器(加载bean的定义信息和初始化所有单例bean),然后springmvc会遍历容器中的bean,获取每一个controller中的所有方法访问的url,然后将url和controller保存到一个Map中;
这样就可以根据request快速定位到controller,因为最终处理request的是controller中的方法,Map中只保留了url和controller中的对应关系,所以要根据request的url进一步确认controller中的method,这一步工作的原理就是拼接controller的url(controller上@RequestMapping的值)和方法的url(method上@RequestMapping的值),与request的url进行匹配,找到匹配的那个方法;
确定处理请求的method后,接下来的任务就是参数绑定,把request中参数绑定到方法的形式参数上,这一步是整个请求处理过程中最复杂的一个步骤。springmvc提供了两种request参数与方法形参的绑定方法:
① 通过注解进行绑定,@RequestParam
② 通过参数名称进行绑定.
使用注解进行绑定,我们只要在方法参数前面声明@RequestParam("a"),就可以将request中参数a的值绑定到方法的该参数上.使用参数名称进行绑定的前提是必须要获取方法中参数的名称,Java反射只提供了获取方法的参数的类型,并没有提供获取参数名称的方法.springmvc解决这个问题的方法是用asm框架读取字节码文件,来获取方法的参数名称.asm框架是一个字节码操作框架,关于asm更多介绍可以参考它的官网.个人建议,使用注解来完成参数绑定,这样就可以省去asm框架的读取字节码的操作.
2.2 阅读源码
水平不够,以后再补充