(DispatcherServlet在Spring当中充当一个前端控制器的角色,它的核心功能是分发请求。请求会被分发给对应处理的Java类,Spring MVC中称为Handle。)

①   用户把请求发送给DispatcherServlet服务器。

②   DispatcherServlet对请求的URL(统一资源定位符)进行解析,得到URI(请求资源标识符)。然后根据该URI,调用HandlerMapping获取该Handler配置的所有相关的对象,包括Handler对象以及Handler对象对应的拦截器,这些对象会被封装到一个HandlerExecutionChain对象当中返回。

③   DisptcharServlet会根据获得的Handler选择一个合适的HandlerAdapter。HandlerAdapter会被用于处理多种Handler,调用Handler实际处理请求的方法。

④   提取请求中的模型数据,开始执行Handler(Controller类)。在填充Handler的入参过程中,根据配置,Spring可以做消息转换、数据转换、数据格式化、数据验证的工作。

⑤   Handler执行完成后,想DispatcherServlet发送一个ModelAndView对象,ModelAndView对象中应该包含视图名或视图名和模型。

⑥   根据返回的ModelAndView对象,选择一个合适的ViewResolver(视图解析器)返回给DispatcherServlet。

⑦   ViewResolver结合Model和View来渲染视图。

⑧   将视图渲染结果返回给客户端。

我们可以看到,DispatcherServlet在这个执行过程中是一位大哥的角色,为森么它会坐稳大佬的位置呢?我们可以看它的源码:

         protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);  //初始化上传文件解析器
initLocaleResolver(context);  //初始化本地解析器
initThemeResolver(context);  // 初始化主体解析器
initHandlerMappings(context);  //初始化处理器映射器,将请求映射到处理器
initHandlerAdapters(context);  //初始化处理器适配器
initHandlerExceptionResolvers(context);  //初始化处理异常解析器,如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
initRequestToViewNameTranslator(context);  //初始化请求到视图名称解析器
initViewResolvers(context);  //初始化视图解析器,通过ViewResolver解析逻辑视图名到具体视图实现
initFlashMapManager(context);  //初始化flash映射管理器
}

接下来我们来看一下,整个流程的实现是怎么样的。

代码实现:

①   引入spirng-framework的相关包和commons-logging包(WEB-INF/lib)。

②   在WEB-INF下的web.xml中进行配置(WEB-INF/web.xml):

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"id="WebApp_ID" version="3.1"><!-- 定义Spring MVC的前端控制器 --><servlet><!-- 配置前端控制器 --><!-- DispatcherServlet在Spring当中充当一个前端控制器的角色,它的核心功能是分发请求。请求会被分发给对应处理的Java类,Spring MVC中称为Handle--><!—配置一个名为springmvc的DispatcherServlet服务器 --><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><!-- 定位spring mvc的配置文件 --><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/springmvc-config.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><!-- 让Spring mvc的前端控制器拦截所有请求 --><servlet-mapping><servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern></servlet-mapping></web-app>

③      编写SpringMVC的配置文件,在WEB-INF下的springmvc-config.xml。(WEB-INF/springmvc-config.xml)

 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 配置handler,映射"/hello",或者可以直接在Controller类注解 --><bean name="/hello" class="org.fkit.controller.HelloController"/><!-- spring可以自动去扫描base-pack下面的包或者子包下面的Java文件,如果扫描到有Spring的相关注解的类,则把这些类注册为Spring的bean--><context:component-scan base-package="org.fkit.controller" /><!-- 处理映射器将bean的name作为url进行查找,需要在配置Handle时指定name(即url) --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- SimpleControllerHandlerAdapter是一个处理器适配器,所有处理适配器都要实现HandlerAdapter接口 --><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/><!-- 视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/></beans>

④    Controller的实现,用于处理请求(org.fkit.controller.HelloController)。

package org.fkit.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class HelloController implements Controller{private static final Log logger = LogFactory.getLog(HelloController.class);public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {logger.info("handleRequest 被调用");//创建准备返回的ModelAndView对象,该对象通常包含了返回视图名、模型的名称以及模型对象
ModelAndView mv = new ModelAndView();//添加模型数据,可以是任意的POJO对象
mv.addObject("message","HelloWorld");//设置逻辑视图名,视图解析器会根据该名字解析到具体的试图页面
mv.setViewName("/WEB-INF/content/welcome.jsp");//返回ModelAndView对象return mv;}}

⑤   编写视图页面,用于显示已经处理好的View和Model的视图渲染(WEB-INF/content/welcome.jsp)。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title></head><body>${requestScope.message }</body></html>

转载于:https://www.cnblogs.com/NYfor2018/p/9133004.html

(二)SpringMVC之执行的过程相关推荐

  1. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  2. SpringMVC的执行流程

    SpringMVC的执行流程 一.前言 刚学完SpringMVC的基本操作,但是对SpringMVC的执行流程源码很好奇,今天通过尚硅谷杨博超老师的教程视频学习并记录一下. 1.流程图 详细l流程图: ...

  3. ssm中怎么使tomcat一起动就执行一个controller_【200期】面试官:你能简单说说 SpringMVC 的执行原理吗?...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

  4. ie 不执行回调函时_javascript引擎执行的过程的理解--执行阶段

    一.概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 1.语法分析: 分别对加载完成的代码块进行语法检验 ...

  5. javascript引擎执行的过程的理解--执行阶段

    一.概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 1.语法分析: 分别对加载完成的代码块进行语法检验 ...

  6. 小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难

    PLC实质上是工业计算机,是计算机技术与传统继电接触器控制器技术相结合的产物,只不过比一般的计算机具有更强的与工业过程相连接的接口和更直接的适用于工业控制要求的编程语言. 一.PLC的结构 从硬件结构 ...

  7. SpringMVC 的执行流程

    SpringMVC 的执行流程 1)用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet捕获: 2)DispatcherServlet 对请求 UR ...

  8. ARM裸机篇(二)——i.MX6ULL启动过程

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  9. PHP代码的执行的过程

    一.前言 语言是人们进行沟通和交流的表达符号,每种语言都有专属于自己的符号,表达方式和规则. 就编程语言来说,它也是由特定的符号,特定的表达方式和规则组成.语言的作用是沟通,不管是自然语言,还是编程语 ...

最新文章

  1. mnn 可变输入项目实例
  2. ansible register 用法
  3. 用选框工具画圆角矩形
  4. 汽车组装c语言排列组合算法,求一个关于排列组合的算法
  5. 工具用途_见微知著,小工具大用途!
  6. 我国地方大数据政策的扩散模式与转移特征研究
  7. CSS div 塌陷问题
  8. 1.3 机器学习基础
  9. 为什么SQL用UPDATE语句更新时更新行数会多3行有触发器有触发器有触发器有触发器有触发器有触发器...
  10. 小组第十三次站立会议
  11. 实验三:分别用for、while和do-while循环语句以及递归方法计算n!,并输出算式...
  12. hive split 注意事项
  13. 苹果鼠标滚轮驱动_双飞燕血手幽灵V8M Max电竞鼠标兼具功能和性价比
  14. 华为手机怎样才算激活了_华为手机激活是怎么回事
  15. 华为android贡献度,从EMUI的6次里程碑事件,看华为对安卓生态的贡献
  16. java 词频统计_Java实现的词频统计
  17. 《疯狂原始人》温馨而搞笑片段截图
  18. 吉他铺怎么看(很全)
  19. php降序怎写,PHP数组如何按键名实现降序排列
  20. AndroidManifast警告On SDK version 23 and up, your app data will be automatically backed up...

热门文章

  1. Storm/JStorm之TopologyBuilder源码阅读
  2. 做了几道Linux笔试题1
  3. 果蝇玩VR登Nature,发现注意力机制、工作记忆都有,昆虫大脑原来没比哺乳类差多少...
  4. 小伙一本正经用石头打造CPU,号称99秒“解决”芯片危机
  5. 合格的CTO应该是什么样?雷军王海峰王小川等共谈「技术创新」| CNCC2020
  6. 谷歌量子计算突破登Science封面!首次对化学反应进行量子模拟
  7. OpenStack部署
  8. VSTO Office二次开发PPTRibbonX命令操作及对象添加
  9. 项目分析_xxoo-master
  10. C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***