原理
  
  本质是将DispatcherServlet及关联的Spring上下文环境的初始化工作织入Servlet的生命周期内,将外部WEB请求转换为Spring Bean能处理的形式,然后将处理后的结果借助于符合J2EE规范组件,呈现给客户端。
  
  步骤
  
  HttpServletBean: init(),内部调用initServletBean完成Servlet的初始化
  
  FrameworkServlet 重写 initServletBean()方法,方法内部调用 initWebApplicationContext()方法完成与DispatcherServlet关联的web应用上下文的初始化工作,应用环境的基础环境的初始化工作由子类DispatcherServlet的onRefresh方法完成。
  
  DispatcherServlet.onRefresh方法内部调用:initStrategies方法完成Springmvc需要的各种组件的初始化工作,至此springmvc可提供完整的外部应用访问功能。
  
  protected void initStrategies(ApplicationContext context) {
  
  initMultipartResolver(context);
  
  initLocaleResolver(context);
  
  initThemeResolver(context);
  
  initHandlerMappings(context);
  
  initHandlerAdapters(context);
  
  initHandlerExceptionResolvers(context);
  
  initRequestToViewNameTranslator(context);
  
  initViewResolvers(context);
  
  initFlashMapManager(context);
  
  }
  
  springmvc 默认配置文件:DispatcherServlet.properties
  
  Springmvc 客户端请求处理过程
  
  核心方法:doService,本质是对Serlvet接口的service方法的最终实现。
  
  doService:完成应用请求的数据封装封装,内部调用doDispatch方法完成请求调度调度处理
  
  源码分析:
  
  protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
  
  HttpServletRequest processedRequest = request;
  
  HandlerExecutionChain mappedHandler = null;
  
  boolean multipartRequestParsed = false;
  
  WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
  
  try {
  
  ModelAndView mv = null;
  
  Exception dispatchException = null;
  
  try {
  
  //判断外部请求是否是多部分请求(一般用于文件上传)
  
  processedRequest = checkMultipart(request);
  
  multipartRequestParsed = processedRequest != request;
  
  // 根据请求请求获取请求处理器:注意这里会返回对应的处理器以及潜在的拦截器
  
  mappedHandler = getHandler(processedRequest);
  
  if (mappedHandler == null || mappedHandler.getHandler() == null) {
  
  noHandlerFound(processedRequest, response);
  
  return;
  
  }
  
  // 获取能够支持请求处理器的处理器适配器
  
  HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
  
  // Process last-modified header, if supported by the handler.
  
  String method = request.getMethod();
  
  boolean isGet = "GET".equals(method);
  
  if (isGet || "HEAD".equals(method)) {
  
  long lastModified www.yongshiyule178.com= ha.getLastModified(request, mappedHandler.getHandler());
  
  if (logger.isDebugEnabled()) {
  
  String requestUri = urlPathHelper.getRequestUri(request);
  
  logger.debug("Last-Modified www.xinghaiyule1.com value for [" + requestUri + "] is: " + lastModified);
  
  }
  
  if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
  
  return;
  
  }
  
  }
  
  //前置拦截器拦截请求
  
  if (!mappedHandler.applyPreHandle(processedRequest, response)) {
  
  return;
  
  }
  
  try {
  
  // 处理器适配器将请求传递给控制器处理,获取ModelView对象
  
  mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
  
  }
  
  finally {
  
  if (asyncManager.isConcurrentHandlingStarted(dasheng178.com )) {
  
  return;
  
  }
  
  }
  
  //设置视图名
  
  applyDefaultViewName(request, mv);
  
  //后置拦截器拦截请求
  
  mappedHandler.applyPostHandle(processedRequest, response, mv);
  
  }
  
  catch (Exception ex) {
  
  dispatchException = ex;
  
  }
  
  //处理控制器返回的结果ModelAndView,主要是讲model的数据填充view,渲染后将数据返回给客户端显示
  
  processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
  
  }
  
  catch (Exception www.tiaotiaoylzc.com ex) {
  
  triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
  
  }
  
  catch (Error err) {
  
  triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err);
  
  }
  
  finally {
  
  if (asyncManager.isConcurrentHandlingStarted()) {
  
  // Instead of postHandle and afterCompletion
  
  mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
  
  return;
  
  }
  
  // Clean up any resources used by a multipart request.
  
  if (multipartRequestParsed)www.mytxyl1.com {
  
  cleanupMultipart(processedRequest);
  
  }
  
  }
  
  }
  
  springmvc 请求响应:
  
  主要是将MappingHandler返回的ModelAndView种的Model数据填充到view,并借助于servlet容器(例如tomcat)呈现给客户端。
  
  AbstractView. render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response):
  
  //具体执行代码
  
  renderMergedOutputModel(mergedModel, request, response);
  
  案例分析:内部资源视图(例JSP) InternalResourceView. renderMergedOutputModel
  
  protected void renderMergedOutputModel(
  
  Map<String, Object>www.jtujbo.com model, HttpServletRequest request, HttpServletResponse response) throws Exception {
  
  //封装客户端可视的请求资源数据
  
  HttpServletRequest requestToExpose = getRequestToExpose(request);
  
  exposeModelAsRequestAttributes(model, requestToExpose);
  
  //客户端请求添加辅助信息
  
  exposeHelpers(requestToExpose);
  
  // 获取请求转发路径
  
  String dispatcherPath = prepareForRendering(requestToExpose, response);
  
  //获取目标资源的请求调度器
  
  RequestDispatcher rd = getRequestDispatcher(requestToExpose, dispatcherPath);
  
  if (rd == null) {
  
  throw new ServletException(www.yongshi123.cn"Could not get RequestDispatcher for [" + getUrl() +
  
  "]: Check that the corresponding file exists within your web application archive!");
  
  }
  
  //如果一个URL的内部请求则进行响应资源追加,例如网页内的图片链接等
  
  if (useInclude(requestToExpose, response)) {
  
  response.setContentType(getContentType());
  
  if (logger.isDebugEnabled()) {
  
  logger.debug("Including resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'");
  
  }
  
  rd.include(requestToExpose, response);
  
  }
  
  else {
  
  // Note: The forwarded resource is supposed to determine the content type itself.
  
  if (logger.isDebugEnabled(www.fengshen157.com)) {
  
  logger.debug("Forwarding to resource [" + getUrl(www.xtd912.com) + "] in InternalResourceView '" + getBeanName() + "'");
  
  }
  
  //repuest请求转发,说明springmvc采用的转发而不是重定向的方式
  
  rd.forward(requestToExpose, response);
  
  }

【spring】- springmvc 工作原理的更多相关文章

  1. springmvc工作原理和环境搭建

    SpringMVC工作原理     上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServle ...

  2. [Java] SpringMVC工作原理之一:DispatcherServlet

    一.DispatcherServlet 处理流程 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作.在看 Di ...

  3. SpringMVC工作原理详解

    先来看一下什么是 MVC 模式 MVC 是一种设计模式. MVC 的原理图如下: SpringMVC 简单介绍 SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然 ...

  4. SpringMVC 工作原理详解

    本文Github开源项目https://github.com/Snailclimb/JavaGuide,只供自己学习总结无商业用途,如有侵权,联系删除 先来看一下什么是 MVC 模式 MVC 是一种设 ...

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

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

  6. Spring Session工作原理

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/KCOFv0nRuymkX79-RZi9eg 作者:张正林 目录:1.引入背景2.使用方法3.工作流程 ...

  7. 笔面试复习(spring常用.jar包/事务/控制反转/bean对象管理和创建/springMVC工作原理/sql查询)

    ###spring常用jar包1.spring.jar是包含有完整发布模块的单个jar包.2.org.springframework.aop包含在应用中使用Spring的AOP特性时所需要的类.3.o ...

  8. springmvc工作原理以及源码分析(基于spring3.1.0)

    springmvc是一个基于spring的web框架.本篇文章对它的工作原理以及源码进行深入分析. 一.springmvc请求处理流程 二.springmvc的工作机制 三.springmvc核心源码 ...

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

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

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

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

随机推荐

  1. [环境配置]Ubuntu 16.04+CUDA 9.0+OpenCV 3.2.0下编译基于Caffe的MobileNet-SSD踩过的一些坑

    SSD是Caffe的一个分支,源码在github上:https://github.com/weiliu89/caffe/tree/ssd $ git clone https://github.com/ ...

  2. 如何布局您的PC站和移动站,并表达两者之间内容的对应关系

      如何布局您的PC站和移动站,并表达两者之间内容的对应关系 目前较流量的PC站与移动站配置方式有三种,百度站在搜索引擎角度将这三种分别称为跳转适配.代码适配和自适应,以下为这三种配置方式的名词解释及 ...

  3. 如何防范和应对Redis勒索,腾讯云教你出招

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 9月10日下午,又一起规模化利用Redis未授权访问漏洞攻击数据库的事件发生,此次 ...

  4. 金融科技行业 SDL(转载)

     都是一些检查项,值得借鉴,关键在于要能够落地 作者 沈发挺@美的金融科技下载打印版

  5. 使用sass与compass合并雪碧图(一)

    雪碧图就是很多张小图片合并成一张大图片,以减少HTTP请求,从而提升加载速度.有很多软件可以合并雪碧图,但通常不太容易维护,使用compass生成雪碧图应该算是非常方便的方法了,可以轻松的生成雪碧图, ...

  6. No.100_第一次团队会议

    任务的确立 这次会议,我们的主要目标是确定任务: 我们的任务有以下几个选择: 学霸网站,这个项目拥有以前的前端代码,我们再使用Django后端服务.上手难度较低,环境较好. 多平台时间管理软件. 安卓 ...

  7. 实验三:敏捷开发与XP实践

    Java实验三报告 一.   实验内容 (一)敏捷开发与XP 内容:1.敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 2.极限编程(eXtreme Pro ...

  8. 2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第八周学习总结 现在对于我而言,最珍贵的是时间,感觉自己在时间飞逝的时候真的挽留不住什么,只能怒发冲冠的让自己疯狂的学习 ...

  9. 07慕课网《进击Node.js基础(一)》HTTP小爬虫

    获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...

  10. C++:构造函数2——拷贝构造函数

     前言:拷贝构造函数是C++中的重点之一,在这里对其知识进行一个简单的总结. 一.什么是拷贝构造函数 在C++中,对于内置类型的变量来说,在其创建的过程中用同类型的另一个变量来初始化它是完全可以的,如 ...