简介
Spring mvc是Spring 为展示层提供的一个优秀的Web框架,它基于MVC的设计理念,并采用松耦合、可插拔的组件结构,让它比其他的MVC框架更具有灵活性和扩展性。
体系结构
学习Spring MVC的时候,最重要还是要懂得它里面内部的各个组件是如何运转工作的,我刚开始接触的时候,只想着一门心思去写代码,而忽略了其最精髓的原理理解和逻辑流程,这也导致我在进行Spring mvc配置和编写代码的时候经常出现错误,反而大大地降低了我的开发效率,因此了解Sping mvc的工作流程、体系结构还是对我们非常有帮助的。
下面是spring mvc的一个框架模型图:
Spring mvc请求处理过程详解:
(1)首先,客户端向服务器短发送一个HTTP请求,我们的应用服务器接收带这个请求后,先判断是否匹配DispatcherServlet的请求路径映射(这是在配置web.xml的时候指定),匹配成功则进入Spring mvc 的核心组件DispatcherServlet中进行处理
(2)DispatcherServlet接受到请求后,将根据请求信息以及HadlerMapping的路径配置找到处理该请求的处理器Handler(也就是我们写得Controller),在这个 过程中,HandlerMapping相当于一个路由控制器,帮助我们去找到“目标主机”Handler
( 3 )找到Handler后,会通过适配器HandlerAdapter对Handler经行封装,并调用统一的适配器接口调用这个Handler.
(4)处理器完成了业务逻辑后,会返回一个ModelAndView对象给DispatcherServlet,这个对象包含了视图逻辑名和后期用来渲染页面的数据信息。
(5)DispatcherServlet得到这个ModelAndView对象后并不能直接地得到 视图对象,注意上面说地是逻辑视图名,而要获取真正的视图名,DispatcherServlet需要借助视图解析器ViewResolver通过解析得到真正的视图名,从而获得视图对象(比如jsp)
(6)之后DispatcherServlet使用之前的Model数据对这个视图View进行页面渲染。
(7)最后返回客户端,可以是html、pdf、xml、json等。
对DispatcherServlet的源码分析
DispatcherServlet可以说是Spring mvc最核心的一个组件,而Spring是如何将业务层的spring mvc的上下文组件装配在这个统一的DispatcherServlet中的呢?我们可以通过对DispatherServlet的源码分析找到答案,下面是DispatcherServler的一些代码,首先DispatcherServlet是继承FramerworkServlet类,而这个FrameworkServlet类又是继承的HttpServletBean,我们现对这个FrameworkServlet的源码中重要方法进行分析,如下:
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method = request.getMethod();
if (method.equalsIgnoreCase(RequestMethod.PATCH.name())) {
//这一这里
processRequest(request, response);
}
else {
super.service(request, response);
}
}
@Override
protected final void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//注意这里
processRequest(request, response);
}
@Override
protected final void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request,