2021springboot笔记

文章目录

1、SpringBoot入门 1-25 26-46

1.1 如何创建一个springboot框架web项目 001

创建一个空项目,然后添加模块Spring Initializr,然后添加相关信息就行了。

1.2 集成springmvc 002

  • 使用springboot框架集成springmvc

创建完了之后,就已经集成好了mvc

1.3 核心配置文件application.properties 003

  • 使用springboot框架的核心配置文件application.properties

在这里插入图片描述

1.4 核心配置文件application.yml或application.yaml 004

  • 使用springboot的核心配置文件application.yml或者application.yaml

yml和yaml格式文件都是这
在这里插入图片描述

1.5 核心配置.properties和.yaml或者.yml同时存在?005

  • springboot框架的核心配置application.properties和application.yaml或者application.yml同时存在?

application.properties优先级大于application.yml

1.6 多环境下核心配置文件的使用(properties) 005

  • 多环境下核心配置文件的使用(properties),工作中开发的环境有哪些:开发环境,测试环境,准生产环境,生产环境

在这里插入图片描述

1.7 多环境下核心配置文件的使用(yaml或者yml)

  • 多环境下核心配置文件的使用(yaml或者yml),工作中开发的环境有哪些:开发环境,测试环境,准生产环境,生产环境

与第6个类似,只是书写语法不同
在这里插入图片描述

1.8 @Value 008

  • springboot在核心配置文件application.properties自定义配置一个一个获取

使用注解 @Value
配置文件:
在这里插入图片描述
对应controller文件:
在这里插入图片描述
如果配置文件是 .yml 文件(官方推荐也是这种文件),可以直接配置对象:(并且在.yml文件中,可以使用一些函数,比如${random.int}之类的)
在这里插入图片描述

1.9 核心配置文件将自定义配置映射到一个对象 008

  • springboot在核心配置文件将自定义配置映射到一个对象

首先配置文件
在这里插入图片描述
然后封装一个类:
在这里插入图片描述
然后使用@Autowired注入进来使用
在这里插入图片描述
注:解决使用@ConfigurationProperties注解出现的警告问题

<!--        解决使用@ConfigurationProperties注解出现的警告问题-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

1.10 SpringBoot集成jsp 010

创建文件夹
在这里插入图片描述
打开项目结构
在这里插入图片描述
在这里插入图片描述
添加依赖:

<!--        引入spring boot内嵌Tomact的解析依赖,不添加解析不了jsp-->
<!--        仅仅只是展示jsp页面,只添加一下一个依赖-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

然后在build中添加

    <build>
<!--        SpringBoot项目默认推荐使用的前端引擎是thymeleaf
            现在我们要使用springboot集成jsp,手动指定jsp最后编译的路径
            而且springboot集成jsp编译jsp的路径是springboot规定好的位置
            META-INF/resources
-->
        <resources>
            <resource>
                <!--源文件夹 -->
                <directory>src/main/webapp</directory>
                <!--指定编译到META-INF/resources -->
                <targetPath>META-INF/resources</targetPath>
                <!--指定源文件夹中的哪个资源要编译进行 -->
                <includes>
                    <include>*.*</include>
                </includes>
            </resource>
        </resources>

最后在配置文件中配置视图解析器
在这里插入图片描述

# 配置视图解析器
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp

配置完成后,如何使用?
先在webapp中新建jsp文件
在这里插入图片描述
然后在controller中使用,(这里是两种使用方法)
特别注意:在这里第二种方法使用时:方法名前不要加注解@ResponseBody
对于下图,如果加了@ResponseBody注解,返回的就是字符串;如果不加@ResponseBody注解,返回的是页面。
在这里插入图片描述

2、SpringBoot框架web开发

2.11 SpringBoot集成MyBatis 012

a.添加mybatis依赖,MySQL驱动

<!--MySQL驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!--MyBatis整合SpringBoot框架的起步依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>

b.使用MyBatis提供的逆向工程生成实体bean,映射文件,Dao接口

项目根目录下新建这个 GeneratorMapper.xml
在这里插入图片描述
把如下内容填入进去(00处修改位置,0处修改jdbc连接,123处修改包名,4处修改表名 实体类名) GeneratorMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <!-- 00-->
    <!-- 指定连接数据库的 JDBC 驱动包所在位置,指定到你本机的完整路径 -->
    <classPathEntry location="D:\mysql-connector-java-5.1.26.jar"/>
    <!-- 配置 table 表信息内容体,targetRuntime 指定采用 MyBatis3 的版本 -->
    <context id="tables" targetRuntime="MyBatis3">
        <!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 0-->
        <!-- 配置数据库连接信息 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/springboot"
                        userId="root"
                        password="991113">
        </jdbcConnection>
        <!-- 1  实体类-->
        <!-- 生成 model 类,targetPackage 指定 model 类的包名, targetProject 指定
       生成的 model 放在 eclipse 的哪个工程下面-->
        <javaModelGenerator targetPackage="com.hui.liu.model"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="false" />
        </javaModelGenerator>
        <!-- 2  Mapper.xml文件-->
        <!-- 生成 MyBatis 的 Mapper.xml 文件,targetPackage 指定 mapper.xml 文件的
       包名, targetProject 指定生成的 mapper.xml 放在 eclipse 的哪个工程下面 -->
        <sqlMapGenerator targetPackage="com.hui.liu.mapper"
                         targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- 3  Mapper接口文件-->
        <!-- 生成 MyBatis 的 Mapper 接口类文件,targetPackage 指定 Mapper 接口类的包
       名, targetProject 指定生成的 Mapper 接口放在 eclipse 的哪个工程下面 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.hui.liu.mapper"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

		<!-- 4-->
        <!-- 数据库表名及对应的 Java 模型类名 (第一行前后两个分别是 表名 和 实体类名 )-->
        <table tableName="t_student" domainObjectName="Student"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

在pom文件中添加一个插件

<!--mybatis 代码自动生成插件-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <!--配置文件的位置-->
                    <configurationFile>GeneratorMapper.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>

双击此处生成
在这里插入图片描述

结果:
在这里插入图片描述

c.生成映射文件中都什么意思?

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一个对数据库操作的小项目练手 012

Mapper接口这里要加@Mapper注解,service接口实现类这里要加@Service注解
可以对mapper包里的每一个接口都加一个@Mapper注解,也可以直接在启动文件那里加一个总的注解@MapperScan(basePackages = “com.hui.liu.mapper”) 对于参数提示,快捷键ctrl+p
这里注解除了 @Mapper ,可以再加一个 @Repository
在这里插入图片描述
也可以只写这一个:
在这里插入图片描述

@MapperScan(basePackages="com.hui.liu.mapper")

在这里插入图片描述
手动指定文件夹为resources(这是第一种写法,后面还有第二种写法)

<!--手动指定文件夹为resources,因为mapper在java文件夹,不写这个会找不到的-->
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
    </resource>
</resources>

配置文件设置连接数据库的信息

# 配置连接数据库的配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=991113

2.12 Mapper映射文件存放位置 015

这里看第二种写法,将xml资源文件,放到resources下面的mapper文件夹(自己创建)
然后再application.properties中指定MyBatis映射文件的路径

# 指定MyBatis映射文件的路径(这里面classpath:指的是resources文件夹)
# (下面这句话的意思就是resources文件夹下mapper文件夹下的所有.xml文件)
mybatis.mapper-locations=classpath:mapper/*.xml
# 下面这个也可以加上,关于别名的(后面是实体类路径)
mybatis.type-aliases-package=com.hui.pojo

在这里插入图片描述
在这里插入图片描述

2.13-15 11和12的总结

在这里插入图片描述

2.16 事务 016

  • SpringBoot项目下使用事务

事务是一个完整的功能,也叫做一个完整的业务
事务只跟什么SQL语句有关系?事务只跟DML语句有关系:增删改
DML, DQL, DDL, TCL, DCL

怎么使用事务功能呢?
只需要在相应方法上加上@Transactional注解就行了
在这里插入图片描述

2.17 SpringBoot常用注解 017

@RestController注解
@GetMapping(value = “/studentDetail2”)注解
@PostMapping(value = “/insert”)注解
@DeleteMapping(value = “/delete”)注解
@PutMapping(value = “/update”)注解
在这里插入图片描述
各个注解用法:
在这里插入图片描述

2.18 RESTFul风格 018

在这里插入图片描述
在这里插入图片描述

2.19 集成Redis 019

a.添加操作redis数据类型的依赖
b.在SpringBoot核心配置文件中添加redis的配置
依赖:

<!--        SpringBoot集成Redis的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

配置信息:

# 设置redis配置信息
spring.redis.host=
spring.redis.port=
spring.redis.password=

注入对象:

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

在这里插入图片描述

2.20-22 集成Dubbo分布式框架 020 021 022(详细看第8部分)

(类似几个工程间通信)
详细看第8部分,或者看该博客 Dubbo+ZooKeeper.
先创建三个项目,分别是以下三个。

a.接口工程:存放实体bean和业务接口 020 (建立一个maven工程,存放接口)

b.服务提供者:业务接口的实现类并将服务暴露且注册到注册中心,调用数据持久层 021 (一个springboot工程,对接口的实现)

	- 添加依赖(dubbo,注册中心,接口工程)
	- 配置服务提供者核心配置文件

c.服务消费者:处理浏览器客户端发送的请求,从注册中心调用服务提供者所提供的服务 022 (一个spring boot工程,业务的实现)

	- 添加依赖(dubbo,注册中心,接口工程)
	- 配置服务消费者核心配置文件

详细内容:

b.服务提供者:业务接口的实现类并将服务暴露且注册到注册中心,调用数据持久层 021
- 添加依赖(dubbo,注册中心,接口工程)

<!--Dubbo集成SpringBoot框架起步依赖-->
<dependency>
    <groupId>com.alibaba.spring.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>

<!--注册中心-->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>

<!--接口工程-->
<dependency>
    <groupId>com.hui.liu</groupId>
    <artifactId>020-springboot-dubbo-interface</artifactId>
    <version>1.0.0</version>
</dependency>
  • 配置服务提供者核心配置文件
# 设置内嵌Tomcat端口号
server.port=8080
# 设置上下文根
server.servlet.context-path=/

# 设置dubbo的配置
spring.application.name=021-springboot-dubbo-provider
# 当前工程是一个服务提供者
spring.dubbo.server=true
# 设置注册中心
spring.dubbo.registry=zookeeper://192.168.154.128:2181

c.服务消费者:处理浏览器客户端发送的请求,从注册中心调用服务提供者所提供的服务 022
- 添加依赖(dubbo,注册中心,接口工程)

		同b
	- 配置服务消费者核心配置文件
# 设置内嵌Tomcat端口号
server.port=8080
# 设置上下文根
server.servlet.context-path=/

# 设置dubbo的配置
spring.application.name=021-springboot-dubbo-consumer

# 设置注册中心
spring.dubbo.registry=zookeeper://192.168.154.128:2181

相关注解

在提供者(021提供者工程,实现类需要加注解@Component 和@Service)
在这里插入图片描述
在消费者控制层类里面(022消费者工程,加注解@Reference)
在这里插入图片描述
在提供者类和消费者类启动类前都要加注解@EnableDubboConfiguration,如图所示:
在这里插入图片描述
在这里插入图片描述

2.23-25 集成Dubbo,Redis,MyBatis,Spring,SpringMVC,JSP 023 024 025

前面知识的大总和

  • a.接口工程:存放实体bean和业务接口
  • b.服务提供者:它是一个SpringBoot框架web项目,集成MyBatis,Redis
    – 添加依赖:MyBatis依赖,MySql驱动依赖, Dubbo依赖,zookeeper依赖,接口工程
    – 配置springboot核心配置文件
    – 配置连接数据库
    – 配置连接redis
    – 配置连接dubbo
  • c.服务消费者:它是一个SpringBoot框架web项目,集成JSP,dubbo
    – 添加依赖:Dubbo依赖,zookeeper依赖,接口工程,解析JSP页面的依赖
    – 配置SpringBoot核心配置文件
    – 配置视图解析器
    – 配置dubbo

------------------------------------------------------------------------------

2.26 创建非web工程 026 了解即可

跟web项目的区别,就是不用勾选Spring Web
第一种方式:
在这里插入图片描述

2.27 创建非web工程2 027 了解即可

  • 实现CommandLineRuner,重写run方法

第二种方式:
在这里插入图片描述

2.28 关闭工程的启动Logo 了解即可

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
 	SpringApplication springApplication = new SpringApplication(Application.class);
 	//关闭启动 logo 的输出
 	springApplication.setBannerMode(Banner.Mode.OFF);
 	springApplication.run(args);
 	}
}

2.29 修改工程的启动Logo 了解即可

在resource 新建一个 banner.txt ,把内容写进去即可。
可 以 利 用 网 站 生 成 图 标 : 链接1 或 者链接2

2.30 拦截器 030

  • 1 定义一个拦截器,实现HandlerInterceptor接口

在这里插入图片描述

  • 2 创建一个配置类(即:在SpringMVC配置文件中使用mvc:interceptors标签)

在这里插入图片描述

2.31 使用Servlet 031 032 (了解就行)

  • 创建一个servlet它要继承HttpServlet
  • 在web.xml配置文件中使用servlet servlet-mapping

a.第一种方式031==> @WebServlet(urlPatterns = “”), @ServletComponentScan(basePackages = “”)
在这里插入图片描述
在这里插入图片描述
b.第二种方式 032 ===> 通过配置类注册组件
在这里插入图片描述
在这里插入图片描述

2.33 过滤器Filter 033 034

a.第一种方式:注解方式,使用注解@WebFilter(urlPatterns = “”), 并在启动类使用注解@ServletComponentScan(basePackages = “”) 033
在这里插入图片描述
在这里插入图片描述

b.第二种方式:使用配置类的方式 034
在这里插入图片描述
在这里插入图片描述

2.35 设置字符编码 035 036 (掌握方法二即可)

a.第一种实现方式 035

  • 写一个配置类,设置编码格式
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;

@Configuration
public class SystemConfig {

    @Bean
    public FilterRegistrationBean characterEncodingFilterRegistrationBean(){
        //创建字符编码过滤器
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        //设置强制使用指定字符编码
        characterEncodingFilter.setForceEncoding(true);
        //设置指定字符编码
        characterEncodingFilter.setEncoding("utf-8");


        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        //设置字符编码过滤器
        filterRegistrationBean.setFilter(characterEncodingFilter);
        //设置字符编码过滤器路径
        filterRegistrationBean.addUrlPatterns("/*");

        return filterRegistrationBean;
    }
}
  • 在配置文件中指定一下
# 关闭springboot的http字符编码支持
# 只有关闭该选项后,spring字符编码过滤器才生效
server.servlet.encoding.enabled=false
  • 在servlet中设置浏览器的编码格式
//统一设置浏览器编码格式
resp.setContentType("text/html;character=utf-8");

在这里插入图片描述
b.第二种实现方式 036 掌握这个就行

  • 在配置文件中写如下内容
# 设置请求相应字符编码
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
server.servlet.encoding.charset=utf-8
  • 在servlet中设置浏览器的编码格式
//统一设置浏览器编码格式
resp.setContentType("text/html;character=utf-8");

在这里插入图片描述

2.36 打war包 037

war包端口号和上下文根是以内嵌Tomcat为准
1.在.pom文件中加以下代码
在gva坐标前写

<!--修改打包方式-->
<packaging>war</packaging>

在build中写

<!--指定打war包的字符,  名字可以自己来取-->
<finalName>SpringBootWar</finalName>

在resources中写

<resource>
    <!--源文件夹-->
    <directory>src/main/webapp</directory>
    <!--目标文件夹-->
    <targetPath>META-INF/resources</targetPath>
    <!--包含的文件-->
    <includes>
        <include>**/*.*</include>
    </includes>
</resource>
<!--mybatis 的 mapper.xml-->
<resource>
    <directory>src/main/java</directory>
    <includes>
        <include>**/*.xml</include>
    </includes>
</resource>
<!--src/main/resources 下的所有配置文件编译到 classes 下面去-->
<resource>
    <directory>src/main/resources</directory>
    <includes>
        <include>**/*.*</include>
    </includes>
</resource>

2.在入口类中继承SpringBootServletInitializer类
在这里插入图片描述

在Meven中双击package即可
在这里插入图片描述

2.37 打jar包 038

jar包端口号和上下文根就是springboot核心配置文件中设置的值
自带打包插件这里加上这个版本号
在这里插入图片描述
build里面可以指定打包的名字
在这里插入图片描述
然后就可以在Maven中双击package进行打包了
在这里插入图片描述
将生成的.jar文件,可以放到任何位置,使用下面命令就可以执行

java -jar 包名.jar

Windows后台运行的jar包怎么关闭?
如果后台启动怎样找到对应服务。
查看所有端口占用情况

netstat -ano

服务的端口查询进程的PID

netstat -ano | findstr “8900

查看PID对应的服务名称

tasklist | findstr “PID号”

kill这个服务

taskkill /f /t /im javaw.exe

2.39 集成logback日志 039

在resources下新建文件 logback-spring.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为
TRACE < DEBUG < INFO < WARN < ERROR < FATAL,
如果设置为 WARN,则低于 WARN 的信息都不会输出 -->
<!--
scan:当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认值为true
-->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认
单位是毫秒。当 scan 为 true 时,此属性生效。默认的时间间隔为 1 分钟。 -->
<!-- debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback
运行状态。默认值为 false。通常不打印 -->
<configuration scan="true" scanPeriod="10 seconds">
    <!-- 1 ..  输出到->控制台<-  -->
    <appender name="CONSOLE"
              class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志 appender 是为开发使用,只配置最底级别, 控制台输出的日志级别是大
       于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>%date [%-5p] [%thread] %logger{60} [%file : %line] %msg%n</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 2 .. 日志输出到->文件<-  下面File表示输出的文件位置,fileNamePattern可以把之前的打包-->
    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--<File>/home/log/stdout.log</File>-->
        <File>D:/log/stdout.log</File>
        <encoder>
            <pattern>%date [%-5p] %thread %logger{60} [%file : %line] %msg%n</pattern>
        </encoder>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 添加.gz 历史日志会启用压缩 大大缩小日志文件所占空间 -->

            <!--<fileNamePattern>/home/log/stdout.log.%d{yyyy-MM-dd}.log</fileNamePattern>-->

            <fileNamePattern>D:/log/stdout.log.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory><!-- 保留 30 天日志 -->
        </rollingPolicy>
    </appender>

    <!--  3 .. 可以全局的对日志进行打印,也可以对特定的包进行日志打印,这里就是指定特定的包进行日志打印  -->
    <logger name="com.abc.springboot.mapper" level="DEBUG" />

    <!--  4 .. 上面写了两个附加器,只有在这里引用才有效果  -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
<!--        <appender-ref ref="FILE"/>-->
    </root>
</configuration>

添加依赖:

<!-- 日志的依赖 -->
<!--@Slf4j 自动化日志对象-->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.2</version>
</dependency>

在setting中Plugins中安装 lombok插件
在这里插入图片描述

在某个类上直接写 @Slf4j 注解
在这里插入图片描述
接下来就可以使用了,如下图(根据logback-spring.xml指定的等级,显示出的日志内容也不同,比如比指定等级低的等级不显示):
在这里插入图片描述

3. Thymeleaf

3.40 集成Thymeleaf 040

Thymeleaf 简介:
在这里插入图片描述

新建工程的时候,多勾选这个选项
在这里插入图片描述
生成的pom文件就会多一个依赖
在这里插入图片描述
使用:(注意:新建的html文件,要放到resources文件夹下的templates文件夹下)

<html lang="en" xmlns:th="http://www.thymeleaf.org">

在这里插入图片描述

3.41 集成Thymeleaf,实时更新界面,不必重启 041

如果想实时更新界面,html内容以修改,前端界面也修改,而不用重启工程:
1.核心配置文件中配置:

#设置thymeleaf模板引擎的缓存,设置为false关闭,默认为true开启(为了改变页面,实时更新)
spring.thymeleaf.cache=false

#设置thymeleaf模板引擎的前/后缀 (可选项)
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

2.做出如下更改
在这里插入图片描述
在这里插入图片描述

3.42 Thymeleaf表达式-标准变量和选择变量表达式,042

1.标准变量表达式
语法 :${…}
说明:标准变量表达式用于访问容器(tomcat)上下文环境中的变量,功能和 EL 中的 ${} 相同。Thymeleaf 中的变量表达式使用 ${变量名} 的方式获取 Controller 中 model 其中的数据。
举例:
在这里插入图片描述
2. 还有 选择变量表达式(星号表达式),但是不推荐,了解即可,如下图:
在这里插入图片描述
3.路径表达式
th:xxx="@{}"
例如:th:href="@{}"
对于没有参数的举例(对于绝对路径:与传统方法基本没有区别,对于相对路径:路径表达式有优点。)
在这里插入图片描述
对于有参数的例子:
在这里插入图片描述
对于RESTful风格,使用字符串拼接就行了。

对于其他应用场景下使用路径表达式,,如js,img,form等:
js,img:
在这里插入图片描述
form表单:
在这里插入图片描述

3.43 thymeleaf中的th:each循环 043

补充知识start:如果实体类写完不想写get,set等等方法,只需要在实体类前加一个@Data注解,方法如下:
1.先确保有Lombok插件
在这里插入图片描述
2.pom文件中添加依赖

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

3.实体类前加注解@Data
在这里插入图片描述
可以查看:
在这里插入图片描述
注意: 此时自动添加的除了get、set方法等,对于构造方法来说,只自动添加了一个无参的构造方法,可以通过以下注解,再添加有参的构造方法(自己手动添加也可以)(由于只添加有参的构造方法,无参的方法会默认被替掉而只剩下有参的构造方法,所以添加有参构造方法之后,再通过 @NoArgsConstructor 注解添加无参的构造方法)
@AllArgsConstructor
@NoArgsConstructor

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String name;
    private String nick;
    private String phone;
    private String address;
}

有参无参的构造方法添加完成,如下图所示:
在这里插入图片描述

补充知识end
循环List:
在这里插入图片描述
循环Map: 基本跟List一样
在这里插入图片描述

循环Array: 跟List一模一样
在这里插入图片描述

3.44 thymeleaf中选择语句 if、unless、switch-case 044

在这里插入图片描述

3.45 thymeleaf中内敛表达式 044

内敛文本
先在标签上加上 th:inline=“text” ,在内部就可以使用[[${xxx}]]来使用了(缺点:没有提示)
例如:

<div th:inline="text">
    数据:[[${user}]]
</div>

内敛脚本 在js代码中使用后台传过来的值
先在script标签上加上 th:inline=“javascript”,在内部就可以使用[[${xxx}]]来使用了。
在这里插入图片描述

3.46 thymeleaf中字面量,字符串拼接,数学运算,表达式基本对象,表达式功能对象 044

几种字面量(文本字面量,数字字面量,boolean字面量,null字面量):
在这里插入图片描述
字符串拼接:
举例:

<span th:text="'' + ${totalRows} + '' + ${totalPage} + '页,当前第' + ${currentPage} + '页,首页 上一页 下一页 尾页'">共120条12页,当前第1页,首页 上一页 下一页 尾页</span>

<h3>使用更优雅的方式拼接字符串:|要拼接字符串的内容|(推荐这种方式,但是这两种方式都行)</h3>

<span th:text="|共${totalRows}条${totalPage}页,当前第${currentPage}页,首页 上一页 下一页 尾页|">共120条12页,当前第1页,首页 上一页 下一页 尾页</span>

在这里插入图片描述
数学运算
相关运算符:
三元运算:表达式?”正确结果”:”错误结果”
算术运算:+ , - , * , / , %
关系比较::> , < , >= , <= ( gt , lt , ge , le )
相等判断:== , != ( eq , ne )
举例:

<h3>三元运算符</h3>
<div th:text="${sex eq 1 ? '' : ''}"></div>

<h3>算数运算</h3>
20+5=<span th:text="20+5"></span><br/>
20-5=<span th:text="20-5"></span><br/>
20*5=<span th:text="20*5"></span><br/>
20/5=<span th:text="20/5"></span><br/>
20/5=<span th:text="20%3"></span><br/>

<h3>关系比较</h3>
5>2为<span th:if=" 5 gt 2"></span><br/>
5<2为<span th:unless=" 5 lt 2"></span><br/>
1>=1为<span th:if=" 1 ge 1"></span><br/>
1<=1为<span th:if=" 1 le 1"></span><br/>

<h3>相等判断</h3>
<span th:if="${sex == 1}"></span>

表达式基本对象
模板引擎提供了一组内置的对象,这些内置的对象可以直接在模板中使用,这些对象由
#号开始引用,我们比较常用的内置对象
#session:
在这里插入图片描述
#request:

<h3>从Session中获取值 的三种方式</h3>
<span th:text="${#session.getAttribute('data')}"></span><br/>
<span th:text="${#httpSession.getAttribute('data')}"></span><br/>
<span th:text="${session.data}"></span><br/>

<h3>#request的使用</h3>
<script type="text/javascript" th:inline="javascript">
    // 比如要拼成 http://localhost:8080/index1
    //1...获取请求路径
    //获取协议名称      http
    var scheme = [[${#request.getScheme()}]];

    //获取服务器名称    localhost
    var serverName = [[${#request.getServerName()}]];

    //获取服务器端口号  8080
    var serverPort = [[${#request.getServerPort()}]];

    //获取上下文根 
    var contextPath = [[${#request.getContextPath()}]];

    var allPath = scheme + "://" + serverName + ":" + serverPort + contextPath;
    alert("路径=" + allPath);

    
    //2...获取请求路径
    var requestURL = [[${#httpServletRequest.requestURL}]]; //请求的路径
    var queryString = [[${#httpServletRequest.queryString}]]; // 传递的参数
    
    //进行拼接
    var requestAddress = queryString == null?requestURL: requestURL+"?"+queryString;
    // alert("requestURL=" + requestURL);
    // alert("queryString=" + queryString);
    alert("请求路径=" + requestAddress)

</script>

表达式功能对象
模板引擎提供的一组功能性内置对象,可以在模板中直接使用这些对象提供的功能方法,工作中常使用的数据类型,如集合,时间,数值,可以使用 Thymeleaf 的提供的功能性对象来处理它们。
内置功能对象前都需要加#号,内置对象一般都以 s 结尾。
官方手册:链接

#dates: java.util.Date 对象的实用方法:
<span th:text="${#dates.format(curDate, 'yyyy-MM-dd HH:mm:ss')}"></span>
#calendars: 和 dates 类似, 但是 java.util.Calendar 对象;
#numbers: 格式化数字对象的实用方法;
#strings: 字符串对象的实用方法: contains, startsWith, prepending/appending 等;
#objects: 对 objects 操作的实用方法;
#bools: 对布尔值求值的实用方法;
#arrays: 数组的实用方法;
#lists: list 的实用方法,比如<span th:text="${#lists.size(datas)}"></span>
#sets: set 的实用方法;
#maps: map 的实用方法;
#aggregates: 对数组或集合创建聚合的实用方法;

举例:
在这里插入图片描述

4. 国际化与安全

4.1 国际化

  • 1.配置、写配置文件。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 2.然后在核心配置文件application.properties中指定国际化的配置文件位置:
# 国际化配置文件的真实位置
spring.messages.basename=i18n.login
  • 3.在每个html界面中的标签修改为如下类似的形式:(th:xx=#{})
<h1 th:text="#{login.tip}"></h1>
  • 4.在html中添加转换请求
    在这里插入图片描述

  • 5.写一个类
    在这里插入图片描述

  • 6.在配置类中注入bean
    在这里插入图片描述

4.2 SpringSecurity(安全)

在web开发中,安全是第一位的!之前学过过滤器,拦截器之类的。
不是功能性需求。
shiro、SpringSecurity:很像,除了类和名字不一样。

  • 功能权限
  • 访问权限
  • 菜单权限
  • …拦截器,过滤器:大量的原生代码~ 冗余

3.2.1 SpringSecurity环境搭建

  • 1.导入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
  • 2.写一个配置类
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

// AOP
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // 链式编程
    // 授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 首页所有人可以访问,功能页只有对应有权限的人才能访问
        // 请求授权的规则
        http.authorizeRequests()
                .antMatchers("/").permitAll()   // 首页所有人可以访问
                .antMatchers("/level1/**").hasRole("vip1")  // level1下,VIP1权限的人可以访问,以下类推
                .antMatchers("/level2/**").hasRole("vip2");

        // 没有权限默认会到登录界面,需要开启登录的界面  默认跳到/login请求
        http.formLogin();
        // 开启注销功能  默认请求/logout文件
        http.logout();
     }

//    @Autowired
//    private DataSource dataSource;
    // 认证
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 在内存中读    new BCryptPasswordEncoder()是密码的加密规则
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("huige").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2");

        // 正常应该从数据库中读
//        UserBuilder users = User.withDefaultPasswordEncoder();
//        auth.jdbcAuthentication().dataSource(dataSource).withDefaultSchema()
//                .withUser(users.username("user").password("password").roles("USER"))
//                .withUser(users.username("admin").password("password").roles("USER","ADMIN"));
    }
}

4.3 Shiro

5. Swagger

  • 号称世界上最流行的Api框架
  • RestFul Api 文档在线自动生成工具=>Api文档与API定义同步更新
  • 直接运行,可以在线测试API接口
  • 支持多种语言:(Java,php)

5.1 SpringBoot集成Swagger

  • 1.新建一个SpringBoot的web项目
  • 2.导入依赖
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
  • 3.编写一个Hello工程
  • 4.写一个配置类,开启Swagger2
@Configuration
@EnableSwagger2 //开启Swagger2
public class SwaggerConfig {

}
  • 5.访问 http://localhost:8080/swagger-ui.html 即可
    在这里插入图片描述

5.2 配置Swagger

Swagger的bean实例Docket;

@Configuration
@EnableSwagger2 //开启Swagger2
public class SwaggerConfig {

    // 配置了swagger的Docket的Bean实例
    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
    }
    //配置Swagger信息=apiInfo
    private ApiInfo apiInfo(){
        return new ApiInfo("辉哥的SwaggerAPI文档",   //标题
                "描述信息",             // 描述信息
                "1.0",                     // 版本
                "urn:tos",      // 团队信息
                new Contact("辉哥", "url", "123456@126.com"),    // 作者信息
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }
}

5.3 Swagger配置扫描接口及开关

Docket.select

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.GetMapping;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;

@Configuration
@EnableSwagger2 //开启Swagger2
public class SwaggerConfig {

    // 配置了swagger的Docket的Bean实例
    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                // 是否启动swagger,关于swagger的开关
                .enable(false)
                .select()
                //  .basePackage("com.hui.controller")   设置扫描的包
                //  .any()   扫描全部
                //  .none()  全部都不扫描
                //  .withClassAnnotation(RequestMapping.class)  扫描类上的注解,参数是一个注解的反射对象
                //  .withMethodAnnotation(GetMapping.class)  扫描方法上的注解,参数是一个注解的反射对象
                .apis(RequestHandlerSelectors.withMethodAnnotation(GetMapping.class))
                //  paths() 过滤什么路径,只扫面请求路径带有hui的请求
                .paths(PathSelectors.ant("/hui/**"))
                .build(); //工厂模式
    }
    //配置Swagger信息=apiInfo
    private ApiInfo apiInfo(){
        return new ApiInfo("辉哥的SwaggerAPI文档",   //标题
                "描述信息",             // 描述信息
                "1.0",                     // 版本
                "urn:tos",      // 团队信息
                new Contact("辉哥", "url", "123456@126.com"),    // 作者信息
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }
}

5.4 只希望Swagger在生产环境中使用,在发布的时候不使用

配置文件多写几个,application.properties(application-dev.properties,application-test.properties等等,在主配置文件中写上使用哪一套配置,然后在SwaggerConfig类中拿到使用的配置。判断是不是指定的配置,如果是则使用,否则不适用。
在这里插入图片描述

5.5 分组

使用.groupName()指定分组。
在这里插入图片描述
效果如图:
在这里插入图片描述
设置多个分组:多写几个Bean:
在这里插入图片描述
在这里插入图片描述

5.6 接口注释

  • 1.实体类:
    在这里插入图片描述
    效果:
    在这里插入图片描述
  • 2.控制层
    在这里插入图片描述

效果:
在这里插入图片描述

  • 3.在该网页可以对请求进行测试
    在这里插入图片描述
    在这里插入图片描述

5.7 总结:

1.我们可以通过Swagger给一些比较难理解的属性或者接口,增加注释信息。
2.接口文档实时更新。
3.可以在线测试。

6.异步任务

在需要异步执行的方法前加@Async注解,然后在SpringBoot启动类前加注解@EnableAsync就可以了。

7. 定时任务

先在SpringBoot启动类前加注解@EnableScheduling,然后在业务逻辑这里写上@Scheduled注解,并用cron表达式作为参数。
在这里插入图片描述

8. Dubbo+ZooKeeper

8.1 ZooKeeper安转(注册中心)

  • 1.下载地址: zookeeper-3.4.14.tar.gz.(windows、linux都可以用)

  • 2.下载之后,进行解压,如图所示:
    在这里插入图片描述

  • 3.进入bin目录下,双击服务端运行。
    在这里插入图片描述

启动成功:
在这里插入图片描述
然后双击客户端(如下连接成功):
在这里插入图片描述

注意: 如果双击服务端闪退,解决办法是先将zkServer.cmd用记事本打开,最后一行加一个pause,然后再双击运行,查看报错信息。
在这里插入图片描述
在这里插入图片描述
然后就去更改配置:(这个文件里面有客户端端口号等配置信息)
在这里插入图片描述

  • 4.在客户端zkCli.cmd进行一些测试
    比如输入 create -e …getls /
    在这里插入图片描述

8.2 dubbo-admin安装

注意: dubbo-admin是一个监控管理后台(可视化界面),查看我们注册了哪些服务,哪些服务被消费了。(也可以不要)

  • 1.Dubbo-admin下载地址: Dubbo-admin.
  • 2.解压完成之后
    在这里插入图片描述
  • 3.在项目目录下对项目进行打包dubbo-admin,命令如下
mvn clean package -Dmaven.test.skip=true

打包成功:
在这里插入图片描述
在dubbo-admin路径下生成jap包:
在这里插入图片描述

  • 4.执行jap包(执行前要保证ZooKeeper运行了)
    在这里插入图片描述
  • 5.进行可视化访问(用户名、密码默认都是root)
    端口号是7001,可以去该项目的.properties配置文件中更改.
    在这里插入图片描述
    在这里插入图片描述

8.3 进行SpringBoot整合

8.3.1 新建两个SpringBoot项目

这里分别叫provider-server、consumer-server了,分别是服务提供者服务消费者
在这里插入图片描述

8.3.2 编写provider-server

  • 1.在service层写一个卖票的业务:

TicketService接口:

public interface TicketService {
    public String getTicket();
}

TicketService实现类:

@Component  //实用Dubbo之后,尽量不要使用@Service注解
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "卖票卖票";
    }
}
  • 2.在配置文件中改端口号为8081(为了和消费者区分,消费者8082),并配置如下信息:
server.port=8081	# 这个不重要,为了让两个项目都跑起来

# 服务应用名字
dubbo.application.name=provider-server
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 哪些服务要被注册
dubbo.scan.base-packages=com.hui.service
  • 3.增加依赖
<!--导入依赖:Dubbo + zookeeper-->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.3</version>
</dependency>


<!--zkclient,用github的-->
<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>

<!--日志会冲突,解决冲突-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.12.0</version>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.14</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 4.运行起来(保证zookeeper是运行着嘞)
    在这里插入图片描述
    启动之后,可以看到dubbo-admin中多了多了一个连接:
    在这里插入图片描述

8.3.3 编写consumer-server

  • 1.导入依赖,类似于8.2.1中第3步。

  • 2.在配置文件中改端口号为8082,还有其他配置

server.port=8082

# 消费者取拿服务需要暴漏自己的名字
dubbo.application.name=consumer-server
# 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
  • 3.写一个UserService类实现用户买票业务
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    // 想拿到provider-server提供的票
    @Reference  // 方式一:引用pom坐标,方式二:也可以定义路径相同的接口名
    TicketService ticketService;

    public void buyTicket(){
        String ticket = ticketService.getTicket();
        System.out.println("在注册中心拿到"+ticket);
    }
}

在这里插入图片描述

  • 4.编写测试类:
@SpringBootTest
class ConsumerServerApplicationTests {
    @Autowired
    UserService userService;
    @Test
    void contextLoads() {
        userService.buyTicket();
    }
}
  • 5.运行成功:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值