springmvc是一个基于mvc的web框架,是spring框架的一个模块,所以springmvc和spring无需通过中间整合层进行整合。我们先来看下spring的一个架构模型,看springmvc在spring框架中所处的位置: 
 
  从图中可以看出,springmvc是spring的一个web框架,所以上图中描述的是spring web mvc,它和struts2的功能差不多,下面我们来深入到springmvc内部,看它的干了些啥,先看一个图: 
 
  这个图描述了springmvc的整个执行的流程,乍一看有点晕乎,待我一步步分析,最后弄个流程图出来就明白了。 
  结合上图,我描述一下springmvc的执行流程:

  1. 向服务器发送Http request请求,请求被前端控制器(DispatcherServlet)捕获。
  2. 前端控制器根据xml文件中的配置(或者注解)对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用处理器映射器(HandlerMapping)获得处理该请求的Handler以及Handler对应的拦截器,最后以 HandlerExecutionChain 对象的形式返回。
  3. 前端控制器根据获得的Handler,选择一个合适的处理器适配器(HandlerAdapter)去执行该Handler。
  4. 处理器适配器提取request中的模型数据,填充Handler入参,执行处理器(Handler)(也称之为Controller).
  5. Handler(Controller)执行完成后,向处理器适配器返回一个ModelAndView对象,处理器适配器再向前端控制器返回该ModelAndView对象(ModelAndView只是一个逻辑视图)。
  6. 根据返回的ModelAndView,前端控制器请求一个适合的视图解析器(ViewResolver)(必须是已经注册到Spring容器中的ViewResolver)去进行视图解析,然后视图解析器向前端控制器返回一个真正的视图View(jsp)。
  7. 前端控制器通过Model解析出ModelAndView中的参数进行解析,最终展现出完整的View并通过Http response返回给客户端。

  上面描述了一下springmvc的执行流程,如果还是有点模糊的话,我用下面这个流程图来表示一下,也为了自己更好的理解整个执行流程:

用户用户DispatcherServletDispatcherServletHandlerMappingHandlerMappingHandlerAdapterHandlerAdapterHandlerHandlerViewResolverViewResolverHttp request请求读取配置文件或注解解析请求的url根据解析结果调用处理器映射器返回请求对应的Handler选择一个合适的处理器适配器提取request中的模型数据填充Handler入参执行返回ModelAndView返回ModelAndView选择一个合适的视图解析器解析ModelAndView返回真正的视图View通过Model解析出ModelAndView中的参数解析参数,展现完整的viewHttp response返回

  经过这么一分析,现在对springmvc的执行流程有了宏观上的了解了,从上面的分析可以看出,springmvc有几个主要的组件,下面结合我们编程,来分析一下这几个组件:

  1. 前端控制器DispatcherServlet(不需要程序员开发)。 
    作用:接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
  2. 处理器映射器HandlerMapping(不需要程序员开发)。 
    作用:根据请求的url查找Handler。
  3. 处理器适配器HandlerAdapter(不需要程序员开发)。 
    作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
  4. 处理器Handler(需要程序员开发)。 
    注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
  5. 视图解析器ViewResolver(不需要程序员开发)。 
    作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
  6. 视图View(需要程序员开发jsp)。 
    View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…) 
    【注】:不需要程序员开发的,需要程序员自己做一下配置即可。

  现在看来,其实真正需要程序员开发的就两大块:一个是Handler,一个是jsp,这样的话,其实和struts2就差不多了,所以不要被上面那个一系列的流程给绕傻了。 
  整个springmvc的架构就总结到这吧,后面就要开始走进springmvc的世界了。

SpringMVC-01-宏观上把握SpringMVC框架的更多相关文章

  1. 【SpringMVC学习01】宏观上把握SpringMVC框架

    springmvc是一个基于mvc的web框架,是spring框架的一个模块,所以springmvc和spring无需通过中间整合层进行整合.我们先来看下spring的一个架构模型,看springmv ...

  2. 【MyBatis学习01】宏观上把握MyBatis框架

    今天开始学习mybatis框架,博客主要记录学习过程中的一些总结,如有错误之处,欢迎留言指正~先用mybatis的鸟鸟来镇个楼,咳咳~~ mybatis框架是一个持久层框架,是Apache下的顶级项目 ...

  3. Linux 驱动——从宏观上掌握基本框架

    一.一个简单的驱动程序实例 led_drv.c 驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include ...

  4. SpringMVC框架01——使用IDEA搭建SpringMVC环境

    1.Spring MVC 入门 1.1.Spring MVC 简介 把Web应用程序分为三层,分别是: 控制器(Controller):负责接收并处理请求,响应客户端: 模型(Model):模型数据, ...

  5. 关于SpringMVC的文件上传

    关于文件的上传,之前写过2篇文章,基于Struts2框架,下面给出文章链接: <关于Struts2的文件上传>:http://www.cnblogs.com/lichenwei/p/392 ...

  6. 使用KindEditor完成图片上传(springmvc&fastdfs/springmvc&ftp)

    前端使用KindEditor,后台使用Springmvc 1 拷贝KindEditor相关文件到项目中 拷贝KindEditor相关文件到项目中 2 准备一个jsp页面 页面中我准备了一个超链接,点击 ...

  7. 用SpringMVC实现的上传下载方式二(多文件上传)

    参考来源:      http://blog.csdn.net/qq_32953079/article/details/52290208 1.导入相关jar包 commons-fileupload.j ...

  8. 16.SpringMVC核心技术-文件上传

    上传单个文件 1.定义具有文件上传功能的页面 index.jsp,其表单的设置需要注意,method 属性为 POST, enctype 属性为 multipart/form-data.另外,需要注意 ...

  9. 【SpringMVC】SpringMVC 实现文件上传

    SpringMVC 实现文件上传 文章源码 文件上传回顾 查看 JavaWeb 阶段的文件上传下载 实现步骤: 客户端: 发送 post 请求,告诉服务器要上传什么文件 服务器: 要有一个 form ...

随机推荐

  1. Java程序如何生成Jar 执行文件(1)

    一.用Eclipse生产Jar文件 注意:此方法只能打包简单程序,不包含含有第三方jar包的项目 首先,看一下我的项目的目录结构: 1,项目名字上面点右键,选择Export,在选择java\JAR f ...

  2. chromium之ThreadLocalStorage

    看看头文件怎么用 // Wrapper for thread local storage. This class doesn't do much except provide // an API fo ...

  3. 使用SimpleDateFormat解析日期得到年份不正确的结果

    今天写项目的时候发现日期解析结果不对,很纳闷,从控制台中看传过来的数据是对的,但解析得到数据就是错的,如下图 最终查资料发现是格式上的错误,年份的YYYY应该改成yyyy,之后就正常了. 以下是正确格 ...

  4. CASE WHEN 小结

    1.简单的一个case when 例子: CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END 2. case when 在一整个表为空强行让其显示出一个值,在其后 ...

  5. web3.js_1.x.x--API(二)/合约部署与事件调用

    web3.js_1.x.x的使用和网上查到的官方文档有些不同,我对经常使用到的API进行一些整理,希望能帮到大家 转载博客:http://www.cnblogs.com/baizx/p/7474774 ...

  6. Centos6 Ruby 1.8.7升级至Ruby 2.3.1的方法

    本文章地址:https://www.cnblogs.com/erbiao/p/9117018.html#现在的版本 [root@hd4 /]# ruby --version ruby (-- patc ...

  7. Lavavel5.5源代码 - 并发数控制

    app('redis')->connection('default')->funnel('key000') // 每个资源最大锁定10秒自动过期,只有60个资源(并发),在3秒内获取不到锁 ...

  8. 让UltraEdit-32成为Delphi 7编译器的工具设置

    UltraEdit-32编译Delphi的工具设置 {================================================}Dcc32 命令行(&C):C:\Pro ...

  9. 【Hbase一】基础

    此笔记仅用于作者记录复习使用,如有错误地方欢迎留言指正,作者感激不尽,如有转载请指明出处 Hbase基础 Hbase基础 Hbase定义 行存储 v s 列存储 Hbase数据模型 Hbase物理模型 ...

  10. c#vs连接SQL sever数据库入门操作

    对于需要连接数据库的项目,可以参考的简单初级代码.实现打开数据库,读入数据功能 using System; using System.Collections.Generic; using System ...