SpringMVC是Spring的一个后续产品,是Spring的一个子项目。
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。
M:Model,模型层,指工程中的JavaBean,作用是处理数据。
V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据。
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器。
搭建基本框架:
创建Maven工程,在pom.xml文件添加进需要用的依赖(要打包成war包而不是jar包),添加Web目录并创建webapp.xml文件,在web.xml文件中配置前端控制器(DispatcherServlet)和两个过滤器(HiddenHttpMethodFilter隐藏请求方式和CharacterEncodingFilter 设置请求和响应编码)在控制器中设置SpringMVC配置文件的地址。
创建springMVC.xml文件,并在文件中开启组件扫描和 配置Thymeleaf视图解析器。
最后创建对应的包和控制器
1、@RequestMapping注解的功能
@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。
就是说请求的地址会和该注解中的属性相对应则调用该注解标记的控制器方法。来处理该请求。
该注解有3个属性分别为value,method,params。对应请求地址,请求方式和请求参数。
SpringMVC支持路径中的占位符
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
用一个"/"后面的值代表属性值
接收时为
用{xx}和@pathvariable("xx")来对应接收1
SpringMVC获取请求参数
在springMVC中在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参。
当形参为对象时,传入的参数为一组对应的键值对会将键值对注入到形成里面
@RequestParam是将请求参数和控制器方法的形参创建映射关系
@RequestHeader是将请求头信息和控制器方法的形参创建映射关系
@CookieValue是将cookie数据和控制器方法的形参创建映射关系
都有三属性
value:指定为形参赋值的请求参数的参数名
required:设置是否必须传输此请求参数,默认值为true
若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present;若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null
defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使用默认值为形参赋值
域对象共享数据
使用ModelAndView向request域对象共享数据
使用Model向request域对象共享数据
使用map向request域对象共享数据
使用ModelMap向request域对象共享数据
session和servletContext用原生的方法存数据
SpringMVC的视图
InternalResourceView
当控制器方法中所设置的视图名称以"forward:"为前缀时或没有前缀时(没有使用Thymeleaf),创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转
"forward:/employee"
RedirectView
当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:",然后会判断剩余部分是否以/开头,若是则会自动拼接上下文路径
"redirect:/employee"
若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView
ThymeleafView
当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转。
RESTful
GET、POST、PUT、DELETE4种请求方式其中PUT、DELETE要通过HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求 。
HiddenHttpMethodFilter 处理put和delete请求的条件:
a>当前请求的请求方式必须为post
b>当前请求必须传输请求参数_method
满足以上条件,HiddenHttpMethodFilter 过滤器就会将当前请求的请求方式转换为请求参数_method的值,因此请求参数_method的值才是最终的请求方式
HttpMessageConverter
HttpMessageConverter提供了两个注解和两个类型:@RequestBody,@ResponseBody,RequestEntity。
@RequestBody 需要在控制器方法设置一个形参,使用@RequestBody进行标识,当前请求的请求体就会为当前注解所标识的形参赋值
请求体返回的东西大概类似于:username=admin&password=123456 键值对拼接
RequestEntity
RequestEntity封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参。
可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息
@ResponseBody
@ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器
@RestController注解
@RestController注解是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解
ResponseEntity
ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。可以用于文件下载。
文件上传
文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"
SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息。
文件下载和文件上传本质上都是数据拷贝。
拦截器
SpringMVC中的拦截器用于拦截控制器方法的执行
SpringMVC中的拦截器需要实现HandlerInterceptor
SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置
preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
postHandle:控制器方法执行之后执行postHandle()
afterComplation:处理完视图和模型数据,渲染视图完毕之后执行
多个拦截器的执行顺序
a>若每个拦截器的preHandle()都返回true
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:
preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行
b>若某个拦截器的preHandle()返回了false
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行
异常处理器
SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver 常用用的实现类为SimpleMappingExceptionResolver。
注解方式