一、简介

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。SpringMVC是一种web层的mvc框架,用于替代servlet(处理响应请求,获取表单参数,表单验证等)

二、工作流程

1、用户发送请求至前端控制器DispatcherServlet。

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet调用HandlerAdapter处理器适配器。

5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、Controller执行完成返回ModelAndView。

7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、ViewReslover解析后返回具体View.

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、DispatcherServlet响应用户。

三、理解

1、为什么要使用springMVC?

SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化日常Web开发。(处理业务数据的对象和显示业务数据的视图之间存在紧密耦合)

2、什么是MVC设计模式?

MVC即Model-View-Controller,将应用按照Model(模型)、View(视图)、Controller(控制)这样的方式分离。

视图(View):代表用户交互界面,对于Web应用来说,可以是HTML,也可能是jsp、XML和Applet等。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。

模型(Model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计是MVC最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提高重用性。

控制(Controller):可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。

3、SpringMVC的特点

  • 清晰的角色划分:控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(formobject)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、视图解析器(view resolver)等。每一个角色都可以由一个专门的对象来实现。
  • 强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器(validator)的引用。
  • 可适配、非侵入:可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。
  • 可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。
  • 可定制的绑定(binding) 和验证(validation):比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。
  • 可定制的handlermapping和view resolution:Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些webMVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。
  • 灵活的model转换:在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。
  • 可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。
  • 简单而强大的JSP标签库(SpringTag Library):支持包括诸如数据绑定和主题(theme) 之类的许多功能。
  • JSP表单标签库:在Spring2.0中引入的表单标签库,使得在JSP中编写 表单更加容易。
  • Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。

4、SpringMVC的优点

  • 让我们能非常简单的设计出干净的Web层和薄薄的Web层
  • 进行更简洁的Web层的开发
  • 天生与Spring框架集成(如IoC容器、AOP等)
  • 提供强大的约定大于配置的契约式编程支持
  • 非常灵活的数据验证、格式化和数据绑定机制
  • 支持Restful风格

5、SpringMVC的入门程序

web.xml

<web-app><servlet><!-- 加载前端控制器 --><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 加载配置文件默认加载规范:* 文件命名:servlet-name-servlet.xml====springmvc-servlet.xml* 路径规范:必须在WEB-INF目录下面修改加载路径:--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value>   </init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>

springmvc.xml

<beans><!-- 配置映射处理器:根据bean(自定义Controller)的name属性的url去寻找handler;springmvc默认的映射处理器是BeanNameUrlHandlerMapping--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean><!-- 配置处理器适配器来执行Controller ,springmvc默认的是SimpleControllerHandlerAdapter--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean><!-- 配置自定义Controller --><bean id="myController" name="/hello.do" class="org.controller.MyController"></bean><!-- 配置sprigmvc视图解析器:解析逻辑视图; 后台返回逻辑视图:index视图解析器解析出真正物理视图:前缀+逻辑视图+后缀====/WEB-INF/jsps/index.jsp--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsps/"></property><property name="suffix" value=".jsp"></property>     </bean>
</beans>

自定义处理器

public class MyController implements Controller{public ModelAndView handleRequest(HttpServletRequest arg0,HttpServletResponse arg1) throws Exception {ModelAndView mv = new ModelAndView();//设置页面回显数据mv.addObject("hello", "欢迎学习springmvc!");//返回物理视图//mv.setViewName("/WEB-INF/jsps/index.jsp");//返回逻辑视图mv.setViewName("index");return mv;}
}

6、SpringMVC常用注解及其作用

@Controller:标识这个类是一个控制器

@RequestMapping:给控制器方法绑定一个uri

@ResponseBody:将java对象转成json,并且发送给客户端

@RequestBody:将客户端请求过来的json转成java对象

@RequestParam:当表单参数和方法形参名字不一致时,做一个名字映射

@PathVarible:用于获取uri中的参数,比如user/1中1的值

Rest风格的新api

@RestController相当于@Controller+ @ResponseBody

@GetMapping@DeleteMapping@PostMapping@PutMapping

其他注解

@SessionAttribute:声明将什么模型数据存入session

@CookieValue:获取cookie值

@ModelAttribute:将方法返回值存入model中

@HeaderValue:获取请求头中的值

7、SpringMVC和Struts2的对比

框架机制:SpringMVC的入口是servlet,而Struts2是filter。

Filter在容器启动后就初始化,服务停止后销毁,晚于Servlet;Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

拦截机制:

Struts2:1、Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter吧request数据注入到属性;

2、一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,说明属性参数是让多个方法共享的;

3、Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

SpringMVC:1、SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架;
    2、在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改;

Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

性能方面:SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

配置方面:spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少);
SpringMVC可以认为已经100%零配置。

设计思想:Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

集成方面:SpringMVC集成了Ajax。

注意:springmvc是单例模式的框架,但它是线程安全的,因为springmvc没有成员变量,所有参数的封装都是基于方法的,属于当前线程的私有变量. 因此是线程安全的框架。所以效率高。

struts action是多例的。所以可以使用成员变量获取参数。所以效率低。

SpringMVC的简介和工作流程相关推荐

  1. java mvc模式工作流程_SpringMVC的简介和工作流程

    一.简介 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.Spri ...

  2. mybatis+springMVC+spring原理及工作流程

    做自己没做过的事情叫做成长 做自己不愿做的事情叫做改变 做自己不敢做的事情叫做突破 共勉 引言 本人在学习ssm中,已经能熟练的编写配置文件与代码了.但于前几天朋友问其原理与工作流程时却只能答出一二, ...

  3. MapReduce 分布式计算框架 简介 特点 工作流程

    MapReduce 计算框架 一种分布式计算框架,解决海量数据的计算问题 MapReduce将整个并行计算过程抽象到两个函数 Map(映射):对一些独立元素组成的列表的每一个元素进行指定的操作,可以高 ...

  4. Spring的简介和工作原理

    一.简介     Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring 框架目标是简化Java企业级应 ...

  5. SpringMVC工作流程 -- 详解

    SpringMVC 一,SpringMVC简介 二,SpringMVC的工作原理图 SpringMVC注解详解 执行流程 初始化HandlerMapping流程图: 三,SpringMVC核心组件 前 ...

  6. 【数据挖掘】卷积神经网络 ( 视觉原理 | CNN 模仿视觉 | 卷积神经网络简介 | 卷积神经网络组成 | 整体工作流程 | 卷积计算图示 | 卷积计算简介 | 卷积计算示例 | 卷积计算参数 )

    文章目录 I . 人类的视觉原理 II . 卷积神经网络 模仿 视觉原理 III . 卷积神经网络简介 IV . 卷积神经网络 组成 V . 卷积神经网络 工作流程 VI . 降低样本参数数量级 VI ...

  7. 简述springmvc过程_spring mvc的工作流程是什么?

    展开全部 SpringMVC工作流程描述 向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获. DispatcherServlet 根据 -servlet.xml 中 ...

  8. springmvc工作流程_SpringMVC工作原理

    买了好多书,但是没有一本是看完的,这是看完的第一本书,虽然页数不多.技术早就用了老多遍了,还是总结一下吧! 一.MVC模式 MVC是 model.view.和controller的缩写,分别代表web ...

  9. gitlab工作流程简介

    gitlab工作流程简介 新建项目流程 创建/导入项目 可以选择导入github.bitbucket项目,也可以新建空白项目,还可以从SVN导入项目 建议选择private等级 初始化项目 1.本地克 ...

最新文章

  1. boost::variant2模块转换构造抛出相关的测试程序
  2. ime-mode:disabled 禁止表单使用文本框输入法
  3. 记一次分布式B站爬虫任务系统的完整设计和实施
  4. 社交大佬们的数据“大”在哪里?
  5. Zookeeper的ZAB协议和Leader选举过程剖析
  6. Java基础学习总结(106)——高级JAVA工程师必需技能
  7. 微型计算机8位数据总线,微机原理答案1
  8. Servlet 生命周期的过程分析 图解
  9. 手柄游戏之《恶魔城暗影之王》推荐
  10. opencv学习记录【6】(codebook
  11. 基于51单片机——60秒倒计时时钟
  12. 快门光圈感光度口诀_一张图教你看懂相机光圈、快门、感光度!太神了!
  13. android intent scheme,android Scheme使用 打开指定的Activity
  14. 【美食记】传统非遗美食——鬼包子
  15. 第二十四天:2019年第九届MathorCup高校数学建模挑战赛A题
  16. 《安富莱嵌入式周报》第268期:2022.05.30--2022.06.05
  17. 玩一玩微信公众号开发(二) 管理凭据和自定义菜单
  18. R语言入门与数据分析(1)
  19. qpython3手机版turtle_Python的画图模块turtle使用详解
  20. 成人c语言培训,C语言程序设计在成人教育中教学.doc

热门文章

  1. [pygame] pygame设计联机对战桌游(一)
  2. Python面向对象知识点详解(含__init__、__add__、__str__、issubclass()、isinstance()等方法的使用)
  3. android华为怎么截屏快捷键,华为p10怎么截图 华为p10截屏的三种方法
  4. 用Python给女友准备个绝对甜蜜的七夕礼物
  5. 电脑蓝牙连接时好时坏
  6. 毕业到踏足BIOS一年以来的旅程
  7. excel序号怎么自动排序(序号自增,序号高度不一致或占有的单元格数量不一致)...
  8. python游戏开发引擎_基于Python的网络游戏脚本系统的设计与实现
  9. postman拦截浏览器请求
  10. JS 数组去重的4个方法