1.如何使用Spring MVC?

  • 在web.xml中配置一个DispatcherServlet
  • DispatchServlet初始化的时候会去寻找一个在应用程序的WEB-INF目录下的配置文件,命名规则是:servletName-servlet.xml  其中servletName是在部署描述符(web.xml)中Dispatcherservlet的名字。
  • 可以在所谓的配置文件中,扩展路径映射关系、定义视图解析器、定义业务逻辑处理流程规则。
  • 此外,也可以把Spring MVC的配置文件放在应用程序目录中的任何地方且名称任意,此时用servlet定义的init-param元素指定配置文件的位置与名字 如下所示
 <servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

2.SpringMVC如何工作?

Spring MVC如何工作,主要看DispatcherServlet代码。

在Servlet的init方法调用时DispatcherServlet执行Spring MVC的初始化工作。初始化工作在initStrategies中完成,code如下:

 protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context); //文件上传服务
initLocaleResolver(context);//国际化问题
initThemeResolver(context);//定义主题
initHandlerMappings(context);//定义用户设置的请求映射关系
initHandlerAdapters(context);//根据handler的类型定义不同的处理规则 ???
initHandlerExceptionResolvers(context);//handler出错时使用
initRequestToViewNameTranslator(context);//将指定的ViewName,加上前缀或者后缀
initViewResolvers(context);//将View解析成页面
initFlashMapManager(context);
}

HandlerMapping的初始化工作完成的两个最重要的工作就是将URL和 Handler的对应关系保存在handlerMap中,并将所有的interceptors对象保存在adaptedInterceptors数组中,等请求到来时执行所有的adaptedInterceptors数组中的interceptor对象。

HandlerAdapter的初始化只是简单地创建一个HandlerAdapter对象,并将其保存在DispatcherServlet的handlerAdapters集合中。

如果用户没有自定义HanlerDdapter的实现类,Spring MVC框架将提供默认的4个HandlerAdapter实现类。

每次请求都会调用DispatcherServlet的doService->doDispatch 下面看一下这个方法的关键部分:

// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
.......
            // Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
.......
          //Actually invoke the handler.
          try {
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
}

三个核心点:


1.HandlerExecutionChain mappedHandler = getHandler(processedRequest);

源码在此略过,主要就是遍历注册的HandlerMapping,调用他们的getHandler方法来找到对应的Handler。

值得一提的是,Spring内部维护了一个Map<String,Object> handlerMap的数据结构, 用于存放 url和对应的handler,进而可以通过url找到handler。

这里的处理链HandlerExecutionChain中包含用户定义的多个HandlerInterceptor对象,这些对象都有三个方法,preHandle postHandle分别在Handle执行前和执行后执行,afterCompletion在View渲染完成、DispatcherServlet返回之前执行。


2.HandlerAdapter ha = getHandlerAdapter(mapperHandler.getHandler())

为当前的Request寻找对应的HandlerAdapter,看哪个HandlerAdapter是支持这个handler的,如果找到了这个Adapter,那么调用它的handle方法


3.ha.handle(processedRequest,response,mapperHandler.getHandler)

handle方法运用java反射机制执行handler的具体方法。

这里真正的调用handle


Ps:这里的源码有时间一定要深入研究下!

Spring MVC框架中,有3个组件是用户必须要定义和扩展的:定义URL映射规则(@RequestMapping)、实现业务逻辑的Handler对象(UserController)、渲染模板资源(usr.ftl)

其中HandlerMapping负责找到对应的handler(Controller)而HandlerAdapter负责找到要访问的函数。

简单介绍一下程序运行的流程,访问指定url首先会由DispatcherServlet进行转发,再通过HandlerMapping找到对应的Handler,然后再拿找到的Handler和HandlerAdapter进行适配,之后就找到了想要执行的方法。

浅析Spring MVC工作机制的更多相关文章

  1. Spring是什么,Spring容器提供了那些功能,Spring的工作机制

    spring是什么 spring 是一个轻型的容器,是J2EE规范的轻量级实现,可以一站式开发,其中提供了,bean工厂,用以构造我们需要的Model ,spring 是非侵入式的,spring应用中 ...

  2. Spring Ioc工作机制 初步

    Spring IoC工作原理 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖 ...

  3. Spring MVC工作原理(好用版)

    Spring MVC工作原理 参考: SpringMVC工作原理 - 平凡希 - 博客园https://www.cnblogs.com/xiaoxi/p/6164383.html SpringMVC的 ...

  4. Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验

    Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...

  5. Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析

    1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...

  6. Spring MVC工作原理及源码解析(一) MVC原理介绍、与IOC容器整合原理

    MVC原理介绍 Spring MVC原理图 上图是Spring MVC工作原理图(图片来自网上搜索),根据上图,我们可以得知Spring MVC的工作流程如下: 1.用户(客户端,即浏览器)发送请求至 ...

  7. spring 内部工作机制(二)

    本章节讲Spring容器从加载配置文件到创建出一个完整Bean的作业流程及参与的角色. Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表, ...

  8. Spring MVC工作原理 及注解说明

    SpringMVC框架介绍 1) spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...

  9. Spring学习记录2——简单了解Spring容器工作机制

    简单的了解Spring容器内部工作机制 Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh()方法定义了Sp ...

随机推荐

  1. 3_初学sql注入

    sql注入的分类:布尔型 报错型 可联合查询型 多语句查询型 基于时间延迟注入 1.注释符 # /* -- 2.过滤空格注入 使用/**/或()或+代替空格 3.多条数据显示 concat(str1, ...

  2. CSS边框外的小三角形+阴影效果的实现。

    ...虽然是一个很小的问题,但其实还是挺实用的. 实现一个边框外的角. 用纯CSS来写. 一开始实现的效果是这个样子的. 但是这个效果没有办法给他附带阴影,所以换了一种写法.实现成了这个样子 想要实现 ...

  3. Winform 下载服务器安装包并安装

    代码中包含了检测本地安装盘符代码 一,定义下载委托事件(用于实现前台进度条更新和下载完成后事件的回调): private delegate void Action(); private string ...

  4. 容器在 Weave 中如何通信和隔离?- 每天5分钟玩转 Docker 容器技术(65)

    上一节我们分析了 Weave 的网络结构,今天讨论 Weave 的连通和隔离特性. 首先在host2 执行如下命令: weave launch 192.168.56.104 这里必须指定 host1 ...

  5. Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据

    当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...

  6. [转]Java se 7 最新特性研究(一)

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp81   从2006到现在等待了多年的jdk7终于发布了.这里将对它的一些 ...

  7. UICollectionView中Cell左对齐 居中 右对齐 等间距------你想要的,这里都有

    支持靠左,居中,靠右,等间距对齐. 靠左等间距.png 居中等间距.png 靠右等间距.png #import <UIKit/UIKit.h> typedef NS_ENUM(NSInte ...

  8. [置顶] Chat Room:基于JAVA Socket的聊天室设计

    d0304 更新功能实现 d0312 更新部分图片&UI设计部分 d0318 更新功能实现 d1222 实现添加好友功能.实现注册功能.修改大量BUG github:https://githu ...

  9. 循环checked表单 元素

    var poject_Array = "";            $('input[name="yearCardPoject"]:checked').each ...

  10. Django1.10主题指南—模型

    模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和操作行为.通常,每个模型都对应着数据库中的唯一一张表. 基础认识: 每个model都是一个继承 django.db.models.M ...