SpringMVC简介
SpringMVC概述:
SpringMVC技术与Servlet技术功能相同,均属于web层开发技术
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
优点:
使用简单,开发便捷(相比于Servlet)
灵活性强
入门案例:
1.使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标
2.创建SpringMVC控制器类(等同于Servlet功能)
3.初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean
4.初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
注解
名称:@Controller
类型:类注解
位置:SpringMVC控制器类定义上方
作用:设定SpringMVC的核心控制器bean
范例:
名称:@RequestMapping
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径
范例:
相关属性: value(默认):请求访问路径
名称:@ResponseBody
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法响应内容为当前返回值,无需解析
范例:
SpringMVC入门程序开发总结(1+N)
一次性工作
创建工程,设置服务器,加载工程
导入坐标
创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
SpringMVc核心配置类(设置配置类,扫描controller包,加载controller控制器bean)
多次工作
定义处理请求的控制器类
定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
AbstractDispatcherServletInitializer类是springMVC提供的快速初始化web3.0容器的抽象类
AbstractDispatcherServletInitializer提供三个接口方法供用户实现
1.createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而webApplicationContext的作用范围为ServletContext范围,即整个web容器范围
2.getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理
3.createRootApplicationContext()方法,如果创建Servlet容器时需要加载非springMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
入门案例工作流程分析
*启动服务器初始化过程
1.服务器启动,执行ServletContainersInitConfig类,初始化web容器
2.执行createServletApplicationContext方法,创建了WebApplicationContext对象
3.加载SpringMvcConfig
4.执行@ComponentScan加载对应的bean
5.加载UserController,每个@RequestMapping的名称对应一个具体的方法
6.执行getServletMappings方法,定义所有的请求都通过SpringMVC
*单次请求过程
1.发送请求local host/save
2.web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
3.解析请求路径/save
4.由/save匹配执行对应的方法save()
5.执行save()
6.检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方
Controller加载控制与业务bean加载控制
SpringMVC相关bean(表现层bean)
Spring控制的bean
业务bean(Service)
功能bean(DataSource等)
1.因为功能不同,如何避免Spring错误的加载到SpringMVC的bean一加载Spring控制的bean的时候排除掉SpringMVC控制的bean
SpringMVC相关bean加载控制
SpringMVC加载的bean对应的包均在com.itheima.controller包内
Spring相关bean加载控制
方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包
方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中
方式一(排除方式)、方式二(指定方式)
名称:@ComponentScan
类型:类注解
范例:
属性:
excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)
bean的加载格式:
简化开发:
PostMan简介:
PostMan是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
作用:常用于进行接口测试
特征:
简单
实用
美观
大方
请求与响应
请求映射路径
1.团队多人开发,每个人设置不同的请求路径,冲突问题如何解决----------设置模块名作为请求路径前缀
名称:@RequestMapping
类型:方法注解 类注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
范例:
属性:
value(默认):请求访问路径,或访问路径前缀
请求方式
get请求
普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
post请求
普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收数据
Post请求中文乱码处理
为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器
请求参数
参数种类
普通参数:url地址传参,地址参数名与形参变量名相同,定义参数即可接收参数
名称:@RequestParam
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:绑定请求参数与处理器方法形参间的关系
范例:
参数:
required:是否为必传参数
defaultValue:参数默认值
POJO类型参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
嵌套POJO类型参数:
POJO对象中包含POJO对象
请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
数组类型参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数
集合类型参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
请求参数(传递json数据)
json数组
json对象(POJO)
POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数
json数组(POJO)
POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数
1.添加json数据转换相关坐标
2.设置发送json数据(请求body中添加json数据)
3.开启自动转换json数据的支持
注意事项:@EnableWebMvc注解功能强大,该注解整合了多个功能,此前仅使用其中一部分功能,即json数据进行自动转换
4.设置接收json数据
名称:@EnableWebMvc
类型:配置类注解
位置:SpringMVC配置类定义上方
作用:开启SpringMVC多项辅助功能
范例:
名称:@RequestBody
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
范例:
@RequestBody与@RequestParam区别
区别
@RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
@RequestBody用于接收json数据【application/json]
应用
后期开发中,发送json格式数据为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
日期类型参数传递
日期类型数据基于系统不同格式也不尽相同
2020-08-18
2020/08/18
08/18/2020
接收形参时,根据不同的日期格式设置不同的接收方式
名称:@DateTimeFormat
类型:形参注解
位置:SpringMVC控制器方法形参前面
作用:设定日期时间型数据格式
范例:
属性:pattern:日期时间格式字符串
类型转换器
Converter接口
请求参数年年数据(String->Integer)
日期格式转换(String->Date)
注意:如果在某些转换是出问题,可以开启下面注解
@EnableWebMvc功能之一:根据类型匹配对应的类型转换器
响应json数据
响应页面(了解)
响应数据
文本数据(了解)
json数据(对象转json)
json数据(对象集合转json数组)
名称:@ResponseBody
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器返回值作为响应体
范例:
HttpMessageConverter接口
REST风格
REST简介
REST (Representational State Transfer),表现形式状态转换传
统风格资源描述形式
http: / /localhost/user/getById?id=1
http: / / localhost/user/save
UserREST风格描述形式
http: / / localhost/user/1
http: / / localhost/user
优点:
隐藏资源的访问行为,无法通过地址得知对资源是何种操作
书写简化
按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
地址 操作 请求方式
http:/ / localhost/users 查询全部用户信息 GET(查询)
http: / / localhost/users/1 查询指定用户信息 GET(查询)
http: / /localhost/users 添加用户信息 POST(新增/保存)
http: / /localhost/users 修改用户信息 PUT(修改/更新)
http: / /localhost/users/1 删除用户信息 DELETE (删除)
根据REST风格对资源进行访问称为RESTful
注意:上述行为是有约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books.......
RESTful入门案例
步骤:
1.设定http请求动作(动词)
2.设定请求参数(路径变量)
3.
名称:@RequestMapping
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径
范例:
属性:
value(默认):请求访问路径
method:http请求动作,标准动作(GET/POST/PUT/DELETE)
名称:@PathVariable
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一 一对应
范例:
@RequestBody @RequestParam @PathVariable
区别
@RequestParam用于接收url地址传参或表单传参
@RequestBody用于接收json数据
@PathVariable用于接收路径参数,使用{参数名称}描述路径参数
应用
后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
REST快速开发
名称:@RestController
类型:类注解
位置:SpringMVC的RESTful开发控制器类定义上方
作用:设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解组合功能
范例:
名称:@GetMapping @PostMapping@PutMapping @DeleteMapping
类型:方法注解
位置:基于SpringMVC的RESTful开发控制器方法定义上方
作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求
范例:
属性:
value(默认):请求访问路径
案例:基于RESTful页面数据交互
1.制作SpringMVC控制器,并通过PostMan测试接口功能
2.设置对静态资源的访问放行
3.前端页面通过异步提交访问后台控制器
SSM整合
ssm整合
ssm整合流程
1.创建工程
2. SSM整合公
Spring
SpringConfig
MyBatis
MybatisConfig
JdbcConfig
jdbc.properties
SpringMVC
ServletConfig(web配置类)
SpringMvcConfig
3.功能模块
表与实体类
dao(接口+自动代理)
service(接口+实现类)
业务层接口测试(整合JUnit )
controller(基于Restful的Controller)
表现层接口测试( PostMan )
事务处理
表现层数据封装
设置统一数据返回结果类
注意事项:
Result类中的字段并不是固定的,可以根据需要自行增减提供若干个构造方法,方便操作
设置统一数据返回结果编码
注意事项
Code类的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为GET_OK,GET_ALL_OK,GET_PAGE_OK
根据情况设置合理的Result
异常处理器
程序开发过程中不可避免的会遇到异常现象
出现异常现象的常见位置与常见诱因如下:
框架内部抛出的异常:因使用不合规导致
数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)
1.各个层级均出现异常,异常处理代码书写在哪一层?
所有的异常均抛出到表现层进行处理
2.表现层处理异常,每个方法中单独书写,代码书写量巨大且意义不强,如何解决?
AOP思想
异常处理器
集中的、统一的处理项目中出现的异常
名称:@RestControllerAdvice
类型:类注解
位置: Rest风格开发的控制器增强类定义上方
作用:为Rest风格开发的控制器类做增强
范例:
说明:
此注解自带@ResponseBody注解与@Component注解,具备对应的功能
名称:@ExceptionHandler
类型:方法注解
位置:专用于异常处理的控制器方法上方
作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行
范例:
说明:
此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常
项目异常分类
业务异常( BusinessException)
规范的用户行为产生的异常
不规范的用户行为操作产生的异常
系统异常(SystemException)
项目运行过程中可预计且无法避免的异常
其他异常(Exception)
编程人员未预期到的异常
项目异常处理方案
业务异常(BusinessException)
发送对应消息传递给用户,提醒规范操作
系统异常(SystemException)
发送固定消息传递给用户,安抚用户
发送特定消息给运维人员,提醒维护
记录日志
其他异常(Exception)
发送固定消息传递给用户,安抚用户
发送特定消息给编程人员,提醒维护(纳入预期范围内)
记录日志
1.自定义项目系统级异常
2.自定义项目业务级异常
3.自定义异常编码(持续补充)
4.触发自定义异常
5.拦截并处理异常
6.异常处理器效果对比
案例:ssm整合标准开发
拦截器
拦截器概念
拦截器( Interceptor)是一种动态拦截方法调用的机制
作用:
在指定的方法调用前后执行预先设定后的的代码
阻止原始方法的执行
拦截器与过滤器区别
归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对springMVc的访问进行增强
入门案例
1.制作拦截器功能类
2.配置拦截器的执行位置
步骤:
1.声明拦截器的bean,并实现HandlerInterceptor接口(注意:扫描加载bean)
2.定义配置类,继承webMvcConfigurationSupport,实现addInterceptor方法(注意:扫描加载配置)
3.添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个
4.使用标准接口webMvcConfigurer简化开发(注意:侵入式较强)
执行流程:
拦截器参数
前置处理
参数
request:请求对象
response:响应对象
handler:被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装·
返回值
返回值为false,被拦截的处理器将不执行
后置处理
参数
modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整
完成后处理
参数
ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理
拦截器工作流程分析
当配置多个拦截器时,形成拦截器链
拦截器链的运行顺序参照拦截器添加顺序为准
当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作