【SSM学习】02-SpringMVC

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


SpringMVC概述

  • SpringMVC技术与Servlet技术功能等同,均属于web层开发技术

  • SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

  • 优点

    • 使用简单,开发便捷(相比于Servlet)
    • 灵活性强

都是用来做表现层开发的,SpringMVC比Servlet使用起来更简便,可以用更少的代码来实现表现层的开发

相同功能servlet开发与SpringMVC开发对比

servlet

springMVC

SpringMVC入门案例

将它定义成一个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基本使用

  1. 下载PosttMan,直接打开,按提示在网页上进行注册登录

  2. 创建工作空间//进入工作空间
    工作空间作用:可以进行云备份,对所有的请求进行备份保留方便后续使用

  3. 基本使用

保存请求

请求与响应

请求映射路径

问题:团队多人开发,每人设置不同的请求路径,冲突问题如何解决——设置模块名为请求路径前缀
方式一:每个路径前加模块名

方式二:类上方配置统一请求路径,连接具体请求(推荐

PostMan发送请求

Get请求

Post请求

补充:x-www-form-urlencoded发送表单数据 form-data不仅能发表单数据还可以发文件

处理Post请求接收中文乱码问题

配置类设置过滤器

请求:5种类型参数传递

@RequestMapping不区分Get或Post请求,都可以接收,普通参数只要发送的请求参数和方法内形参对应即可,主要是PostMan发送的方式不同

普通参数

请求参数名与形参名相同

请求参数名与形参名不同 使用@RequestParam匹配请求参数名,其实每个都应该写,但框架的好处是不写也默认能用


pojo类型参数

User类

参数名匹配即可

嵌套pojo类型参数

User类、Address类

对象名.属性名匹配

数组类型参数

请求参数名相同即可,常用于多选框使用

集合类型参数

注意:类似于数组类型参数,请求参数名相同,但要加@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数组
json对象(POJO)

嵌套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字符串类型

日期型参数传递


2088/08/08是默认格式,当这个格式不适用时使用@DateTimeFormat(pattern=“”)指定格式
注意:要开启@@EnableWebMvc

响应

响应页面/跳转页面(了解)

返回值为String类型,设置返回值为页面名称,即可实现页面跳转

注意:目前还没设置静态资源放行,全部的请求路径都被SpringMvc拦截了,.html文件是无法跳转的,.jsp文件本质上就是一个 Servlet所以能够访问

响应文本数据(了解)

返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解

响应POJO对象

返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解

响应POJO集合对象

返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的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方法后运行

第二步:编写配置类配置拦截器的执行位置/执行顺序

配置类继承 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

总结:

  • 拦截器是在控制器前后执行代码的一种工作机制,底层实际上就是AOP。

  • 编写拦截器类->编写配置类(使用register添加关系,前面写引用哪个拦截器对象,拦哪一个请求路径 可通配符)

  • 通过 request response handle等得到拦截的参数

  • 多拦截器(拦截器链)的执行顺序(了解即可,通常一个拦截器就能完成)


注:

该内容是根据B站黑马程序员学习时所记,相关资料可在B站查询:黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值