SSM(B站黑马)学习笔记
01-1-Spring概述
01-2-Spring IOC
01-3-Spring AOP
01-4-Spring 事务
02-SpringMVC
03-SSM整合
04-Maven高级
05-SpringBoot
06-MyBatisPlus
前言
SSM(B站黑马)学习笔记 02-SpringMVC
![](https://i-blog.csdnimg.cn/blog_migrate/30d037fb5588e9a0b78e2f2f5934d287.png)
SpringMVC概述
-
SpringMVC技术与Servlet技术功能等同,均属于web层开发技术
-
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
-
优点
- 使用简单,开发便捷(相比于Servlet)
- 灵活性强
![](https://i-blog.csdnimg.cn/blog_migrate/1ece60ad4dfb27d2de6c76a4d401a890.png)
都是用来做表现层开发的,SpringMVC比Servlet使用起来更简便,可以用更少的代码来实现表现层的开发
相同功能servlet开发与SpringMVC开发对比
servlet
springMVC
SpringMVC入门案例
![](https://i-blog.csdnimg.cn/blog_migrate/9f9f1c78ca10976f24d9c86b8f3528ec.png)
将它定义成一个bean,@Component是定义bean的,不过在SpringMVC中开发表现层的bean要用@Controller
相当于SpringConfig
相当于之前手动启动app改成让tomcat启动
1.使用骨架(模板)的方式创建Maven Web项目
2.导入相关依赖
注意:springmvc的包中前面几个已经包含了springframework基础框架所以不用再导入基础框架了,最后一个是spring-web是spring技术做web开发必导的,就算不用springmvc技术了但要web开发也必须导,它是一个整合包
3.做控制器类UserController
将其声明成bean,一般可以使用@Componen,但使用SpringMVC开发要用专门的注解@Controller声明
4.加载bean,制作SpringMvc的配置类SpringMvcConfig(也可以理解成Spring的配置类SpringConfig,但两个是独立的)
5.做Tomcat启动Spring和SpringMvc的配置类
6.启动tomcat,浏览器访问
成功访问
使用的相关注解
入门案例总结
工作流程
SpringMvc和Spring的bean加载控制
存在问题:
解决办法:
环境初始化
同时配置SpringMVC相关bean(UserController)和Spring相关bean(业务bean)
方式二Spring配置类精准扫描(SpringConfig)
补充:在这因为使用Mybattis自动代理的方式帮我们实现了dao层的实现类创建的实现对象,它的bean不是我们自己定义的,所以不扫描dao包也是可以,但是扫描上增加了通用性,将来不使用自动代理的方式就不用重新修改了。
方式一SpringConfig排除掉controller包内的bean(这是SpringBoot的原理)
先将SpringMvcConfig的扫描关闭,不然扫到@Configuration又会将controller扫进去,也可以把SpringMvcConfig和SpringConfig放出gdit包外。
启动Spring容器,尝试获取UserController的bean
上述两种方法都成功过滤
全局扫描就可以获取到
放开SpringMvcConfig扫描也可以扫到,因为扫到@Configuration在过滤后又重新扫到了,所以先注释掉或者把SpringMvcConfig和SpringConfig放出gdit包外
Tomcat启动Spring和SpringMvc的配置类
两种都一样,加载的配置类不同
简化方式(继承的类不同)
PostMan工具简介
模拟浏览器发送请求,前后端分离
PostMan基本使用
-
下载PosttMan,直接打开,按提示在网页上进行注册登录
-
创建工作空间//进入工作空间
工作空间作用:可以进行云备份,对所有的请求进行备份保留方便后续使用
-
基本使用
保存请求
请求与响应
请求映射路径
![](https://i-blog.csdnimg.cn/blog_migrate/7984448784d39719eaadbd6a173f3bea.png)
问题:团队多人开发,每人设置不同的请求路径,冲突问题如何解决——设置模块名为请求路径前缀
方式一:每个路径前加模块名
方式二:类上方配置统一请求路径,连接具体请求(推荐)
PostMan发送请求
Get请求
Post请求
![](https://i-blog.csdnimg.cn/blog_migrate/012cefb8c3719532ae0e8fd14a6f72a7.png)
补充:x-www-form-urlencoded发送表单数据 form-data不仅能发表单数据还可以发文件
处理Post请求接收中文乱码问题
配置类设置过滤器
请求:5种类型参数传递
@RequestMapping不区分Get或Post请求,都可以接收,普通参数只要发送的请求参数和方法内形参对应即可,主要是PostMan发送的方式不同
普通参数
请求参数名与形参名相同
请求参数名与形参名不同 使用@RequestParam匹配请求参数名,其实每个都应该写,但框架的好处是不写也默认能用
pojo类型参数
![](https://i-blog.csdnimg.cn/blog_migrate/563901dc33204a1b096ad929b02753f7.png)
User类
参数名匹配即可
嵌套pojo类型参数
User类、Address类
对象名.属性名匹配
数组类型参数
![](https://i-blog.csdnimg.cn/blog_migrate/44d33a307c32d8d1ce2d0520f392a7d1.png)
请求参数名相同即可,常用于多选框使用
集合类型参数
![](https://i-blog.csdnimg.cn/blog_migrate/e9c451fdae64a103e055b2f72957c0b5.png)
注意:类似于数组类型参数,请求参数名相同,但要加@RequestParam把它当作集合的数据匹配,直接匹配会误当成对象,它会尝试新建对象导致报错,类似于POJO类型,所以要加@RequestParam当作数据匹配
JSON格式数据(常用)
导入JSON依赖
<!--SpringMvc json解析库-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
开启SpringMvc处理JSON转换
PostMan发送JSON数据
注意:集合类型参数要加@RequestParam把它当作集合的数据匹配,但JSON数据是放在请求体的,所以换成@RequestBody
json数组
![](https://i-blog.csdnimg.cn/blog_migrate/a99a4d792cd0b7a821e5d907ef7936a1.png)
json对象(POJO)
![](https://i-blog.csdnimg.cn/blog_migrate/d46d0ae20246ce029a140a4598f856a4.png)
嵌套pojo使用嵌套json的写法
json数组(POJO)
补充:
前端提交要指定提交格式,PostMan在选择提交方式后自动帮我们设置了
x-www-form-urlencoded发送表单数据 form-data不仅能发表单数据还可以发文件 json发送json数据
application/json 发送的json字符串,前端发送要用JSON.stringify()对json对象进行处理
application/x-www-form-urlencoded 发送的是json对象,所以可以使用@RequestParam对应接收
Json对象和Json字符串的区别,以及Springmvc接受json字符串类型
![](https://i-blog.csdnimg.cn/blog_migrate/028f22039fa826f5489f5ffd6a70f6be.png)
日期型参数传递
2088/08/08是默认格式,当这个格式不适用时使用@DateTimeFormat(pattern=“”)指定格式
注意:要开启@@EnableWebMvc
响应
响应页面/跳转页面(了解)
![](https://i-blog.csdnimg.cn/blog_migrate/228099dfb1085af746e6d66e1e41106e.png)
返回值为String类型,设置返回值为页面名称,即可实现页面跳转
注意:目前还没设置静态资源放行,全部的请求路径都被SpringMvc拦截了,.html文件是无法跳转的,.jsp文件本质上就是一个 Servlet所以能够访问
响应文本数据(了解)
![](https://i-blog.csdnimg.cn/blog_migrate/9aacf12d8bb2c222f2c45039011e622b.png)
返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
响应POJO对象
![](https://i-blog.csdnimg.cn/blog_migrate/b70fa10e911f589bb1e007c4b9f4a2a8.png)
返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
响应POJO集合对象
![](https://i-blog.csdnimg.cn/blog_migrate/d76896dbebb10df53c926b66ccc58e33.png)
返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
REST风格
REST简介
-
REST(Representational State Transfer),表现形式状态转换
-
传统风格资源描述形式
- http://localhost/user/getById?id=1
- http://localhost/user/saveUser
-
REST风格描述形式
- http://localhost/user/1
- http://localhost/user
-
-
优点:
- 隐藏资源的访问行为,无法通过地址得知对资源是如何操作
- 书写简化
Restful是一种设计风格。对于我们Web开发人员来说。就是使用一个url地址表示一个唯一的资源。然后把原来的请求参数加入到请求资源地址中。然后原来请求的增,删,改,查操作。改为使用HTTP协议中请求方式GET、POST、PUT、DELETE表示。
把请求参数加入到请求的资源地址中
原来的增,删,改,查。使用HTTP请求方式,POST、DELETE、PUT、GET分别一一对应。
RESTful入门案例
增
设置当前请求方法为POST,表示REST风格中的添加操作
删
设置当前请求方法为DELETE,表示REST风格中的删除操作
@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同 多的话使用如@PathVariable(“id”)进行标注
改
设置当前请求方法为PUT,表示REST风格中的修改操作
查
查询单个
设置当前请求方法为GET,表示REST风格中的查询操作
@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
查询全部
设置当前请求方法为GET,表示REST风格中的查询操作
REST快速开发(简化)
问题:重复项太多
简化一:@ResponseBody、访问路径去除重复项,将其放到类的上面
简化二:@Controller、@ResponseBody可以使用@RestController进行替换,相当于@RestController可以合并两个注解功能(个人感觉没必要)
简化三:method = RequestMethod.POST等书写太多,使用注解替换
全部简化过后(页面简单很多)
案例:基于RESTful页面数据交互
案例初始化
pom.xml->cooontroller->config
第一步,实现后台表现层接口(Controller层),并使用PoostMan测试接口
保存(新增)图书
图书列表
第二步,导入前端页面
导入前端页面后进行访问,访问出错,原因是设置了所有的请求都被SpringMVC拦截了,无法直接访问静态资源,要进行配置对静态资源放行,让访问静态资源不经过SpringMVC
解决办法:编写配置类(方法很多,这只是常用的)
记得进行扫描
访问成功
第三步,通过Vue发送Ajax异步请求访问后台接口发送数据并响应
图书列表显示
保存(新增)图书
拦截器
拦截器概念
浏览器发起请求,分为静态资源和动态资源,静态资源可直接访问,动态资源先经过servlet的过滤器再到SpringMvc的中央控制器,中央控制器根据请求分发给对应的controller,controller再将数据返回给浏览器。这时我们想要在controllerr前后做些事情,例如权限的判断,判断通过后允许放行。这就是拦截器
现实案例:张三要到中央机房进行运维工作,中央机房是服务器存储数据的重要场所,进入中央机房有层层安保,第一层保安说:这里是中央机房,你是谁。。。(身份验证)。。。里面是无尘环境要把鞋套穿上,第二层保安说:这里是中央机房,你是谁。。。(身份验证)。。。里面是无尘环境还要把防尘服穿上,第三层保安说:这里是中央机房,你是谁。。。(身份验证)。。。里面是无尘环境再把防尘眼镜戴上。经过三层安检(拦截),张三允许进入中央机房进行运维工作。完成工作后再经过三层安检离开。
拦截器和过滤器两者很像,但他们并不同
拦截的东西不同,过滤器是在Tomcat服务器阶段进行配置,它能够对所有的访问进行增强。而拦截器是SpringMvc的技术,只有SpringMVC的访问才能增强
入门案例
案例初始化
第一步:制作拦截器类
创建Interceptor包,因为拦截器是对SpringMVC的请求进行拦截,所以放在controller包下更合理
新建类实现HandlerInterceptor接口,因为该接口使用了default默认方法,所以需要手动覆盖,根据需求进行覆盖,这里全覆盖了。将其声明成bean交由SpringMVC管理,记得进行扫描,因为放在controller包下初始化时已经加入扫描了,换地方要加上。
preHandle方法表示在被拦截请求之前运行,return:true允许放行执行原始操作,false进行拦截不往下执行
postHandle方法表示放行后在被拦截请求的原始操作后运行
afterCompletion方法表示在执行原始操作后并且在postHandle方法后运行
![](https://i-blog.csdnimg.cn/blog_migrate/67596da1e308fe82b0dfe598d10cd503.png)
第二步:编写配置类配置拦截器的执行位置/执行顺序
配置类继承 WebMvcConfigurationSupport(可以和放行静态资源放一个类里)
记得进行扫描
测试
因为指定了拦截请求(“/books”)所以只会拦截"/books",修改为"/books/*"即可对/books下的所有请求进行拦
简化SpringMvcSupport的编写
直接在SpringMvcConfig上写,此后咱们就不用再写SpringMvcSupport
类了。
放行静态资源方法也可以用excludePathPatterns()如:
拦截器参数
request和response跟servlet里的一样功能
handler封装了拦截的方法,HandlerMethod hm = (HandlerMethod) handler; 强转为HandlerMethod后可对被拦截方法进行操作
拦截器链配置
配置多个拦截器类,形成拦截器链
根据配置的前后位置规定拦截器类的执行顺序
preHandle按照顺序依次执行,postHandle和afterCompletion逆序执行,就像进三层安保一样顺进逆出
只要有一个preHandle返回false postHandle都不执行,回到前一个拦截器的afterCompletion
![](https://i-blog.csdnimg.cn/blog_migrate/1c730a605d94e3252485b4e162e51015.png)
总结:
-
拦截器是在控制器前后执行代码的一种工作机制,底层实际上就是AOP。
-
编写拦截器类->编写配置类(使用register添加关系,前面写引用哪个拦截器对象,拦哪一个请求路径 可通配符)
-
通过 request response handle等得到拦截的参数
-
多拦截器(拦截器链)的执行顺序(了解即可,通常一个拦截器就能完成)
注:
该内容是根据B站黑马程序员学习时所记,相关资料可在B站查询:黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术