SpringBoot应用

文章目录

  • 第一章、SpringBoot基础内容
    • 一、Spring和SpringBoot
      • 1、Spring介绍
      • 2、SpringBoot介绍
    • 二、SpringBoot2入门操作
      • 1、在线构建
      • 2、idea构建
    • 三、浅谈自动装配的原理
  • 第二章、SpringBoot核心功能
    • 一、配置文件
      • 1、配置文件介绍
      • 2、语法规则
      • 3、数据类型
      • 4、案例使用
    • 二、WEB开发
      • 1、静态资源文件
      • 2、请求参数处理
        • (1)注解
        • (2)其他的情况
      • 3、Thymeleaf整合
      • 4、日志和profile
    • 三、整合MyBatis
    • 四、单元测试
    • 五、整合Redis
  • 第三章、综合案例
    • 一、表结构
    • 二、项目环境创建
    • 三、代码生成
    • 四、整合SpringSecurity
    • 五、整合静态资源

第一章、SpringBoot基础内容

前置基础内容要求:

  1. 熟悉SpringFramework的基本应用
  2. 掌握Maven的基本应用
  3. 具备了SSM的应用能力
  4. 对于第三方的组件redis、MyBatisPlus等最好有应用基础

环境要求:

  1. JDK8
  2. Maven3.6.x 及以上版本

一、Spring和SpringBoot

1、Spring介绍

  Spring是一个开源的Java开发框架,是由Rod Johnson创建的。它提供了一种简化Java开发的方式,通过提供一系列的组件和工具来帮助开发者构建高效、可扩展的应用程序。

image.png

spring官网地址:https://spring.io/

2、SpringBoot介绍

  Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简单来说,就是 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。

image.png

二、SpringBoot2入门操作

1、在线构建

https://start.spring.io/
在这里插入图片描述

指定相关的项目信息、然后生成我们的项目代码并解压导入到idea。我们就可以通过启动类来启动我们的第一个Web项目。

2、idea构建

上面的方式需要在官网生成,对于开发并不是很友好,这时我们可以通过IDEA来帮助我们快速的构建Web项目,https://start.aliyun.com/

在这里插入图片描述

下一步:指定SpringBoot的版本和需要初始关联的依赖,当然我们也可以在项目创建后再单独的指定相关的依赖
在这里插入图片描述

创建好项目后。我们可以直接运行启动类来启动项目:
在这里插入图片描述

然后在地址栏中:http://localhost:8080
在这里插入图片描述

三、浅谈自动装配的原理

/*** @SpringBootApplication:是自动装配的关键*   是一个组合注解:*   @SpringBootConfiguration:@Configuration 也就是说我们的这个启动类本质上就是一个Java配置类*   @EnableAutoConfiguration:这个自动装配的注解 META-INF/spring.factories 中需要自动配置的Java类*   @ComponentScan:指定扫描路径,当前没有指定要扫描的路径。那么会加载当前启动类所在的包及其子包下的所有的@Component注解修饰的Java类**/
@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {// 本质上其实就是完成了Spring容器的初始化操作ApplicationContext run = SpringApplication.run(SpringBootDemoApplication.class, args);//System.out.println("run.getBean(BasicController.class) = " + run.getBean(BasicController.class));//System.out.println("run.getBean(StudentController.class) = " + run.getBean(StudentController.class));//ApplicationContext ac1 = new ClassPathXmlApplicationContext("");//ApplicationContext ac2 = new AnnotationConfigApplicationContext(SpringBootDemoApplication.class);}}

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

自动装配就是把别人(官方)写好的config配置类加载到spring容器,然后根据这个配置类生成一些项目需要的bean对象。

@SpringBootApplication注解里的@EnableAutoConfiguration@Import注解导入了AutoConfigurationImportSelector.class类,这个类的selectImports方法会扫描我们类路径下的一个spring.factories文件(里面装的是很多官方写好的自动配置类的全限定名),然后返回这些类的名字。

第二章、SpringBoot核心功能

一、配置文件

  在SpringBoot项目中的配置文件有两种使用方式

  • properties:默认提供的,以键值对的方式使用(key=value)
  • yaml:是一中标记语言,推荐使用的方式

1、配置文件介绍

   yml是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。

非常适合用来做以数据为中心的配置文件

2、语法规则

  在使用 yml配置配置信息的时候我们需要注意对应的规则:

  • key: value, value和 :之间需要有空格
  • 区分大小写
  • 使用 缩进表示层级关系,缩进的空格数不重要,只要相同的元素左对齐即可
  • #表示注释
  • 字符串不需要 "或者 '包裹,如果要加,''与""表示字符串内容会被转义/不转义

3、数据类型

  在 yml中我们可以配置的数据类型很多 字面量对象数组都是支持的。只是在使用的时候需要注意对应的使用方式即可

字面量:单个的、不可再分的值。date、boolean、string、number、null

k: v

对象:键值对的集合。map、hash、set、object

行内写法:  k: {k1:v1,k2:v2,k3:v3}
#或
k: k1: v1k2: v2k3: v3

数组:有序的数据。array、list、queue

行内写法:  k: [v1,v2,v3]
#或者
k:- v1- v2- v3

4、案例使用

定义对应的Bean对象

@ConfigurationProperties(prefix = "person")
@Component
@Data
@ToString
public class Person {private String userName;private String address;private Integer age;private Date birth;private Boolean boss;private List<String> hobbys;private Map<String,Object> map;private Dept dept;private Map<String,Dept> allDepts;}@Component
@Data
public class Dept {private Integer deptId;private String deptName;
}

在对应的 yml中配置

person:userName: "其\n哥"address: '内蒙古\n呼市'age: 18birth: 2024/07/24 14:12:12 # 设置默认格式的日期时间就不需要提供转换器boss: truemap:k1: v1k2: v2k3: v3#hobbys: [篮球,足球,羽毛球]hobbys:- 篮球- 足球- 羽毛球dept:deptId: 1deptName: 行政部all-depts:k1:deptId: 1deptName: 行政部k2:deptId: 2deptName: 开发部k3:deptId: 3deptName: 销售部
#    dept: {departId:111,departName:销售部}
#    map: {k1:v1,k2:v2,k3:v3}

为了有提示信息。我们需要在pom.xml中添加相关的属性依赖

   <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

二、WEB开发

1、静态资源文件

  在web项目开发中,静态资源文件也是一份非常重要的内容。在SpringBoot默认提供了这几个目录可以存放我们的静态资源文件

  • static
  • public
  • resources
  • META-INF/resources

image.png

客户端提交相关的请求。服务器接收到请求后是会先找我们的controller看是否能够处理。如果不能处理就会去对应的静态资源目录下查找是否有合适的资源。如果静态资源处理器也处理不了。那么就响应404页面。

为了更好的区分静态资源文件和动态请求。我们可以给静态资源文件的访问加上一个统一的前缀。

# 给系统访问的静态资源添加统一的前缀
spring:mvc:static-path-pattern: /res/**

如果我们需想使用自定义的目录来存储静态资源文件。这时我们可以通过如下的配置来指定。

# 给系统访问的静态资源添加统一的前缀
spring:mvc:static-path-pattern: /res/**web: # 自定义静态资源文件存储的路径resources:static-locations: [classpath:/abc]

2、请求参数处理

(1)注解

  在控制器中我们接收客户端传递的相关的请求数据的时候。可以通过各种注解来快捷的接收相关的信息

  • @PathVariable: 获取请求路径中的参数(请求路径中类似/{path} 参数)
  • @RequestHeader:获取请求头中的参数
  • @RequestAttribute:获取Request作用域中的参数
  • @RequestParam:获取请求路径中的参数(问号?后面的参数)
  • @MatrixVariable:矩阵变量
  • @CookieValue:获取请求头中的Cookie 信息
  • @RequestBody:获取请求体中的数据 需要通过post方式提交

对应的案例代码

/*** 控制器*/
@RestController
public class ParamController {/*** @PathVariable 路径变量* @param id* @param name* @return*/@GetMapping({"/fun1/{id}/name/{name}"})public Map<String,Object> fun1(@PathVariable("id") Integer id, @PathVariable("name") String name, @PathVariable Map<String,Object> pv){Map<String,Object> map = new HashMap<>();map.put("id",id);map.put("name",name);map.put("pv",pv);return map;}/*** @RequestParam 获取请求路径中的参数,就是获取请求头中的参数* @param id* @param name* @param rp* @return*/@GetMapping({"/fun2"})public Map<String,Object> fun2(@RequestParam(name = "id",required = true,defaultValue = "1") Integer id,@RequestParam(name = "name") String name,@RequestParam Map<String,String> rp){Map<String,Object> map = new HashMap<>();map.put("id",id);map.put("name",name);map.put("rp",rp);return map;}@RequestMapping({"/fun3"})public Map<String,Object> fun3(@RequestHeader("User-Agent") String userAgent, @RequestHeader HttpHeaders headers,@RequestHeader Map<String,Object> rh){Map<String,Object> map = new HashMap<>();map.put("userAgent",userAgent);map.put("headers",headers);map.put("rh",rh);return map;}@RequestMapping({"/fun4"})public Map<String,Object> fun4(@CookieValue("ACTIVITI_REMEMBER_ME") String cookie,@CookieValue("ACTIVITI_REMEMBER_ME") Cookie cookie1){Map<String,Object> map = new HashMap<>();map.put("cookie",cookie);map.put("cookie1",cookie1);return map;}@PostMapping({"/fun5"})public Map<String,Object> fun4(@RequestBody String content){Map<String,Object> map = new HashMap<>();map.put("content",content);return map;}/*** 矩阵变量:SpringBoot中默认是关闭 矩阵变量* /user/query;id=1;name=ql,zhangsan,lisi* @return*/@GetMapping({"/fun6/{path}"})public Map<String,Object> fun6(@MatrixVariable("id") Integer id,@MatrixVariable("name") List<String> name,@PathVariable("path") String path){Map<String,Object> map = new HashMap<>();map.put("id",id);map.put("name",name);map.put("path",path);return map;}
}

表单post方式处理

@Controller
public class RequestController {@GetMapping("/ra/fun1")public String fun1(Model model){model.addAttribute("msg1","第一个信息");model.addAttribute("msg2","第二个信息");return "forward:/success";}@ResponseBody@GetMapping("/success")public Map<String,Object> fun2(@RequestAttribute String msg1, @RequestAttribute String msg2){Map<String,Object> map = new HashMap<>();map.put("msg1",msg1);map.put("msg2",msg2);return map;}
}

在SpringBoot中默认是关闭对矩阵变量的支持的。需要放开的话添加如下的配置:

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {UrlPathHelper urlPathHelper = new UrlPathHelper();urlPathHelper.setRemoveSemicolonContent(false); // 解除对 矩阵变量的限制configurer.setUrlPathHelper(urlPathHelper);}
}
(2)其他的情况

  在上面介绍的注解后我们还可以通过如下的方式来出:

  • 原生的HttpServletRequest 和 HttpServletResponse来处理
  • 然后我们还可以通过自定义的对象来处理

3、Thymeleaf整合

  在SpringBoot项目中常用的前端模板框架Thymeleaf。我们介绍下如何整合。

添加相关的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

添加 thymeleaf的配置信息

spring.thymeleaf.enabled=true
# 模板编码
spring.thymeleaf.encoding=UTF-8
# 要被排除在解析之外的视图名称列表,⽤逗号分隔
spring.thymeleaf.excluded-view-names=
# 要运⽤于模板之上的模板模式。另⻅ StandardTemplate-ModeHandlers( 默认值: HTML5)
spring.thymeleaf.mode=HTML5
# 在构建 URL 时添加到视图名称前的前缀(默认值: classpath:/templates/ )
spring.thymeleaf.prefix=classpath:/templates/
# 在构建 URL 时添加到视图名称后的后缀(默认值: .html )
spring.thymeleaf.suffix=.html
# 应用服务 WEB 访问端口
server.port=8080

然后创建 templates目录。项目相关的动态模板文件我们都放在这个目录中。然后创建 user.html页面,需要使用 thymeleaf的标签我们需要在头部引入下面的文件

<html xmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org">

完整的页面内容

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>这是第一个Thymeleaf的模板页面</h1><label>获取传递的信息:</label><br><span th:text="${msg1}"></span><br><span th:text="${msg2}"></span><br>
</body>
</html>

然后定义对应的控制器和数据的绑定操作

@Controller
public class UserController {@GetMapping("/user/query")public String query(Model model, Map map){model.addAttribute("msg1","thymeleaf的第一个数据666");map.put("msg2","thymeleaf的第二个数据999");return "user";}
}

4、日志和profile

  SpringBoot支持Java Util Logging、Log4J、Log4J2 和Logback 作为日志框架,无论使用哪种日志框架,SpringBoot已为当前使用的日志框架的控制台输出及文件输出做好了配置,默认情况下,SpringBoot使用Logback 作为日志框架
配置日志级别:

server:port: 8080
spring:thymeleaf:prefix: classpath:/templates/suffix: .html
logging: # 配置日志level:root: info # 记录所有的日志信息#org.springframework.web: debugfile:name: d:/myapp.log

profile 主要针对的就是不同环境下的不同配置信息的支持。那么我们可以全局的使用application-{profile}.yml
在这里插入图片描述

三、整合MyBatis

  SpringBoot整合MyBatis的操作,首先创建相关的表结构

CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(30) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4

然后添加MyBatis和MySQL的依赖信息

        <!-- MyBatis的依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- MySql 的依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>

然后在 application.yml中添加数据源的配置信息和MyBatis的相关配置信息

spring:profiles:active: prod# 配置JDBC的连接信息datasource:url: jdbc:mysql://localhost:3306/springboot-learn?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: root
mybatis:type-aliases-package: com.ql.springbootdemo.entitymapper-locations: classpath:mapper/**.xml

然后做MyBatis的应用配置。创建对应的实体对象

@Data
public class User {private Integer id;private String name;private Integer age;
}

创建对应的Mapper接口

public interface UserMapper {public List<User> queryList();
}

然后创建Mapper接口对应的映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ql.springbootdemo.mapper.UserMapper"><select id="queryList" resultType="User">select * from t_user</select>
</mapper>

需要在SpringBoot项目的启动类中通过@MapperScan注解来指的自定义的Mapper接口的位置

@SpringBootApplication
@MapperScan(basePackages = {"com.ql.springbootdemo.mapper"})
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}}

创建Service层和Controller

@Service
public class UserServiceImpl implements IUserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> queryList() {return userMapper.queryList();}
}
@RestController
public class UserController2 {@Autowiredprivate IUserService userService;@GetMapping("/user/list")public List<User> list(){return userService.queryList();}
}

然后就可以启动服务测试访问:
在这里插入图片描述

通过访问效果可以看到整合操作完成

四、单元测试

  单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证的过程就叫单元测试。

单元测试是开发者或者测开人员编写的一小段代码,用于检验被测代码的一个很小的、很明确的(代码) 功能是否正确。执行单元测试就是为了证明某段代码的执行结果是否符合我们的预期。如果测试结果符合我们的预期,称之为测试通过,否则就是测试未通过(或者叫测试失败)。

首先需要添加相关的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

然后可以通过脚手架工具生成的测试类来处理
在这里插入图片描述

然后我们也可以通过idea 工具针对我们需要单元测试的方法获取类动态的生成需要测试的测试类
在这里插入图片描述
在这里插入图片描述

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

五、整合Redis

  Redis的客户端之前使用的是Jedis。不过现在基本很少使用了。我们直接整合 SpringDataRedis来使用。先添加依赖:

<!-- 添加SpringDataRedis的依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--redis附加包,因为Springboot 2.0 中redis客户端使用了Lettue, 其依赖于commons, 所以加入以上(似乎Jedis依然可以使用.)-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

然后添加对应的配置信息

spring:redis:# redis链接地址host: 127.0.0.1# redis链接端口port: 6379# redis链接密码password:# redis连接池lettuce:pool:# 最大链接数max-active: 8# 最大建立链接等待时间,-1为无限制max-wait: -1# 最大空闲数max-idle: 8# 最小空闲数min-idle: 0# 关闭超时时间,在关闭客户端链接之前等待任务处理完成的最长时间,在这之后,无论任务是否执行完成,都会被执行器关闭shutdown-timeout: 100database: 2         # 使用Redis中的第三个分区,默认是0

配置完以上两个步骤,就可以使用redis了,spring-data-redis默认提供RedisTemplate<Object,Object> 和StringRedisTemplate<String,String> 工具,其中RedisTemplate<Object,Object> 就是键值都是Object类型,而StringRedisTemplate<String,String> 就是键值都是String类型。

@SpringBootTest
class SpringBootDemo03RedisApplicationTests {@AutowiredRedisTemplate redisTemplate;@AutowiredStringRedisTemplate stringRedisTemplate;@Testvoid contextLoads() {stringRedisTemplate.opsForValue().set("k1","springBoot整合测试");String k1 = stringRedisTemplate.opsForValue().get("k1");System.out.println("k1 = " + k1);}}

第三章、综合案例

  接下来我们通过一个综合案例来给大家消化下前面介绍的内容:

  • SpringBoot
  • MySQL
  • SpringSecurity
  • Thymeleaf
  • HPlus

一、表结构

用户表:SYS_USER

CREATE TABLE `sys_user` (`user_id` bigint NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL COMMENT '用户名',`password` varchar(100) DEFAULT NULL COMMENT '密码',`email` varchar(100) DEFAULT NULL COMMENT '邮箱',`mobile` varchar(100) DEFAULT NULL COMMENT '手机号',`status` tinyint DEFAULT NULL COMMENT '状态  0:禁用   1:正常',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`user_id`),UNIQUE KEY `username` (`username`)
)

二、项目环境创建

  创建一个基础的SpringBoot项目,并添加相关的依赖。

   <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>

添加相关的配置信息 application.yml

server:port: 8086
spring:thymeleaf:suffix: .htmlprefix: classpath:/templates/enabled: trueencoding: UTF-8datasource:url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456
mybatis:mapper-locations: classpath:/mapper/**.xml

在启动类中添加Mapper接口的路径

@MapperScan(basePackages = {"com.ql.boot.mapper"})
@SpringBootApplication
public class SpringBootDemo03Application {public static void main(String[] args) {SpringApplication.run(SpringBootDemo03Application.class, args);}}

三、代码生成

  针对用户的增删改查的操作我们可以通过MyBatis的代码生成器来快速的生成相关的代码。先创建对应的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 数据库的驱动包路径 --><classPathEntry location="C:\Users\dpb\.m2\repository\mysql\mysql-connector-java\8.0.19\mysql-connector-java-8.0.19.jar" /><context id="DB2Tables" targetRuntime="MyBatis3"><!-- 去掉生成文件中的注释 --><commentGenerator><property name="suppressAllComments" value="true" /></commentGenerator><!-- 数据库链接URL、用户名、密码 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&nullCatalogMeansCurrent=true"userId="root"password="123456"></jdbcConnection><!-- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"connectionURL="jdbc:oracle:thin:@localhost:1521:XE"userId="car"password="car"></jdbcConnection>  --><javaTypeResolver ><property name="forceBigDecimals" value="false" /></javaTypeResolver><!-- 生成模型的包名和位置 当前项目下 .\--><javaModelGenerator targetPackage="com.ql.boot.entity" targetProject="d:\SpringBootDemo"><!-- 是否在当前路径下新加一层schema,eg:fase路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --><property name="enableSubPackages" value="false" /><property name="trimStrings" value="true" /></javaModelGenerator><!-- 生成的映射文件包名和位置 --><sqlMapGenerator targetPackage="mapper"  targetProject="d:\SpringBootDemo"><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- 生成DAO的包名和位置 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.ql.boot.mapper"  targetProject="d:\SpringBootDemo"><property name="enableSubPackages" value="false" /></javaClientGenerator><table  tableName="sys_user" domainObjectName="SysUser" schema="demo"></table></context>
</generatorConfiguration>

然后添加MyBatis generator的插件

<plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration><!--关联上面的配置文件 --><configurationFile>src/main/resources/generator-cfg.xml</configurationFile><verbose>true</verbose><overwrite>true</overwrite></configuration><executions><execution><id>Generate MyBatis Artifacts</id><goals><goal>generate</goal></goals></execution></executions><dependencies><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.2</version></dependency></dependencies>
</plugin>

然后通过Maven插件快速生成

image.png

四、整合SpringSecurity

  我们先创建认证的实现service

package com.ql.boot.service.impl;import com.ql.boot.entity.SysUser;
import com.ql.boot.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.util.ArrayList;
import java.util.List;@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate ISysUserService userService;/*** 认证逻辑的处理* @param username 认证的账号* @return* @throws UsernameNotFoundException*/@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {System.out.println("----------开始认证--------" + username);UserDetails userDetails = null;if(!StringUtils.isEmpty(username)){// 做账号验证SysUser user = new SysUser();user.setUsername(username);List<SysUser> list = userService.query(user);if(list != null && list.size() == 1){SysUser sysUser = list.get(0);List<SimpleGrantedAuthority> authorities = new ArrayList<>();authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));// 说明账号是存在的userDetails = new User(sysUser.getUsername(),sysUser.getPassword(),true,true,true,true,authorities);}}return userDetails;}
}

同时创建对应的查询方法

@Service
public class SysUserServiceImpl implements ISysUserService {@Autowiredprivate SysUserMapper mapper;/*** 根据用户条件查询用户信息* @param user* @return*/@Overridepublic List<SysUser> query(SysUser user) {SysUserExample example = new SysUserExample();SysUserExample.Criteria criteria = example.createCriteria();if(user != null){if(!user.getUsername().isEmpty()){// 根据账号查询信息criteria.andUsernameEqualTo(user.getUsername());}}List<SysUser> sysUsers = mapper.selectByExample(example);return sysUsers;}
}

然后创建SpringSecurity的配置类

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {// 关联自定义的认证service 还有绑定密码加密器auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/login.html","/css/**","/js/**","/img/**","/fonts/**","/docs/**").permitAll().antMatchers("/**").hasAnyRole("ADMIN").anyRequest().authenticated()// 登录.and().formLogin().loginPage("/login.html").loginProcessingUrl("/loginUrl") // 登录表单提交的认证地址.defaultSuccessUrl("/home.html").permitAll().and().logout().and().csrf().disable()// 针对 布局内嵌禁用放开.headers().frameOptions().disable();}public static void main(String[] args) {BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();System.out.println(encoder.encode("123"));}
}

五、整合静态资源

  页面展示这块我们通过HPlus来处理。分别拷贝相关的静态资源文件存储在static目录中

image.png

创建对应的登录页面 login.html页面

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何管理测试用例?测试用例有什么管理工具?YesDev

3.1 测试用例 测试用例(Test Case) 是指对一项特定的软件产品进行测试任务的描述&#xff0c;体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果等。简单地认为&#xff0c;测试用例是为某个特殊目标而编制的一组测试输入、执行条…

CPT7数据保存详细步骤

一、连接设备、打开NovAtelConnect 软件 (1)点击1,并在2中输入如下命令: LOG RANGEB ONTIME 1 // 输出原始数据记录在板卡LOG RAWEPHEMB ONTIME 1 // 输出 GPS 原始星历记录在板卡LOG bdsephemerisb ONTIME 1 // 输出

在澳门写代码;技术入股2次融资被踢;现在只想做独立开发

本期我们邀请的程序员是Albert&#xff0c;先后在广州、澳门、珠海、香港工作过&#xff0c;打工上班、合伙创业、远程工作、独立开发&#xff0c;工作经历丰富&#xff0c;如果你想知道哪些程序员踩过的坑&#xff0c;请别错过他的故事。 广州&#xff1a;第一份工作2000块一…

C++ 结构体内存对齐

定义了两个结构体 typedef struct Cmd {uint8_t ua;uint8_t ub;uint8_t uc;uint32_t ue; } Cmd_t;typedef struct Cmd_tag {uint8_t value;uint8_t data[1]; // 将 data 定义为指向 Cmd_t 结构体的指针 } tag_t;在实际使用中&#xff0c;看见前人的代码是&#xff0c;new 一块内…

MySQL第三次作业--DML语句(INSERT)

目录 一、在数据库中创建一个表student&#xff0c;用于存储学生信息 二、向student表中添加一条新记录&#xff0c;记录中id字段的值为1&#xff0c;name字段的值为"monkey"&#xff0c;grade字段的值为98.5 三、向student表中添加多条新记录&#xff1a; 2,&qu…

详解动态规划之01背包问题及其空间压缩(图文并茂+例题讲解)

1. 动态规划问题的本质 记忆化地暴力搜索所有可能性来得到问题的解 我们常常会遇到一些问题&#xff0c;需要我们在n次操作&#xff0c;且每次操作有k种选择时&#xff0c;求出最终需要的最小或最大代价。处理类似的问题&#xff0c;我们一般需要遍历所有的可能性(相当于走一遍…

SpringMVC核心组件之HandlerMapping详解

文章目录 前言一、AbstractHandlerMapping抽象类initApplicationContextgetHandler 二、MatchableHandlerMapping类二、AbstractUrlHandlerMapping类 前言 当一个web请求到来时&#xff0c;DispatcherServlet负责接收请求并响应结果。DispatcherServlet首先需要找到当前请求对…

普通人也能创业!轻资产短视频带货项目,引领普通人实现创业梦想

在这个信息爆炸的时代&#xff0c;创业似乎成为了越来越多人的梦想。然而&#xff0c;传统的创业模式 keJ0277 往往伴随着高昂的资金投入和复杂的管理流程&#xff0c;让许多普通人望而却步。然而&#xff0c;现在有一种轻资产短视频带货项目正在悄然兴起&#xff0c;它以其低…

2024做安全测试必须要知道的几种方法!

前言 安全性测试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程&#xff0c;其主要目的是查找软件自身程序设计中存在的安全隐患&#xff0c;并检查应用程序对非法侵入的防范能力&#xff0c;安全指标不同&#xff0c;测试策略也不同。 但安全…

『Apisix安全篇』快速掌握APISIX Basic-Auth插件高效使用

&#x1f4e3;读完这篇文章里你能收获到 &#x1f468;‍&#x1f4bb; 学习如何快速安装并配置APISIX Basic-Auth插件&#xff0c;为您的API安全保驾护航。&#x1f6e0;️ 文章详细介绍了如何创建带有basic-auth配置的Consumer&#xff0c;以及如何在Route中启用该插件。&am…

微信自主创建表单投票小程序源码系统 带充值刷礼物功能 附带源代码以及完整的安装部署教程

系统概述 本小程序实现的核心功能包括&#xff1a;用户注册登录、表单提交投票、查看投票结果、在线充值以及赠送礼物等。其中&#xff0c;投票表单可以根据实际需求进行自定义设置&#xff0c;满足不同类型的调查或评选活动。同时&#xff0c;通过引入第三方支付接口&#xf…

Django Celery 的配置及使用---最详细教程

Django Celery 的配置及使用 Redis提供队列消息功能 一、安装redis 系统版本&#xff1a;Ubuntu 20.041、获取最新软件包 sudo apt update sudo apt install redis-server2、安装完成后&#xff0c;Redis服务器会自动启动。查看redis是否启动成功 sudo systemctl status …

LLM大模型多模态面试题(二)

1. 介绍transformer算法 Transformer本身是一个典型的encoder-decoder模型&#xff0c;Encoder端和Decoder端均有6个Block&#xff0c;Encoder端的Block包括两个模块&#xff0c;多头self-attention模块以及一个前馈神经网络模块&#xff1b;Decoder端的Block包括三个模块&…

uniapp 实现下拉刷新 下滑更新

效果图 在app或者小程序中向下滑动 会出现刷新数据 ,而上拉到底 需要更新数据 功能实现 主要俩种方式 依赖生命周期 在page.json中开启 page.json "style" : {"navigationBarTitleText" : "小小练习","backgroundTextStyle": &qu…

狙击策略专用术语以及含义,WeTrade3秒讲解

想必各位交易高手对狙击策略不会陌生吧!但你想必不知道狙击策略的开发者为了推广狙击策略&#xff0c;在狙击策略基础的经典技术分析理论引入了自己的术语。今天WeTrade众汇和各位投资者继续了解狙击策略专用术语以及含义。 一.BL 银行级别(BL)是前一日线收盘的级别。时间是格…

微信小程序开发中怎么配置SSL证书?

在微信小程序开发中&#xff0c;配置SSL证书主要用于实现HTTPS请求&#xff0c;以保证数据传输的安全性。以下是配置SSL证书的基本步骤&#xff1a; 一、获取SSL证书 首先&#xff0c;你需要获取一个有效的SSL证书。SSL证书可以被广泛信任的证书颁发机构申请&#xff0c;如Jo…

rocketmq的顺序消息开发注意事项

1. 参考消息重试&#xff0c;要对 MaxReconsumeTimes进行设置。之前就是因为没有进行设置&#xff0c;导致了队头阻塞问题。 rokcetmq和kafka一样&#xff0c;当顺序消息写入的多个队列中后&#xff0c;如果是顺序消息&#xff0c;当前的队列的队头一直消费失败的时候&#x…

JVM运行时内存:本地方法接口与本地方法栈

文章目录 1. 什么是本地方法&#xff1f;2. 为什么要使用Native Method&#xff1f;3. 本地方法现状 运行时内存整体结构如下图所示: 1. 什么是本地方法&#xff1f; 简单地讲&#xff0c;一个Native Method就是一个Java调用非 Java 代码的接口。一个Native Method是这样一个 …

【Linux】linux | 配置系统日志 | 安全日志 | 操作日志 | 登录日志

一、诉求 1、linux服务器开启日志功能&#xff0c;并记录10个月的登录 二、操作 1、进入目录 cd /etc 2、编辑配置 vi logrotate.conf 3、复制配置 /var/log/wtmp {monthlycreate 0664 root utmpminsize 1Mrotate 10 }/var/log/btmp {missingokmonthlycreate 0600 root …

vue2人力资源项目9权限管理

页面搭建 <template><div class"container"><div class"app-container"><el-button size"mini" type"primary">添加权限</el-button><el-table-column label"名称" /><el-table-co…