文章目录
当学完前端Html和数据库的时候,会不会想到如何在页面中链接起我们的数据库,写一个web应用?这个时候我们就需要用到框架!
,本篇文章是我对Springboot学习的一些理解,当然Springboot的强大不止这些,还有很多可以去了解学习的,多看官方文档,本篇文章是一些Springboot的基础用法,希望看完对大家有帮助,本篇文章用的是Springboot+Thymeleaf,后期会出Springboot+vue前后端分离的文章,请大家多多关注,适用于快速上手。
语法基础:Java、Html、JavaScript、Css、Sql、Maven、Thymeleaf
系统需求:VsCode/IDEA、MysqlWorkbench、Maven3+
IDEA需要破解版,大家可以自己去找资源,本篇文章用的是VsCode,Mysql可以用自己喜欢的软件
Springboot
官方文档
https://spring.io
Springboot简介
什么是Springboot?
在开发中我们需要用到SSM来框架来开发,SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。使用spring实现业务对象管理,使用spring MVC负责请求的转发和视图管理,mybatis作为数据对象的持久化引擎。本篇文章会一个一个详细介绍四层框架。
Springboot能做什么?
官方文档的解释
为什么用Springboot呢
他可以快速的创建出出生产级别的Spring应用
优点:
1、创建独立Spring应用
2、内嵌Web服务器
3、自动starter依赖,简化配置
4、自动配置Spring以及第三方功能
5、无代码生成、无需编写XML
准备环境
Vscode准备
JDK :在VsCode中配置下的好JDK
VsCode及插件: Java Extension Pack & Spring Boot Extension Pack
Java:
VSCode 配置Java Home 要不然无法编译运行JAVA
Spring Boot:
开始使用Springboot
依赖管理Maven
Maven是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),一组标准集合,一个项目生命周期(Project LifeCycle),一个依赖管理系统(Dependency managerment System),和用来运行定义在生命周期(phase)中插件(plugin)目标(goal)的逻辑。
通俗来说,我们需要引入的各种Jar包,Maven可以自动下载。
安装Maven
创建Springboot项目
创一个空文件夹,然后VsCode打开 control +shift + P打开VsCode场景选择起
在下载的Spring Initialize Java Support中可以通过Maven自动创建一个Springboot 项目
选择版本我选择的是2.7.5
选择Java
更改项目的名字修改com.后面的内容
创建修改ID
选择Jar包
选择配置好的Java Version 注意一定要和自己在Vscode中的配置的版本一样
不知道的可以打开终端输入 Java -v
选择场景依赖,也是场景启动器,你需要的依赖都可以选择,这里可以先选择DevTools
创建之后就是在第一次加载,可能需要很长时间,Maven要下载jar包
启动Springboot Hello
在Controller中写一个HelloController 标注是Controller注解,这是第一个Hello请求
启动Springboot
在页面中输入http://localhost:8080/hello
就发现出现了Hello ,Spring Boot 2
自动配置原理
● 自动配好Web常见功能,如:字符编码问题
○ SpringBoot帮我们配置好了所有web开发的常见场景
● 自动配好SpringMVC
○ 引入SpringMVC全套组件
○ 自动配好SpringMVC常用组件(功能)
● 默认的包结构
1、@SpringBootApplication
配置类
2、@ComponentScan
指定扫描,包扫
3、@EnableAutoConfiguration
@SpringBootApplication
等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.example.demo")
● 按需加载所有自动配置项
○ 非常多的starter
○ 引入了哪些场景这个场景的自动配置才会开启
○ SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面
Maven自动配置
1.在pom文件中 parent几乎声明了所有开发中的版本号
2.修改版本号
查看spring-boot-dependencies里面规定当前依赖的版本用的key
在当前项目里面重写配置
3.starter场景启动器
4、所有场景启动器最底层的依赖
Tomcat
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
自动引入 只需要访问localhost:8080
自动配置原理
(1)@AutoConfigurationPackage
自动配置包
将指定的一个包下的所有组件导入进来(包MainApplication)
(2)@Import(AutoConfigurationImportSelector.class)
所有的自动配置类在这里配置写死
4、按需开启自动配置
虽然127个场景所有配置在启动时候都会加载
但最终都会按需配置
5、修改只需要在
Springboot容器功能
组件添加
@Configuration配置
在Config包中,你需要添加和修改的配置类需要加上@Configuration注解,这会告诉springboot这是一个配置类==配置文件
@Bean、@Component、@Controller、@Service、@Repository
@Bean
在Configuration中使用@Bean是将此方法注入到容器中,才可以调用,不然会报空指针异常
Component
@component是spring中的一个注解,它的作用就是实现bean的注入。在Java的web开发中,提供3个@Component注解衍生注解(功能与@component一样)分别是:
@Controller
@Controller 控制器(注入服务) 用于标注控制层,在controller包中所有的controller都要加上这个注解
来告诉Springboot这是一个控制层
@Service
@Service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理
@Repository
@Repository(实现dao访问) 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
####@ComponentScan、@ Import( )导入组件
在Config中使用@Import({User.class})将User这个类注入到Config中,这样才可以使用
@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
原生配置文件引入
@ImportResource(“classpath:beans.xml”)导入spring的配制文件
配置绑定
@ConfigurationProperty+@Component
写Controller
配置文件
在浏览器输入localhost:8080/car
因为我的注解是RestController它会将返回的数据变成Json的形式
@EnableConfigurationProperties(Car.class)
1、开启Car配置绑定
2、把这个Car这个组件自动注册
在Config中写
@EnableConfigurationProperties(Car.class)
public class MyConfig {
}
最佳实践
步骤
1、引入场景依赖
sprint-boot-starter-什么什么
2、查看自动配置(选)
在properties中 加入 debug=true
3、是否需要修改配置项
(1)在spring boot官网参照文档
(2)自定义加入或替换组件
用@Bean或者@Component
Lombok简化开发
Lombok可以自动设置Bean的get set等方法
@Data自动映入属性的set和get方法
@ArgsConstructor 设置全参构造器
1、引入依赖
在springboot dependecy找到lombok然后加入到pom文件中
2、安装插件
3、在Bean包中的类 加入注解
在编译的时候自动生成
4、@Slf4j日志
log.info(String字符串)
在编译的时候终端会打印出日志内容
dev-tools
control+F9热更新,项目更改内容实时生效
Spring Initailizr
自动配置maven,创建springboot,要什么场景直接选
配置文件-yaml(选)
https://yaml.org/spec/1.2.2/
下载yaml插件将application.properties改成yaml结尾
可以防止在配置文件中的冗余
基本语法可以看官方文档
Web开发
创建:在创建Springboot项目的时候选择依赖的时候Spring web、Dev Tools、Lombok、Configuration Processor
SpringMVC自动配置
静态资源访问
1、目录
静态资源jsp、png、html放在静态资源目录下
目录可以下面这些
原理: 静态映射/**
先去所有的容器里找,然后再去静态资源文件找
也可以改变
spring.mvc.static-location=classpath:/haha/
2、静态资源访问前缀
默认无前缀
在配置文件中设置spring.mvc.static-path-pattern=/res/**
欢迎页支持
Springboot默认访问tomcat是从静态资源下 index.html
可以配置静态资源路径
不可以配置静态资源的访问前缀,否则无法默认访问
controller能处理 index
自定义Favicon 小图标
Springboot默认访问在stactic目录下加入favicon.ico
静态路径不可以访问到
静态资源配置原理
SpringBoot启动默认加载 xxxAutoConfiguration类
SpringMVC功能的自动配置类 大多在WebMvcAutoConfiguration,生效
给容器中配置
请求参数处理
前后端的数据传输都是以Json的形式传输
请求映射
在Controler中定义自己的请求
核心Filter: HiddenHttpMethodFilter
用法:
在html中的Form中绑定action
页面显示:
点击删除
Spring Boot要手动开启Delete:
spring.mvc.hiddenmethod.filter.enabled=true
请求映射原理
JVM DispatcherServlet
所有的请求映射都在HandlerMapping(映射处理器)中
比如 SpringBoot自动配置了欢迎页的HanderMapping 访问/就可以访问/index.html
普通参数与基本注解
以Json数据发送请求,但是可以设置xml 只需要在请求后面加?format=xml
@ PathVariable使用
路径变量获取{ }中的数据返回
将数据都放入到map中,然后返回map,我这里是以Xml的格式返回
点击
页面返回Map
@RequestHeader使用
@RequestParam(获取请求参数)
@RequestBody(获取请求体[POST])表单
Controller:
Html:
页面:
点击提交返回
要有name不然无法获取
@RequestAttribute获取request域属性
先将msg部署进去
然后访问数据有两种办法
1、注解
2、request中getAttribute
3、中文乱码问题
配置文件中加入
server.tomcat.uri-encoding=utf-8
server.servlet.encoding.force=true
server.servlet.encoding.enabled=true
server.servlet.encoding.charset=UTF-8
@MatrixVariable矩阵变量
1、语法
2、SpringBoot默认禁用了矩阵变量
手动开启:原理 对于路径的处理 UrlPathHelper进行解析
方法一:
方法二:
复杂参数
Map Model HttpServertRequest(map model 里面的数据会被放在request请求域中)
给requset数据域中放数据
收到请求
返回Json
自定义对象参数(对象)
数据绑定:页面提交请求(GET、POST)到可以和对象属性进行绑定
1、在bean层写入对象
2、在html中form一一对应他的属性
3、绑定controller
点击提交返回Json数据:
自定义Converter
当我想让pet的格式获取为名字,年龄
Converter是SpringMvc里面的功能,可以将html获取的数据进行转换
自定义SpringMVC的功能:在Bean里面重新写函数返回WebMvcConfigurer
在返回WebMvcConfigurer中重写addFormatters方法
addFormatter可以通过FormatterRegistry添加一个Converter
要写好获取类型和返回类型
然后再重新Convert方法,将字符串分割
数据响应与内容协商
响应JSON
Springboot自动引入JSON
只需要给方法中标注RespondBody,就可以前段自动返回json数据,或者直接RequestMapping
内容协商
根据客户端接受能力不同,返回不同媒体类型的依赖
通过遍历所有的MessageConverter能找到合适处理MediaType的MessageConverter
例如:
1、xml依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
2、PostMan测试返回json 和xml
只需要改变请求头Accept字段,Http协议中规定的告诉服务器客户端可以接收的数据类型
3、开启浏览器参数方式内容协商功能
spring.mvc.contentnegotiation.favor-parameter=true
4、自定义MessageConverter
视图解析与模板引擎
视图解析:SpringBoot默认不支持 JSP,需要引入第三方模板引擎技术实现页面渲染。
1、视图解析
过程:把所有的页面资源放在templates文件夹中,然后根据每个页面的不同操作,写对应的controller,完成数据交互
2、Thymeleaf模板引擎
官方文档
https://www.thymeleaf.org
可以把客户端的内容写到网页中
与JSP(动态网页技术)Velocity,FreeMaker 等模板引擎类似,也可以轻易地与 Spring MVC 等 Web 框架集成,当通过 Web 应用程序访问时,Thymeleaf 会动态地替换掉静态内容,使页面动态显示。
https://www.thymeleaf.org
()
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、自动配置
自动配好的策略
● 1、所有thymeleaf的配置值都在 ThymeleafProperties
● 2、配置好了 SpringTemplateEngine
● 3、配好了 ThymeleafViewResolver 视图解析器
● 4、我们只需要直接开发页面
前缀
后缀
3、页面开发
先引入thymeleaf
<html lang="en" xmlns:th="http://www.thymeleaf.org">
在页面中
构建后台管理系统
模板下载
https://gitee.com/coderdlg/adminex/tree/master
1、将表单绑定post和/login请求
Bean中User类
表单发送Post方式的login请求,处理完进入main
2、login跳转到main页
session原理
model
3、抽取公共页
(1)写入公共元素
每个页面的左侧菜单和头菜单都是一样的
在common.html中写上相同的
如头都是一样的
(2)标注名字(两种方法)th官方文档中有
(3)使用公共
th调用,有三种用法
include:不会保留大标签
replace:会保留head
例如在main中调用公共同的head的link:
id调用
例如:在main中调用公共的JS
(4)修改公共跳转页面
在common中找到跳转去掉.html,直接访问路径下的页面
4、在form中历练表单
拦截器
主要登入检查功能
有三种位置
prehandler在处理目标方法前
在处理方法后还没到页面posthandler
在页面结束后还可以afterhandler
核心 HandlerInterceptor 接口
1、编写一个拦截器实现HandlerInterceptor接口
2、拦截器注册到容器中 (实现webmvcConfiguer的addinteceptors)
3、指定拦截规则
异常记录处理
spring.mvc.hiddenmethod.filter.enabled=true
web原生组件(Servlet Filter Listener)
1、使用Servlet api
Servlet
先在主函数上写@ServletComponentScan指定Servlet组件放哪里
然后利用@WebServlet(urlPatterns = “/my”)直接响应,没有经过Spring拦截器
Filter(过滤器)
https://blog.csdn.net/m0_51545690/article/details/123677340
Listener (监听器)
2、使用RegistrationBean
ServletRegistrationBean, FilterRegistrationBean, and ServletListenerRegistrationBean
嵌入式Servlet容器
● 默认支持的webServer
○ Tomcat, Jetty, or Undertow
○ ServletWebServerApplicationContext 容器启动寻找ServletWebServerFactory 并引导创建服务器
● 原理
○ SpringBoot应用启动发现当前是Web应用。web场景包-导入tomcat
○ web应用会创建一个web版的ioc容器 ServletWebServerApplicationContext
○ ServletWebServerApplicationContext 启动的时候寻找ServletWebServerFactory(Servlet 的web服务器工厂—> Servlet 的web服务器)
○ SpringBoot底层默认有很多的WebServer工厂; TomcatServletWebServerFactory, JettyServletWebServerFactory, or UndertowServletWebServerFactory
○ 底层直接会有一个自动配置类。ServletWebServerFactoryAutoConfiguration
○ ServletWebServerFactoryAutoConfiguration导入了ServletWebServerFactoryConfiguration(配置类)
○ ServletWebServerFactoryConfiguration 配置类 根据动态判断系统中到底导入了那个Web服务器的包。(默认是web-starter导入tomcat包),容器中就有 TomcatServletWebServerFactory
○ TomcatServletWebServerFactory 创建出Tomcat服务器并启动;TomcatWebServer 的构造器拥有初始化方法initialize—this.tomcat.start();
○ 内嵌服务器,就是手动把启动服务器的代码调用(tomcat核心jar包存在)
定制化原理
1、定制化的常见方式
● 修改配置文件;
● xxxxxCustomizer;
● 编写自定义的配置类 xxxConfiguration;+ @Bean替换、增加容器中默认组件;视图解析器
● Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件
JWT
什么是JWT
1.什么是JWT
在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程:
客户端使用用户名和密码请求登录
服务端收到请求,验证用户名和密码
验证成功后,服务端会签发一个token,再把这个token返回给客户端
客户端收到token后可以把它存储起来,比如放到cookie中
客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据
依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.3</version>
</dependency>
2、原理分析套路
场景starter - xxxxAutoConfiguration - 导入xxx组件 - 绑定xxxProperties – 绑定配置文件项
3、使用会在下一篇Springboot+vue中详细讲
数据访问
SQL
数据源的配置
1、导入JDBC场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
自动导入了
导入数据库驱动MySQL
https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.20
去Maven官网找到自己的MySql版本
2、自动配置
3、修改配置项
4、检验是否连接
使用Druid数据源
1、引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
2、自定义方法
(1)StatViewServlet
StatViewServlet的用途包括:
提供监控信息展示的html页面
提供监控信息的JSON API
监控页功能
@Bean
public ServletRegistrationBean servletRegistrationBean(){
StatViewServlet statViewServlet=new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
return registrationBean;
}
开启监控功能
访问sql 监控生效
3、官方方法
引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
手动配置
####对 MyBatis操作
1、映入starter
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
Mybatis官方文档
https://mybatis.org/mybatis-3/zh/index.html
配置模式
步骤:
1、
全局配置文件
内容都配置好了不用 写
2、指定配置路径
3、Bean
要加入Mapper注解 不然mybatis找不到
配置xml绑定接口,绑定函数 mapper就可以操作数据库
4、Service
5、controller调用Service
中文乱码问题上面提到,修改配置就可以了
注解模式
1、写City类放入到Bean
2、写Mapper
3、写service
整合Mybatis-plus完成Crud
整合Mybatis-plus
官网文档:https://baomidou.com/pages/226c21/
他是Mybatis的一个增强工具,简化开发,非常好用,比Mybatis方便很多
建议下载Mybatis X插件
1、映入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
自动配置了
准备工作
1、自动包扫
2、如果要用Mybatis配置模式也可以 只不过位置改了
3、Bean中放类
4、写Mapper
5、在Service中创建有关服务接口
6、在Service创建一个impl实现包,创关于Service接口的实现类
实战:Crud
1、展示数据
2、分页
controller
from
分页功能