一、介绍
1、概念
约定大于配置,简单来说就是你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时才需要对约定进行替换配置。
2、特征
- SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。
- 使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率,比如@Configuration和@bean注解结合,基于@Configuration完成类扫描,基于@bean注解把返回值注入IOC容器。
- 自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们。
- 使部署变得简单,SpringBoot内置了三种Servlet容器,Tomcat,Jetty,undertow.我们只需要一个Java的运行环境就可以跑SpringBoot的项目了,SpringBoot的项目可以打成一个jar包。
3、优点
- 可以快速独立的创建Spring及主流框架集成的项目。
- 使用了嵌入式的Servlet容器,无需生成WAR包
- 我们在使用SpringBoot进行开发时可以使用Starts启动依赖,而SpringBoot会自动地把所需要的其他相关技术jar包导入.
- 大量的自动配置,极大地简化了我们的开发。
- 无需XML文件的大量编写,也不会生成代码,底层是利用SpringBoot写好的API来调用实现,开箱即用
- SpringBoot也有运维监控项目的功能
- SpringBoot与云计算的集成
二、创建springboot项目
1、选择项目类型
idea通过spring官方网站Spring Initializr 创建springboot项目
2、选择需要的启动器
后期通过手动maven添加也行,不过一般web启动器还是必选的,可以选择springboot版本不过都是比较新的版本。
3、pom.xml
第八行确定了spingboot版本,如有需要可以手动降低版本。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhangxin.springboot</groupId>
<artifactId>SpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot</name>
<description>SpringBoot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--thymleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4、springboot启动类
@SpringBootApplication是springboot核心注解,SpringApplication.run(Application.class, args)启动springboot项目,一般这个类都很干净。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
三、springboot目录
- src/main/java:主程序入口application,可以通过直接运行该类来启动 Spring Boot 应用
- src/main/resources:配置目录,该目录用来存放应用的一些配置信息,比如应用名、服务端口、数据库配置等。由于我们应用了 Web 模块,因此产生了 static 目录与 templates 目录,前者用于存放静态资源,如图片、CSS、JavaScript 等;后者用于存放 Web 页面的模板文件。
- src/test:单元测试目录,生成的 ApplicationTests 通过 JUnit4 实现,可以直接用运行 Spring Boot应用的测试。
- application.properties/application.yml 用于存放程序的各种依赖模块的配置信息,比如服务端口,数据库连接配置等
1、常见代码层结构
(1)java根目录
在根目录下:
- 实体类(domain/pojo)在根目录的domain或pojo下
- 数据访问层(dao)在根目录的repository或dao下
- 数据服务层(Service)在根目录的service下,数据服务的实现接口(serviceImpl)在根目录的service.impl下
- 前端控制器(controller)在根目录的controller下
- 工具类(utils)在根目录的utils下
- 常量接口类(constant)在根目录的constan下
- 配置信息类(config)在根目录的config下
- 数据传输类(vo)在根目录的vo下。
(2)资源文件的结构
- 根目录:src/main/resources
- 项目配置文件:resources/application.yml
- 静态资源目录:resources/static/ ——用于存放html、css、js、图片等资源
- 视图模板目录:resources/templates/ ——用于存放jsp、thymeleaf等模板文件(不可直接用url访问,需要使用controller)
- mybatis映射文件:resources/mapper/(mybatis项目)
- mybatis配置文件:resources/mapper/config/(mybatis项目)
- 国际化(i18n))置于i18n文件夹下
- 页面以及js/css/image等置于static文件夹下的各自文件下
四、springboot配置文件
1、 SpringBoot默认配置文件
- SpringBoot使用默认的全局的配置文件:
application.properties
/application.yml
- 配置文件名固定是是
application
`application.properties`
语法结构: key=value
`application.yml`
语法结构: key:空格 value
2、yaml
yaml是官方推荐的配置文件格式。
(1)基本语法
对空格要求高
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
#
表示注释
(2)注入实体类
dog.java
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Dog {
@Value("狗")
private String name;
@Value("12")
private Integer age;
}
person.java
@ConfigurationProperties作用:将配置文件中配置的每一个属性的值,映射到这个组件中;告诉SpringBoot将本类中的所有属性配置文件中相关的配置进行绑定参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix="person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date date;
private HashMap<String,Object> mp;
private List<Object> list;
private Dog dog;
}
application.yaml
person:
name: 张三
age: 10
happy: true
date: 2000/1/1
mp: {k1: v1,k2: v2}
list: [哈哈,abc,123]
dog:
name: 狗
age: 3
test
@SpringBootTest
class ApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
3、多环境部署yaml
在实际开发中我们不止一个yaml,有开发环境(dev)、生产环境(prod)和测试环境(test),不同环境对应不同不同的yaml配置文件,可以使用多个yaml文件来灵活切换环境。
使用application.yaml来选择不同的环境,使用后缀切换环境,这里使用的是application-dev.yml。
spring:
profiles:
active: dev
五、静态资源
1、自定义banner
只需要创建一个resources/banner.txt,内容就是新的springboot banner
__....__
.gd$$$$$$$$$$bp.
.-"^^^T$$$$$$$$$$$$$p.
.' "^T$$$$$$$$$$$$b.
.' `T$$$$$$$$$$$$b.
/ .d$$b. T$$$$$$$$$$$$$b
/ d$$$$$$b $$$$$$$$$$$$$$b
: :$$$$$$$$; :$$$$$$$$$$$$$$;
; T$$$$$$P :$$$$$$$$$$$$$$$
: "^$$^" $$$$$$$$$$$$$$$$;
; d$$$$$$$$$$$$$$$$$
| .d$$$$$$$$$$$$$$$$$$
; d$$$$$$$$$$$$$$$$$$$$
: :$$$$$$P^""^T$$$$$$$$;
; $$$$$$P T$$$$$$$
: $$$$$$ $$$$$$;
\ :$$$$$b d$$$$$P
\ T$$$$$bp..gd$$$$$P
`. `T$$$$$$$$$$$$P'
`. "^$$$$$$$$P'
"-. "^^T$P'
bug "--...____...--"
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
2、自定义网站favicon.ico
创建resources/static/favicon.ico即可
3、默认静态资源目录
默认情况下,以下目录为默认的静态资源目录。其中的静态资源可以被直接访问,优先级从上往下,当多个静态资源目录中出现同名文件时,越靠上的目录权重越高。classpath一般对应springboot项目的src/main/resources
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
另外/src/main/resource/templates/也是默认访问目录一般存放页面但是需要引入thymeleaf相关依赖
六、Thymeleaf模板引擎
1、简介
Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎 (之前用的jsp也是模版引擎但是比较弱),是springboot官方推荐使用的模板引擎。
2、配置
(1)Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
(2)yaml关闭缓存
Thymeleaf默认会开启页面缓存,提高页面并发能力。但会导致我们修改页面不会立即被展现,因此我们关闭缓存。
# 关闭Thymeleaf的缓存
spring:
thymeleaf:
cache:
false
3、基本用法
在html标签内的属性前加th:,大部分属性都支持的。
(1)基本表达式
这里着重介绍变量表达式 和URL表达式
变量表达式${name}:如果session或model中有名为name的key,就可以取出name的value。
<span th:text="${name}">
URL表达式@{/…/…},在/templates目录下会把静态资源(css,js,img)过滤,但是如果url由Thymeleaf管理就可以成功访问资源。'/'指的是resources/static目录
<link th:href="@{/css/bootstrap.min.css}"/>
(2)常用标签
-
文本替换
<p th:text="${user.name}">name</p>
-
属性赋值
<input th:value="${user.name}" >
-
替换资源/超链接
<script type="text/javascript" th:src="@{/index.js}"></script>
-
点击事件
<p th:onclick="'getCollect()'"></p>
-
for-each
<tbody th:each="it:${list}"> <tr> <th th:text="${it.getId()}" ></th> <td th:text="${it.getUsername()}"></td> </tr> </tbody>
-
if
<a th:if="${userId == collect.userId}" >
-
switch-case
<!-- th:switch / th:case --> <div th:switch="${user.name}"> <p th:case="'admin'">User is an administrator</p> <!-- *: case的默认的选项 --> <p th:case="*">User is some other thing</p> </div>
-
公共页面
前端其实许多页面组成是重复的,比如侧边栏、头部导航栏、底部导航栏等,为了提高代码复用性可以使用公共页面。th:fragment标记此标签为模板,根据名字可以引用模板
<div class="navMenu" th:fragment="header"> <div class="navMenuContain"> 导航菜单 </div> </div>
th:replace引用
表示引用cmment目录下的comment.html的header模板<div th:replace="~{comment/comment::headbar}"></div>
th:include引用
<div th:insert="~{comment/comment::headbar}"></div>
include和replace区别
th:include:引入子模块的children,依然保留父模块的tag。
th:replace:引入子模块的所有,不保留父模块的tag。
(3)传参
在连接地址的后面加上(key=‘value’),下面表示点击这个超链接会向/index.html传入名为l的参数,参数值是’参数’。
<a class="btn btn-sm" th:href="@{/index.html(l='参数')}">11111</a>
4、常用函数
这篇博客大佬列举的很全Thymeleaf 常用函数_thymeleaf 函数-CSDN博客
七、员工管理demo
1、数据库表
(1)employee表
(2)department表
2、目录结构
(1)java根目录
(2)资源文件目录
3、maven依赖
需要导入thymeleaf启动器 、web启动器、mybatis启动器、jdbc启动器、mysql启动器已经Lombok依赖,这里之前springboot版本是3.2.2但是出现了应该是mybatis版本不兼容问题,所以降为3.1.2。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhangxin</groupId>
<artifactId>springboot-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-web</name>
<description>springboot-web</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- thymeleaf启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- web启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!-- jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4、pojo
(1)Department类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {
private Integer dId;
private String dName;
}
(2)Employee类
@NoArgsConstructor
@Data
public class Employee {
private Integer eId;
private String eName;
private String email;
private Integer gender;//0女 1男
private Integer dId;
private Date birth;
//这里选择让birth获取当前时间赋值
public Employee(Integer eId, String eName, String email, Integer gender, Integer dId) {
this.eId = eId;
this.eName = eName;
this.email = email;
this.gender = gender;
this.dId = dId;
birth=new Date();
}
}
5、mapper(dao)
作为持久层(model)负责和数据库交互,直接和数据库进行数据交换。
@mapper注解可以自动为接口生成对应实现类并注入容器,所以@Repository注解的作用主要还是标识作用,如果觉得一个个添加@mapper注解麻烦可以使用@MapperScan(“”)注解扫描mapper接口所在的包。
其实使用了@Mapper就可以不用写mpaaer.xml文件了,但是这样就需要sql写在java代码中,使用用@Select、@insert注解,具体怎么写sql还是看个人习惯。
(1)DepartmentMapper
@Repository
@Mapper
public interface DepartmentMapper {
// 获取所有的部门信息
Collection<Department> getDepartments();
}
(2)EmployeeMapper
@Repository
@Mapper
public interface EmployeeMapper {
// 添加
void addEmployee(Employee employee);
// 更新
void updateEmployee(Employee employee);
// 查询全部
Collection<Employee> getAllEmployee();
// 通过id
Employee getEmployeeById(Integer id);
// 删除员工
void deleteEmployeeById(Integer id);
}
6、service
作为业务层调用dao层,里面可以添加一些具体的业务,一般是规定一个service接口serviceImp继承并调用对应的dao层,使用@service注解把serviceImp注入容器并且表示这是service层。
(1)DepartmentService
public interface DepartmentService {
// 获取所有的部门信息
Collection<Department> getDepartments();
// 获取id和name的mapper
public HashMap<Integer,String> getIdNameMap();
}
(2)DepartmentServiceImp
这里因为直接用sql语句很难查询出一个id和name的HashMap所以我选择在业务层处理这个HashMap,这个HashMap的作用主要是在页面上可以根据dId查询出dName。
@Service
public class DepartmentServiceImp implements DepartmentService{
@Autowired
private DepartmentMapper departmentMapper;
@Override
public Collection<Department> getDepartments() {
return departmentMapper.getDepartments();
}
@Override
public HashMap<Integer, String> getIdNameMap() {
Collection<Department> departments = departmentMapper.getDepartments();
HashMap<Integer, String> map=new HashMap<>();
departments.forEach(department -> {
map.put(department.getDId(),department.getDName());
});
return map;
}
(3)EmployeeService
public interface EmployeeService {
// 添加
void addEmployee(Employee employee);
// 更新
void updateEmployee(Employee employee);
Collection<Employee> getAllEmployee();
// 通过id
Employee getEmployeeById(Integer id);
// 删除员工
void deleteEmployeeById(Integer id);
}
(4)EmployeeServiceImp
@Service
public class EmployeeServiceImp implements EmployeeService{
@Autowired
private EmployeeMapper employeeMapper;
@Override
public void addEmployee(Employee employee) {
employeeMapper.addEmployee(employee);
}
@Override
public void updateEmployee(Employee employee) {
employeeMapper.updateEmployee(employee);
}
@Override
public Collection<Employee> getAllEmployee() {
return employeeMapper.getAllEmployee();
}
@Override
public Employee getEmployeeById(Integer id) {
return employeeMapper.getEmployeeById(id);
}
@Override
public void deleteEmployeeById(Integer id) {
employeeMapper.deleteEmployeeById(id);
}
}
7、controller
Controller 在 spring 中代表的是控制层,是将访问者请求进行分发调用不同函数,来控制获取请求参数以及返回service层处理完的数据给访问者的层面。它在 spring 中必须在 Controller 类前添加 @Controller 注解,以注入容器中,并发挥作用。
(1)LoginController
负责登录验证和注销,我这里就是密码判断一下是否是“123”即可,session.invalidate()就是销毁session下次登录需要重新创建。
@Controller
public class LoginController {
@RequestMapping(value = "/user/login")
public String login(@RequestParam("username") String username, @RequestParam("password")String password,
Model model, HttpSession session){
if(!StringUtils.isEmpty(username)&&password.equals("123")){
session.setAttribute("loginUser",username);
/**
* 通过就重定向到主页(后面重写了WebMvcConfigurer的addViewControllers方法,
* 绑定了主页和main.html,实际上是不存在main.html的)
*/
return "redirect:/main.html";
}else{
/**
* 不通过就返回登录页,返回错误信息
*/
model.addAttribute("err","信息错误!");
return "index";
}
}
// 注销
@RequestMapping("/user/logout")
public String logout(HttpSession session){
session.invalidate();
return "redirect:/";
}
}
(2)MyController
自定义404界面,@RequestMapping固定为"/test",在输入一些不存在的页面的时候就可以跳到你自定义的404.html了
@Controller
public class MyController {
@RequestMapping("/test")
public String test(){
return "error/404";
}
}
(3)EmployeeController
视图跳转的主要controller。
@Controller
public class EmployeeController {
@Resource
private EmployeeService employeeService;
@Resource
private DepartmentService departmentService;
@RequestMapping("/emp")
public String list(Model model){
model.addAttribute("emps",employeeService.getAllEmployee());
model.addAttribute("dmap",departmentService.getIdNameMap());
return "emp/list";
}
@GetMapping("/addEmp")
public String toAddPage(Model model){
model.addAttribute("deps",departmentService.getDepartments());
return "emp/addEmp";
}
@PostMapping("/addEmp")
public String addEmp(Employee employee){
employeeService.addEmployee(employee);
return "redirect:emp";
}
@GetMapping("/updateEmp")
public String toUpdatePage(Model model,Integer id ){
model.addAttribute("deps",departmentService.getDepartments());
model.addAttribute("emp",employeeService.getEmployeeById(id));
return "emp/updateEmp";
}
@PostMapping("/updateEmp")
public String updateEmp(Employee employee){
employeeService.updateEmployee(employee);
return "redirect:emp";
}
@RequestMapping("/deleteEmp")
public String deleteEmp(Integer id){
employeeService.deleteEmployeeById(id);
return "redirect:emp";
}
}
8、Mapper.xml
编写mapper接口类对应的sql语句,注意resultType表示返回值类型,parameterType表示参数类型。
(1)DepartmentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace要和一个接口的全类名一致-->
<mapper namespace="com.zhangxin.springbootweb.mapper.DepartmentMapper">
<!--Collection<Department> getDepartments();-->
<select id="getDepartments" resultType="Department" >
select * from department;
</select>
</mapper>
(2)EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace要和一个接口的全类名一致-->
<mapper namespace="com.zhangxin.springbootweb.mapper.EmployeeMapper">
<!-- void addEmployee(Employee employee);-->
<insert id="addEmployee" parameterType="Employee">
insert into employee
values(null,#{eName},#{email},#{gender},#{dId},#{birth});
</insert>
<!-- void updateEmployee(Employee employee);-->
<update id="updateEmployee" parameterType="Employee">
update employee
set e_name=#{eName},email=#{email},gender=#{gender},d_id=#{dId},birth=#{birth}
where e_id=#{eId};
</update>
<!-- Collection<Employee> getAllEmployee();-->
<select id="getAllEmployee" resultType="Employee">
select * from employee;
</select>
<!-- Employee getEmployeeById(Integer id);-->
<select id="getEmployeeById" resultType="Employee" parameterType="int">
select * from employee where e_id=#{id};
</select>
<!-- void deleteEmployeeById(Integer id);-->
<delete id="deleteEmployeeById" parameterType="int">
delete from employee where e_id=#{id};
</delete>
</mapper>
9、config
关系项目的整体配置类。
(1)登录拦截器(HandlerInterceptor)
对应没有登录但访问页面行为进行拦截,通过是否有loginUser判断是否完成登录,没有完成登录就返回登录页并且添加错误信息。
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 检查session,后面有登录页面的放行
Object loginUser = request.getSession().getAttribute("loginUser");
if(loginUser==null){
request.setAttribute("err","无权限,请先登录");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else return true;
}
}
(2)WebMvcConfigurer
可以自定义拦截器、消息转换器、视图跳转控制器等配置,它的拦截器和HandlerInterceptor配置的拦截器一个效果。
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocalResolver();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/user/login" ,"/css/**","/js/**","/img/**","/");
}
}
- addViewControllers是视图跳转控制器可以减少controller的代码量,比如上面的 addViewControllers执行效果分别是
跳转到"/“等效于"index”、跳转到"/index.html"等效于"index"、跳转到"/main.html"等效于"dashboard"。
注意:setViewName对应的是@RequestMapping中的地址。 - localeResolver是注入一个关于国际化的Bean,其实写在任意@Configuration标识的类都行与WebMvcConfigurer本身无太大关系
- addInterceptors是拦截器其中registry.addInterceptor()添加一个拦截器
addPathPatterns(“/**”)这里指的是拦截所有请求
excludePathPatterns()表示放行的请求地址,就像之前的登录拦截器实际上登录页面session也没有登录者所以应该被拦截,但是这里对登录的页面进行了放行。
(3)国际化
在项目开发过程中,可能会针对不同的国家的用户提供不同的视图,如针对美国用户提供一个视图,针对中国用户提供一个视图,这时候就需提供在同个页面上,能切换不同的语言,而LocaleResolver能够帮我们实现这种切换。
resolveLocale()方法获取前端传过来的参数,根据参数判断国际地区,上面的MyConfig类已经实现了MyLocalResolver的注入。
//地址解析
public class MyLocalResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
// 获取参数
String l = request.getParameter("l");
Locale locale = Locale.getDefault();//获取默认
if(!StringUtils.isEmpty(l)){//非空
String[] s = l.split("_");
locale=new Locale(s[0],s[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
前端对应的国际化的标签
<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
i18n国际化资源文件
默认:login.properties
login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名
中文:login_zh.properties
login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名
英文:login_en_us.properties
login.btn=sign in
login.password=Password
login.remember=Remember me
login.tip=Please sign in
login.username=username
需要国际化的页面
Thymeleaf动态展示国际化页面,使用 th:placeholder="#{ }"绑定国际化的资源文件里的元素。
<input name="username" type="text" th:placeholder="#{login.username}">
10、application.yaml
springboot的核心配置文件。
#规定端口
server:
port: 8080
spring:
thymeleaf:
#关闭thymeleaf缓存
cache: false
messages:
#自定义的国际化配置引入
basename: i18n.login
mvc:
format:
#设置日期格式
date: yyyy-MM-dd
#数据库信息
datasource:
username: root
password: 1234567
url: jdbc:mysql://localhost:3306/spring_boot_blog?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
configuration:
#下划线命名转化为驼峰命名
map-underscore-to-camel-case: true
#导入需要识别的类的包,即数据库表对应的实体类pojo
type-aliases-package: com.zhangxin.springbootweb.pojo
#导入mapper所在的包(写sql的xml)
mapper-locations: classpath:mapper/*.xml
八、openAPI(swagger3)
1、介绍
Swagger 是一个 RESTful API 的开源框架,它的主要目的是帮助开发者设计、构建、文档化和测试 Web API。
OpenAPI规范最初由开发Swagger的团队在2010年推出,从Swagger 2.0开始,Swagger规范被正式更名为OpenAPI规范,并得到了许多社区的支持和贡献
2、依赖
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
3、swagger页面
本地页面:http://localhost:8080/swagger-ui.html
4、SwaggerConfig
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI springShopOpenAPI() {
return new OpenAPI()
.info(new Info().title("标题")
.description("这是描述")
.version("这是版本")
.license(new License().name("Apache 2.0").url("#")))
.externalDocs(new ExternalDocumentation()
.description("外部文档")
.url("#"));//外部文档链接
}
}
访问swagger
测试controller
@RestController
@Tag(name = "测试Controller(test)", description = "这是描述")
public class HelloController {
@GetMapping("test")
@Operation(summary = "测试接口hello1")
public String hello1(@Parameter(name = "name", description = "hello1的参数名称")String name){
return "Hello"+name;
}
}
可以直接在前端输入参数进行测试