1.springboot 配置文件
pom.xml
<?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>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot-pro</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-pro</name>
<description>springboot-pro</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- spring-boot-starter所有的springboot依赖都是使用的这个开头 -->
<!-- web依赖:tomcat.dispatcherServlet.xml -->
<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>
<!-- 把项目中的springboot自定义属性配置类生成一个元素数据文件,
这个文件可以生成以后在未来的配置文件中,我们就达到和官方一致效果,可以自动提示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打jar包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注解(装配原理)
//@SpringBootApplication:标注这个类是一个springboot的应用:启动类下所有的资源被导入
@SpringBootApplication
1.@ComponentScan() 定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中
@ConfigurationPropertiesScan 与上面的配置扫描
2.@SpringBootConfiguration:springboot的配置
@Configuration:spring配置类
@Component:说明这也是一个spring的组件(把普通pojo实例化到spring容器中)
@EnablieAutoconfiguration:自动配置
@Autoconfiguration:自动配置包
@Import(AutoConfigurationPackages.Registrar.class):自动配置包注册
@Import(AutoconfigurationImpertSelector.class):自动配置导入选择
//获取所有的配置
List <String> configuration=getCandidateConfigurations()
主启动类如何运行
JavaConfig @Configuration(配置类) @Bean(组件)
自动装配
//@SpringBootApplication:标注这个类是一个springboot的应用:启动类下所有的资源被导入
@SpringBootApplication
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class,args);
run():1.判断是普通项目还是Web项目 2.推断当前的主类 3.存在监听器,获取上下文处理bean,全面接管SpringMVC的配置
application.yml
application.properties 语法结构:key=value(官方不推荐)
语法结构:key:空格value
# 普通的key-value
name: liuben
# 对象
student:
name: liuben
age: 19
# 行内写法
#对象
student1: {name:liuben,age:18}
#数组
pets:
- cat
- dog
- pig
pets1: [cat,dog,pig]
给属性赋值的几种方式
yaml可以直接给实体类赋值
@Component //实现bean注入
@Autowired //把bean对象的setter/getter方法省略,自动帮你getter/setter
@Qualifier //意思为合格者,表明哪个实现类才是我们所需要的,在注解的括号中添加类名(多个类同时存在时选择)
@ConfigurationProperties(prefix = "person") //将实体类和配置类绑定起来,prefix为前缀(连接配置类的名)
@Validated //数据校验 JSR-303
1.用@Value(" ")一个一个赋值
public class Dog {
@Value("旺财")
private String name;
@Value("3")
private Integer age;
@Component //注册bean
public class Person{
//直接使用@value
@Value("${person.name}") //从配置文件中赋值
private String name;
@Value("#{11*2}") //EL表达式
Private Integer age;
@Value("true") //字面量
Private Boolean happy;
}
1. #{} 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符;而${}仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
2. #{} 解析之后会将String类型的数据自动加上引号,其他数据类型不会;而${} 解析之后是什么就是什么,他不会当做字符串处理。
3. #{} 很大程度上可以防止SQL注入(SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作);而${} 主要用于SQL拼接的时候,有很大的SQL注入隐患。
4.在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。
2.yml配置文件
将实体类和配置文件绑定起来,映射到这个组件中
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
person:
name: liuben
age: 19
happy: true
birth: 2009/09/25
maps: {k1:v1,k2:v2}
list:
- code
- music
- girl
松散绑定:比如我的yml中写的last-name,这个和lastName是一样的,-后面跟着的字母默认是大写
JSR-303校验:添加@Validated注解 一种校验方式(对输入的字段进行校验,判断是否满足条件),放在定义的上面 eg:Private String name;
具体使用数据直接在网上搜
只有在单独获取配置文件的某个值的时候,可以使用一下@value,其他时候都用@configurationProperties
可在以下位置配置yml文件:(优先级从高到低排序)
1.file:./config/
2.file:./
3.classpath:/config/
4.classpath:/
多环境配置
1.使用properties(麻烦)
可以选择激活哪一个配置文件
application.properties(在此调控)
# springboot的多环境配置:可以选择激活哪一个配置文件
spring.profiles.active=test
application-dev.properties
application-test.properties
2.使用yml(推荐)
application.yml
server:
port:8081
spring:
profiles:
active:dev
---
server:
port:8082
spring:
profiles:dev
---
server:
port:8083
spring:
profiles:test
2.SpringBoot Web开发
自动装配
xxxxAutoConfiguration 向容器中自动配置组件
xxxxProperties:自动装配类,装配配置文件中自定义的一些内容
静态资源
@Controller标识的类,控制层/表现层
@Service 业务逻辑层
@Resposity Dao层/持久层
@ResponseBody将java对象转为json格式的数据
@RestController=@Controller+@ResponseBody
使用以下方式处理静态资源
public,static,/**,resources localhost:8080/
优先级:resources>static(默认)>public
thymeleaf模板引擎
在templates目录下的所有页面,只能通过controller来跳转
这个需要模板引擎的支持 thymeleaf
ctrl+f 打开idea搜索
只要需要使用thymeleaf,只需要导入对应的依赖就可以,我们将html放在我们的templates目录下即可
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
所有的html元素都可以被thymeleaf替换接管
th:元素名
th:text="${msg}" th:style=""
导入头文件
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
语法
变量:${...}
选择表达式:*{...}
消息:#{...}
URL:@{...}
片段:~{...}
使用
test.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--所有的html元素都可以被thymeleaf 替换接管; th:元素名-->
<div th:text="${msg}"></div>
</body>
</html>
IndexController
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
//在templates目录下的所有页面,只能通过controller来跳转
@Controller
public class IndexController {
@RequestMapping("/test")
public String test(Model model){
model.addAttribute("msg","hello,springboot");
return "test";
}
}
一些表达式
IndexController.java
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Arrays;
//在templates目录下的所有页面,只能通过controller来跳转
@Controller
public class IndexController {
@RequestMapping("/test")
public String test(Model model){
model.addAttribute("msg","<h1>hello,springboot</h1>");
model.addAttribute("users", Arrays.asList("liu","ben"));
return "test";
}
}
test.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--所有的html元素都可以被thymeleaf 替换接管; th:元素名-->
<div th:text="${msg}"></div>
<div th:utext="${msg}"></div>
<hr>
<h3 th:each="user:${users}" th:text="${user}"></h3>
</body>
</html>
MVC
配置原理
package com.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Locale;
//扩展springmvc dispatchservlet
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//如果想diy一些定制化的功能,只要写这个组件,然后将它交给springboot,springboot就会帮我们自动装配
// ViewResolver 实现了视图解析器接口的类,我们就可以把它看做视图解析器
@Bean
public ViewResolver myViewResolver(){
return new MyViewResolver();
}
//自定义了一个自己的视图解析器MyViewResolver
public static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
return null;
}
}
}
3.员工管理系统
准备工作
页面放templates
资源放static
pojo:Department Employee
dao:DepartmentDao EmployeeDao
Lombok:java的一个库,能自动插入编辑器并构建工具,不需要为类编写getter和equals方法
(使用:xml导入依赖,再在类上加 @Data)
@AllArgsConstructor有参构造
@NoArgsConstructor无参构造
@Repository和@Controller、@Service、@Component的作用差不多,都是把对象交给spring管理。@Repository用在持久层的接口上,这个注解是将接口的一个实现类交给spring管理
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法
首页实现
添加静态资源需要
# 关闭模板引擎的缓存
spring.thymeleaf.cache=false
首页配置:所有页面的静态资源都需要使用thymeleaf接管
url:@{}
页面国际化
中英文可以直接切换
#我们的配置文件的真实位置
spring.messages.basename=i18n.login
1.配置i18n文件
2.如果需要在项目中进行按钮自动切换,自定义一个组件LocaleResolver
3.将自己写的组件配置到spring容器 @Bean
4.#{}
登录功能实现
@RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求
@ResponseBody的作用其实是将java对象转为json格式的数据(在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中)
@RequestParam用于将请求参数区数据映射到功能处理方法的参数上
使用model完成数据的页面回显
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Model model)
后台往前台传参数(账号密码错误,返回登录失败)
html
<p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
java
model.addAttribute("msg","用户名或密码错误!");
拦截器
必须登录过后才能访问除了首页以及登录界面的其他页面
展示员工列表
model.addattribute(K,V)往前台传数据,可以传对象,可以传List,通过el表达式 ${}可以获取到
1.提取公共页面
1.th:fragment="sidebar"
2.th:replace="~{commons/commons::sidebar}"
3.如果要传递参数,可以直接使用()传参,接受判断即可
2.列表循环展示
添加员工
1.按钮提交
2.跳转到添加页面
3.添加员工成功
4.返回首页
页面通过controller跳到添加页面,先查出原来的页面,添加结束,跳到controller保存增加信心,再通过controller重定向到原来的展示页面
*转发操作 * 1.forward:转发页面和转发到的页面可以共享request里面的数据 redirect:不能共享数据 * * 2. forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL. * 3.转发是服务器行为,重定向是客户端行为
修改员工
拿添加员工改,比添加员工多一个将原本的数据返回
404
在resources的templates里创建error文件夹,将404页面放入
注销
session.invalidate();
4.如何写一个网站
1.前端搞定:页面长什么样子:数据
2.设计数据库(难点)
3.前端让他能够自动运行,独立化工程
4.数据接口如何对接:json
5.前后端联调测试
5.整合Mybatis框架
整合包 mybatis-spring-boot-starter
勾选配置
右侧database连接数据库,选择相应的表
proerties或者yml配置
导入lombok依赖
创建User类
创建Mapper接口类
配置mybatis
去mybatis官网找文档
修改namespace,写sql语句
再去properites中整合mybatis
写sql语句,可以直接从UserMapper中alt+enter创建过来
跳过了service层,写了controller
业务层调用dao层,controller调用service层