-
MVC:一种软件架构思想,将软件按照模型、视图、控制器来划分
-
M:Model,模型层,指工程中的JavaBean,作用是处理数据
-
JavaBean分为两类:
-
实体类Bean:专门存储业务数据,如Student、User等
-
业务处理Bean:Service或Dao对象,专门用于处理业务逻辑和数据访问
-
-
-
V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据,只负责数据和界面的显示,不接受任何与显示数据无关的代码
-
C:Controller,控制层,指工程中的servlet,作用是接受请求和响应浏览器
-
-
MVC大致工作流程:
-
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用响应的Model层处理请求,
-
处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到响应的View视图,渲染数据后最终响应给浏览器
-
SpringMVC组件
-
前置控制器 DispatcherServlet
-
映射控制器 HandlerMapping
-
处理器 Controller
-
模型和视图 ModelAndView
-
视图解析器 ViewResolver
@RequestMapping
-
功能
-
将请求和处理请求的控制器关联起来,建立映射关系
-
SpringMVC接收到指定的请求,会来找到在映射关系中对应的控制器方法来处理这个请求
-
-
位置:
-
标识一个类:设置映射请求的请求路径的初始信息,表示一个目录
-
标识一个方法:设置映射请求的请求路径的具体信息,表示一个目录下的具体位置
-
-
@RequestMapping里的值是应和html页面中的设置的a标签的路径一致,不同的@RequestMapping里不能出现两个相同的值(唯一性)
-
value属性:
-
value属性通过请求的地址匹配请求映射
-
value属性是一个字符串类型的数组,表示该请求映射能匹配多个请求地址所对应的请求
-
@RequestMapping注解中的其他属性可以不设置,但value属性必须设置,至少通过请求地址匹配请求映射
-
若当前请求的请求地址不满足value属性,浏览器会报错404
-
-
method属性:
-
method属性通过请求的请求方式(get或post)匹配请求映射
-
method属性是一个RequestMethod(字符串)类型的数组,表示该请求映射能匹配多种请求方式的请求
-
若当前请求的请求地址满足请求映射的value属性,但不满足method属性,浏览器会报错405
-
-
@RequestMapping的派生注解(对于处理指定请求方式的控制器方法):
-
处理get请求的映射->@GetMapping
-
处理post请求的映射->@PostMapping
-
处理put请求的映射->@PutMapping
-
处理delete请求的映射->@DeleteMapping
-
-
常见的请求方式:get、post、put、delete,但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符串(put或delete),则按照默认的请求方式get处理
-
params属性(了解):
-
params属性通过请求参数匹配请求映射
-
params属性是一个字符串类型的数组,有四种表达式设置请求参数和请求映射的匹配关系:
-
params:要求请求映射所匹配的请求必须携带params请求参数
-
!params:要求请求映射所匹配的请求不能携带params请求参数
-
params=value:要求请求映射所匹配的请求必须携带params请求参数且params=value
-
params!=value:要求请求映射所匹配的请求必须携带params请求参数且params!=value
-
-
若当前请求满足value和method属性,但不满足params属性,浏览器会报错400
-
-
headers属性(了解):
-
headers属性通过请求的请求头信息匹配请求映射
-
headers属性是一个字符串类型的数组,有四种表达式设置请求头信息和请求映射的匹配关系:
-
header:要求请求映射所匹配的请求必须携带header请求头信息
-
!header:要求请求映射所匹配的请求不能携带header请求头信息
-
header=value:要求请求映射所匹配的请求必须携带header请求头信息且header=value
-
header!=value:要求请求映射所匹配的请求必须携带header请求头信息且header!=value
-
-
若当前请求满足value和method属性,但不满足header属性,浏览器会报错404
-
SpringMVC支持ant风格的路径(模糊匹配)
-
?:表示任意的单个字符(?和/除外)
-
*:表示任意的0个或多个字符(?和/除外)
-
两个*:表示任意的一层或多层目录,也可以是0层目录(只能使用/ ** /xxx的方式)
SpringMVC支持路径中的占位符
-
原始方式:/HelloWorld?id=1&name=Tom
-
rest方式:/HelloWorld/1/Tom
-
SpringMVC路径中的占位符常用于restful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping的value属性中通过占位符{xxx}表示传输的数据,再通过@PathVariable将占位符表示的数据赋值给控制器方法的形参
SpringMVC获取请求参数
-
通过servletAPI获取:
-
通过HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象
-
-
通过控制器方法的形参获取请求参数
-
在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中将请求参数赋值给相应的形参
-
-
通过POJO(实体类)获取请求参数
-
可以在控制器方法的形参位置设置一个实体类类型的形参,此时浏览器传输的请求参数名和实体类中的属性名一致,则请求参数就会为此属性赋值
-
@RequestParam
-
@RequestParam是将请求参数和控制器方法的形参创建映射关系
-
三个属性:
-
value:指定为形参赋值的请求参数的参数名
-
required:设置是否必须传输此请求参数,默认值为true
-
若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则报错400
-
若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则所标识的形参的值为null
-
-
defaultValue:不管required属性的值为true还是false,当value所指定的请求参数没有传输或传输的值为空字符串时,则使用默认值为形参赋值
-
@RequestHeader
-
@RequestHeader是将请求头信息和控制器方法的形参创建映射关系
-
三个属性,与@RequestParam一样
@CookieValue
-
@CookieValue是将cookie数据和控制器方法的形参创建映射关系
-
三个属性:与@RequestParam一样
域对象共享数据
-
request域对象
-
使用servletAPI向request域对象共享数据(不建议使用)
-
使用ModelAndView向request域对象共享数据(重点)
-
使用Model向request域对象共享数据
-
使用Map向request域对象共享数据
-
使用ModelMap向request域对象共享数据
-
-
session域对象
-
通过servletAPI向session域对象共享数据
-
-
application域对象
-
通过servletAPI向application域对象共享数据
-
-
Model、Map、ModelMap的关系:
-
Model、Map、ModelMap类型的参数其实本质上都是BindingAwareModelMap类型的
-
SpringMVC视图
-
SpringMVC中的视图是View接口,作用是渲染数据,将模型Model中的数据展示给用户
-
SpringMVC视图种类很多,默认有转发视图(InternalResourceView)和重定向视图(RedirectView)
-
当使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView
-
ThymeleafView
-
当控制器方法所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转
-
-
转发视图
-
SpringMVC默认的转发视图是InternalResourceView
-
当控制器方法中所设置的视图名称以“forward:”为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是将前缀“forward:”去掉,剩余部分作为最终路径通过转发的方式实现跳转
-
-
重定向视图:
-
SpringMVC默认的重定向视图是RedirectView
-
当控制器方法中所设置的视图名称以“redirect:”为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀“redirect:”去掉,剩余部分作为最终路径通过重定向的方式实现跳转
-
-
视图控制器view-controller:
-
在控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称,可以将处理器方法在配置文件中使用view-controller标签进行表示
-
path:设置处理的请求地址
-
view-name:设置请求地址所对应的视图名称
-
-
当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC的配置文件中开启MVC的注解驱动
-
RESTFul
-
REST:Representational State Transfer。表现层资源状态转移
-
资源是一种看待服务器的方式,即将服务器看作是由很多离散的资源组成
-
资源的表述是一段对于资源在某个特定时刻的状态的描述,可以在客户端-服务端之间转移
-
状态转移:在客户端和服务端之间转移代表资源状态的表述,通过转移操作资源的表述,来间接实现操作资源的目的
-
RESTFul的实现:
-
GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源
-
传统方式 REST风格 查询操作 getUserById?id=1 user/1(get请求方式) 保存操作 saveUser user(post请求方式) 删除操作 deleteUser?id=1 user/1(delete请求方式) 更新操作 updateUser user(put请求方式)
HttpMessageConverter
-
HttpMessageConverter,报文信息转换器,将请求报文转换为java对象,或将java对象转换为响应报文
-
HttpMessageConverter提供了两个注解和两个类型:
-
@RequestBody(用得少):
-
@RequestBody可以获取请求体,需要在控制器方法设置一个形参,使用@RequestBody标识,当前请求的请求体就会为当前所标识的形参赋值
-
-
RequestEntity(用得少):
-
RequestEntity封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息
-
-
@ResponseBody(用得多):
-
@ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器
-
文件下载:
-
导入依赖:jackson-databind
-
在springMVC配置文件中开启注解驱动
-
在处理器方法上添加@ResponseBody
-
将java对象直接作为控制器方法的返回值返回,就会自动转换成json格式的字符串
-
-
@RestController注解是一个复合注解,相当于为类添加了@Controller注解,并为其中每个方法添加@ResponseBody注解
-
ResponseEntity(用得多):
-
ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文
-
-
文件上传:
-
导入依赖:commons-fileupload
-
配置文件上传解析器,将上传的文件封装为MultipartFile
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean>
-
-
-
拦截器
-
拦截器用于拦截控制器方法的执行
-
拦截器需要实现HandlerInterceptor接口
-
拦截器必须在SpringMVC配置文件中进行配置
-
配置拦截器(三种方式)
-
bean,对DispatcherServlet所处理的所有请求进行拦截
-
ref,对DispatcherServlet所处理的所有请求进行拦截
-
mvc:interceptor,对指定的请求进行拦截
-
mvc:mapping设置需要拦截的请求
-
mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求
-
-
-
-
拦截器三个抽象方法:
-
preHandle:控制器方法执行之前执行,返回值true表示放行,即调用控制器方法;返回值为false表示拦截,即不调用控制器方法
-
postHandle:控制器方法执行之后执行
-
afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行
-
-
拦截器执行顺序:
-
若每个拦截器的preHandle()都返回true,此时多个拦截器执行顺序和拦截器在配置文件的配置顺序有关preHandle()会按照配置的顺序执行,而postHandle()和afterCompletion()会按照配置的反序执行
-
若某个拦截器的preHandle()返回false,则它和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,它之前的拦截器的afterCompletion()会执行
-
ModelAndView
-
在SpringMVC中,不管用何种方式,本质上最后都会封装到ModelAndView,ModelAndView向request域对象共享数据时,需要返回ModelAndView本身
-
ModelAndView有Model和View两个功能:Model用于向请求域共享数据;View用于设置视图,实现页面跳转
SpringMVC组件
-
DispatcherServlet:前端控制器,不需要配置,由框架提供
-
作用:接收请求,响应结果,整个流程控制的中心,调用其它组件处理用户的请求
-
-
HandlerMapping:处理器映射器,不需要配置,由框架提供
-
作用:根据请求的url、method等信息查找Handler,即控制器方法
-
-
Handler:处理器,需要配置,需要按照HandlerAdapter的规则来实现
-
作用:对具体的用户请求进行处理
-
-
HandlerAdapter:处理器适配器,不需要配置,由框架提供
-
作用:通过HandlerAdapter的规则进行执行Handler
-
-
ViewResolver:视图解析器,不需要配置,由框架提供
-
作用:进行视图解析,得到相应的视图
-
-
View:视图,将模型数据通过网页展示出来
SpringMVC配置信息
-
扫描组件
-
视图解析器
-
view-controller
-
default-servlet-handler
-
MVC注解驱动
-
文件上传解析器
-
拦截器
-
异常处理解析器
SpringMVC请求过程
-
用户通过View层发送请求到服务器,在服务器中请求被Controller接收
-
Controller调用相应的Model层处理请求
-
Model层处理完毕将结果返回到Controller
-
Controller再根据请求处理的结果找到相应的View视图
-
View视图渲染数据后最终响应给浏览器
SpringMVC执行流程
-
用户向服务器发送request请求,被SpringMVC 前端控制器DispatcherServlet捕获
-
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射是否存在
-
根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回
-
DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter
-
如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler()【正向】
-
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller),处理请求。
-
Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
-
此时将开始执行拦截器的postHandle()【逆向】
-
根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行 HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model 和View,来渲染视图。
-
渲染视图完毕执行拦截器的afterCompletion()【逆向】
-
将渲染结果返回给客户端