JavaEE体系结构包含四层,从上到下分别是应用层、Web层、业务层、持久层。我们Spring MVC就是一个Web层框架,Spring就是业务层框架,MyBatis就是持久层框架。
为什么要使用SpringMVC?
在我们Servlet当中,程序各层之间的依赖非常强,耦合度高。这严重违背了高内聚低耦合的设计原则,在我们SpringMVC当中就把模型和视图进行了分离,降低耦合度
Spring MVC是一种基于Java的实现了WEB MVC设计模式的请求驱动类型的轻量级Web框架,即使使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架得目的就是帮助我们简化开发,SpringMvc也就是简化我们得日常Web开发。
MVC设计模式
MVC全名称Model View Controller,其中model代表Java Bean,View代表视图,比如JSP或者HTML文件,Controller代表控制器,对应组件Servlet
Model1
Model1在一定程序上实现了MVC的设计理念,即JSP将控制层表示层合二为一,JavaBean则为模型层。
优点:建构简单,比较适合小型项目的开发,基本上使用JSP+持久层就可以完成小型项目的开发。
缺点:JSP页面有控制页面显示的代码又有与后台业务逻辑交互的Java代码,职责不单一,页面负担很重,影响页面运行速度;而且不方便后期的维护。如果不加选择随意的使用Model1,会导致JSP页面内嵌入大量得到脚本片段或Java代码。特别是当需要处理请求量很大时,情况会更加糟糕。
Model2
Model2则是将控制层(Servlet)单独地划分出来了,专门负责业务流程地控制,响应页面地请求,创建所需的JavaBean实例,并将处理后台数据再返回给JSP页面,这样层次分明,不同开发人员的职责分工明确,所以项目越复杂,使用Model2架构模型的好处就越大。
优点:清晰地分离了表达式和内容,明确了角色地定义以及开发者与网页设计者地分工,适合大型项目地开发
缺点:分层过多,不适合小型项目地开发
MVC
MVC全名是Model View Controller,是模型(model),视图(view),控制器(controller)的缩写,是一种软件设计典范。它使用一种业务逻辑、数据与界面显示分离的方法来组织,将从多的业务逻辑聚集到一个部件里面,在需要改进和个性定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
搭建第一个Spring MVC项目
01.创建Maven项目
02.引入所需要的jar包
03.在web.xml文件中添加servlet核心控制器
04.创建springmvc.xml文件
05.创建对应的Controller
当我们访问HelloController时候,handlerRequest()方法就默认执行,返回一个ModelAndView,
是由model和view,model底层是一个Map集合,用来保存我们前后台传输的数据,view就是一个视图名称
06.测试
处理器映射器
01. BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping是Spring MVC默认的处理器映射器
使用默认的处理器映射器,控制器的Bean的名称,必须以“/”开头,否则无法访问
02. SimpleUrlHandlerMapping
SimpleUrlHandlerMapping(映射器)是Spring MVC中适用最强的handler mapping类,允许明确指定URL模式和handler的映射器关系
另一种写法:
一个Controller处理多个方法
创建Controller
Spring提供了一个MultiActionController(多动作控制器),用于支持在一个控制器当中添加多种功能的处理方法。
注意:其余方法同上一样
方法名称解析器
001.PropertiesMethodNameResolver
002.ParameterMethodNameResolver
注解方式实现
01.修改springmvc.xml文件
02.创建一个UserController
03.在UserController当中添加add方法
请求流程介绍
01.整体流程
(1) 首先用户发送请求到前端控制器,前端控制器根据请求(如URL)来决定选择哪一个页面页面控制器进行处理并把请求委托给它
(2) 页面控制器接收到请求后,调用业务对象,进行功能处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)
(3) 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入一遍视图渲染
(4) 前端控制器再次收回控制权,将响应返回给用户
02.核心流程
(1) 用户请求至 前端控制器 DispatcherServlet
(2) 前端控制器DispatcherServlet 接收到请求后调用处理器映射器HanlderMapping
(3) 处理器映射器HanlderMapping根据请求的Url找到具体的处理器,生成处理器对象Handler及处理器拦截器HandlerIntercepter(如果有则生成)一并返回给前端控制器DispatcherServlet
(4) 前端控制ch器DispatcherServlet调用处理器适配器HandlerAdapter
(5) 处理器适配器HandlerAdapte根据适配的结果去执行相应的Handler(Controller,也叫做后端控制器),但是在这之前会经过一系列的数据的处理(比如数据的绑定,数据转换、格式化、验证等)
(6) Handler执行完后,给适配器返回ModelAndView
(7) 处理器适配器HandlerAdapter向前端控制器返回 ModelAndView
(8) 前端控制器得到ModelAndView以后会调用视图解析器ViewResolver进行视图解析(根据逻辑视图名解析成真正的视图(jsp))
(9) 视图解析向前端控制器返回View
(10) 前端控制器调用真实的JSP进行视图的渲染,最后响应给用户端