一、简介

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

二、工作流程

image.png

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

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

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

DispatcherServlet调用HandlerAdapter处理器适配器。

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

Controller执行完成返回ModelAndView。

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

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

ViewReslover解析后返回具体View

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

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

springmvc

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:springmvc.xml

springmvc

*.do

springmvc.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc.xsd">

自定义处理器(适配器方式一)实现Controller接口

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;

}

}

自定义处理器(适配器方式二)实现HttpRequestHandler 接口

public class UserController2 implements HttpRequestHandler {

@Override

public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//保存消息

HttpSession session = request.getSession();

session.setAttribute("message", "恭喜你成功访问第一个springMVC环境成功了!--实现方式为:HttpRequestHandlerAdapter");

//页面跳转(使用重定向,保存消息那里,我们要用 ? request session application pageContext )

response.sendRedirect(request.getContextPath()+"/main.jsp");

}

}

SpringMVC注解方式处理器适配器、映射器

注解映射器

在spring3.1版本之前,系统默认加载DispatcherServlet.properoties文件中的org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器,3.1版本之后要使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping这个注解映射器。在springmvc.xml中进行RequestMappingHandlerMapping的配置:

使用RequestMappingHandlerMapping需要在Handler 中使用@controller标识此类是一个控制器,使用@requestMapping指定Handler方法所对应的url。

注解适配器

Spring3.1之前默认加载DispatcherServlet.properoties中的注解适配器是

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter,3.1版本之后要使用:

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter这个注解适配器。在springmvc.xml中进行如下配置:

RequestMappingHandlerAdapter,不要求Handler实现任何接口,它需要和RequestMappingHandlerMapping注解映射器配对使用,主要解析Handler方法中的形参。

也可以使用使用 标签来配置,它是一种简写模式,它会自动注册处理器适配器,配置方式如下:

自定义控制器

//使用Controller来标识它是一个控制器

@Controller

public class TestControllerTest{

@RequestMapping("/testurl")

public ModelAndView testurl() throws Exception{

//逻辑代码

}

}

然后在springmvc.xml中对该Handler进行配置:

上面我们通过对单个注解Handler的配置,也可以使用组件扫描对整个包下的Handler进行配置。

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调用,服务停止后销毁。

调用顺序:filter的调用顺序:

按照web.xml中的映射配置顺序按照配置条件从后向前调用

层次调用doFilter()方法中FilterChain.doFilter()之前的内容(filter-mapping的name先调用doFilter方法,但是每个dofilter方法的内部存在chain.dofilter会调用下一个filter-mapping,一直到不存在下一个filter后在返回,执行chain.dofilter()后面的代码)(相当于递归调用)

调用Servlet中的service()方法

service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反

例如:

filter和servlet同时存在,且容器初始化都要加载,则先加载filter再加载servlet的init方法。

如果请求的url既匹配filter又匹配servlet,并且servlet的init方法没有在容器初始化加载,则先加载匹配的servlet的最后一个servlet的init方法,再按顺序执行filter方法,最后再执行匹配的最后一个servlet方法

拦截机制:

Struts2:

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

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

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

SpringMVC:

SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架;

在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是多例的。所以可以使用成员变量获取参数。所以效率低。

java mvc模式工作流程_SpringMVC的简介和工作流程相关推荐

  1. spring-mvc教程_使用MVC模式制作游戏-教程和简介

    spring-mvc教程 游戏开发中一种有用的体系结构模式是MVC(模型视图控制器)模式. 它有助于分离输入逻辑,游戏逻辑和UI(渲染). 在任何游戏开发项目的早期阶段,它的用途很快就会被注意到,因为 ...

  2. 使用MVC模式制作游戏-教程和简介

    游戏开发中一种有用的体系结构模式是MVC(模型视图控制器)模式. 它有助于分离输入逻辑,游戏逻辑和UI(渲染). 在任何游戏开发项目的早期阶段,其实用性很快就会被注意到,因为它允许快速更改内容,而无需 ...

  3. java mvc 源码分析_SpringMVC 源码解读笔记

    MVC 模式早已被大家熟知,多多少少大家都接触过一些MVC的框架比如stuts,webwork,springmvc,当我们谈论到MVC时其实就是了解他的这种分层理念,职责清晰化,抛弃了原来的混合开发模 ...

  4. java mvc模式_Java MVC模式

    MVC模式表示:模型 -视图 - 控制器模式.此模式用于分离应用程序的问题. 模型(Model) - 模型表示携带数据的对象或JAVA POJO.如果其数据改变它也可以具有逻辑来更新控制器. 视图(V ...

  5. Java MVC模式和三层架构

    MVC 是一种分层开发的模式: M:Model,业务模型,处理业务 V:View,视图,界面展示 C:Controller,控制器,处理请求,调用模型和视图 三层架构分别是 表现层 . 业务逻辑层 . ...

  6. java mvc中重复提交_SpringMVC之——防止重复提交表单的方法(一)

    这篇博文介绍第一种方法:判断session或其他缓存中保存的token,这里以session为例,具体大家也可以自行扩展以其他的缓存实现. 这种方式比较麻烦,每次在提交表单时都必须传入上次的token ...

  7. java mvc httpget怎么使用_springMVC正确使用GET POST PUT和DELETE方法,如何传递参数

    1. 向服务器请求数据:GET 这是标准的http的GET最擅长的, 应该使用GET请求,但是在使用时候我们会需要传递一个或多个参数给服务器, 这些出参数可能是基本数据类型页可能是对象,get方法可以 ...

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

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

  9. springmvc的工作原理_SpringMVC工作原理

    1.用户发送请求至前端控制器DispatcherServlet(也叫中央处理器). 2.DispatcherServlet收到请求调用HandlerMappering处理器映射器 3.处理器映射器找到 ...

最新文章

  1. 1.9 Java转换流:InputStreamReader和OutputStreamWriter
  2. 如何用python画组合图形_python_matplotlib画组合图
  3. linux中mbr最大多少分区,Linux与磁盘分区介绍(MBR,GPT)
  4. HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面
  5. oracle数据模型三要素,关系模型三要素
  6. python用逗号隔开输出_c语言提取逗号隔开的 python输出用逗号隔开的数字
  7. SmartFoxServer 2X管理工具
  8. MySQL时间序列分表分区_干货丨时序数据库分区教程
  9. CAD关于图层删除图层操作(com接口c#语言)
  10. jquery-2.1.1.min.js:4 GET http://localhost:9090/api/get/list?page=1page_size=10type=1 404 (Not Fou
  11. 我相信希望,我相信明天~~
  12. 计算机中的光学知识,科学网—光学基础知识大讲堂 ——第3期:详解电磁辐射 - 何卓铭的博文...
  13. Ubuntu 电脑下插入移动硬盘,显示不能挂载该硬盘
  14. M.2、PCIe、mSATA接口的SSD 速度性能如何?哪一个是装机首选
  15. 喜欢二次元的程序员,是如何宣泄的?看到他们的电脑桌面就知道了
  16. php台阶走两步余一步,【原创BG】嗨,那条龙 CP:阿莱克丝X大王
  17. Ubuntu更新后还原Windows Boot Loader
  18. 1234567彩票---七星彩中奖分析
  19. hive学习(5)--- Partitions分区的使用(包括动态分区)
  20. 中国老年医学学会:老年人预防新型冠状病毒感染的18条建议

热门文章

  1. 【任务脚本】1104更新双十一京东淘宝任务脚本,全自动程序,淘宝京东自动做任务...
  2. 【步态识别】基于深度学习的步态识别系统的MATLAB仿真,包括ALEXNET,改进CNN,GOOGLENET
  3. 职场10不要【来自网络】
  4. 云存储基础设施的决定:公共云与私有云
  5. 专家:“十三五”中国应建立覆盖城乡的超级WIFI
  6. mysql 关于日期时间的字段类型
  7. 让你完全理解base64是怎么回事
  8. iOS app 切图
  9. 顶级程序员的10条最佳实践
  10. javascript 函数声明与函数表达式的区别