目录
一,简介
开发工具:IntelliJ IDEA 2020.1.1 x64
俗话说的好,“工欲善其事必先利其器”,高效率完成工作,工具的好用于否起到至关重要的作用,IDEA是目前java开发中最受欢迎的,简化的了很多配置,为开发者提供了很多插件。比如SpringBoot项目的构建。
本文用IDEA创建SpringBoot项目
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot 默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。它的核心设计思想是:约定优于配置,Spring Boot 所有开发细节都是依据此思想进行实现的。
优点:
(1)快速创建独立运行的Spring项目以及与主流框架集成
(2) 使用嵌入式的Servlet容器,应用无需打成WAR包
(3) starters启动器自动依赖与版本控制
(4)大量的自动配置,简化开发,也可修改默认值
(5)无需配置XML,无代码生成,开箱即用
(6) 准生产环境的运行时应用监控
(7)与云计算的天然集成
如果非要说SpringBoot有什么缺点的额话,那就是方便的springboot让一些程序员丧失了对其封装实现原理有更深了解的机会。因为springboot是在spring基础上的再次封装。所以如果如果你需要对springboot深度定制,必须对spring本身有相当的了解。
1.创建SpringBoot项目
这里需要注意下,有些小伙伴使用默认的URL会出现创建失败的情况,我这里提供一个阿里巴巴的镜像地址,直接复制到custom 里就可以了
https://start.aliyun.com/
直接点“下一步”
项目创建好,maven自动下载包,默认情况下使用idea默认的maven仓库,这个仓库在国外,所以首次加载时间会很慢。提供解决方案,去maven官网下载maven仓库,然后修改setting配置文件的镜像,使用阿里镜像,国内的加载速度会快很多。
SpringBoot有内置的启动类,直接点击启动就好。
启动成功
二,配置文件与yaml语法基础
在Spring Boot中,默认使用两种类型的配置文件来作为Spring Boot项目的全局配置:
1、application.properties
2、application.yml (更常用)
注: 全局配置文件的名字固定不可改变,SpringBoot是默认加载他们的,写了别的名字的配置文件,要通过其他方式导入。
SpringBoot将默认从以下四个位置开始加载配置文件:
1、当前目录下的/config子目录;
2、当前目录;
3、一个classpath下的/config包;
4、classpath根路径。
配置文件的优先级按上面的排序从高到低是从1到4, SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级中属性不重复,则会共同存在—互补配置,如果重复,则高有先级会覆盖低优先级.
注:同优先级下,application.properties 加载优于 application.yml
YML配置文件
SpringBoot支持properties 和 yml 两种格式的配置文件,但是在实际开发的过程中,yml配置文件的使用频率更高,yml天然的树状结构,使我们在阅读时对内容一目了然,更加友好。
YAML配置文件可以简单理解是xml+json+Properties 的融合,他将这者最简单易用的地方结合到了一起,可读性比这3者更强,而且所需的字符更少。
我们可以看到右侧的yml配置文件内容会更有层次感一些,阅读会更加友好,更加简洁;
注:Idea可能会出现不支持yml文件的情况,此时需要们自行下载插件和进行配置
1.yml基础语法
(1) 以 key: value 的形式来表示数据, 注意: 在value值的前面要加空格;
(2)以空格的缩进来控制层级关系;只要左对齐一列数据,都是一个层级的,
如:
server:
port: 8080 #端口配置
servlet:
context-path: /demo #项目路径配置
(3)大小写敏感;
(4)使用缩进表示层级关系;
(5)缩进时不允许使用Tab键,只允许使用空格;
(6)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
2.在yml中value值的形式支持三种数据结构:
2.1 字面量——即单个的、不可再分的值,常见的字面纯量如下所示:
(1) 整数值 numberInt: 12
(2) 浮点数 numberDouble: 12.3
(3) 布尔值 isTrue: true(用on、1、true来表示true,off、0、false来表示false)
(4) 日期 date: 2018-11-12 (日期必须为ios8602格式,即为yyyy-MM-dd)
(5) 时间 dateTime: 2018-11-12T20:21:30+08:00(时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区 )
(6) null ~ 表示null
(7) 字符串 username: ckzz
使用字符串作为值时的注意事项:
在yaml中字符串默认是不用加双引号和单引号的。
双引号:如果使用了双引号,不会转义字符串中的特殊字符
栗子: name: "zhangsan \n lisi" 则会得到: zhangsan 换行 lisi
单引号:如果使用了单引号,则会将特殊字符转义,即转换成一个字符串输出,不表示特殊含义
栗子: name: 'zhangsan \n lisi' 则会得到: zhangsan \n lisi
注: 一般来说如果字符串中有特殊符号,我们就需要将它放在引号中:
如: str: “内容:字符串” (这里的 :就是特殊符号)
2.2、数组(list、set):
在yml中,value值也可以是数组或则list,此时我们用连字符“-”来表示
(1)普通方式书写
animals:
- dog
- cat
- pig
注意: - 连字符和值之间需要有空格
(2)行内方式写法: animals: [dog,pig,cat]
2.3、对象/map:
(1)普通写法:
user:
name: 王二麻子
age: 18
gender: 男
(2)行内写法: user: {name: 王二麻子,age: 18,gender: 男}
注: map和数组之间也可以互相嵌套,如: {languages: [c,java,c++],score :[80,89,80]}
测试用例:
student:
id: 1
name: 小林
sex : 男
teacher:
name: 林老师
sex: 男
hoby:
- 篮球
- 足球
注意:通过读取配置文件的信息注入到java对象,需要导入jar包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Component
@ConfigurationProperties(prefix ="student")
@Data
public class Student {
private int id;
private String name;
private String sex;
private List<String> hoby;
private Teacher teacher;
}
单元测试:
注:通过Spring容器配置的对象的属性后,注入对象。
输出结果:
获取配置文件中的数据—@Value注解读取
1、通过@Value注解将数据注入指定的属性中,先来进行配置文件的书写
properties中:
teacher.name=Mr.chen teacher.id=10
注:这个方式只能从properties结尾的配置文件中获取
通过@Value注解将配置文件中的值读到对应的属性中:
@Data
@Component
public class Student1 {
@Value("${teacher.id}")
private int id;
@Value("${teacher.name}")
private String name;
}
这里提供一个从yml配置文件中,通过@Value 注解获取值
@Data
@Component
@PropertySource("classpath:application.yml")
@ConfigurationProperties(prefix = "student1")
public class Student1 {
@Value("${student1.id}")
private int id;
@Value("${student1.name}")
private String name;
}
三,Web开发
1.SpringBoot对静态资源的映射问题
(1) "/**" 访问当前项目的任何资源,都去(静态资源的文件夹)找映射
"classpath:/META‐INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径
(2)、欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;
localhost:8080/ 找index页面
(3)、所有的 **/favicon.ico 都是在静态资源文件下找;
2.SpringBoot中Thymeleaf引擎模板的使用
SpringBoot支持多种模板引擎,如 JSP、Velocity、Freemarker、Thymeleaf,但是其中Thymeleaf语法更简单,功能更强大,所以在SpringBoot中推荐使用该模板引擎。
Thymeleaf引擎模板的使用:
引入pom依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
设置thymeleaf版本,版本3检查html标签可以没有闭合结束符
<properties>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
配置文件设置thymeleaf属性
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.mode=HTML5
在resources/templates新建index.html文件
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello World!</title>
</head>
<body>
<h1 th:inline="text">Hello</h1>
<p th:text="${hello}"></p>
</body>
</html>
编写controller
@RequestMapping
@Controller
public class IndexController {
@GetMapping("/helloHtml")
public String testHelloHtml(Model model){
model.addAttribute("hello", "你好");
return "index";
}
}
Thymeleaf 语法可以参照官方文档(https://www.thymeleaf.org/index.html)
3.SpringBoot实现登录拦截
实例:实现简单的登录拦截
创建拦截器
public class LoginFilter extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("-----登录状态拦截");
//判断Session中有没有admin对象
Object admin = request.getSession().getAttribute("admin");
if (admin!=null){
System.out.println("----登录成功");
return true;//放行
}else {
System.out.println("----还没有登录");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("请先登入用户!");
return false;
}
}
}
实现WebMvcConfigurer 接口,重写addInterceptors方法
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginFilter())
//拦截所有url,但是忽略“/login”和“/”
.addPathPatterns("/**")
.excludePathPatterns("/login")
.excludePathPatterns("/aaa")
.excludePathPatterns("/");
}
}
controller里添加登入方法
/**
* 登录
*
*/
@RequestMapping("/login")
public String login(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
Admin admin = new Admin();
admin.setUsername(username);
admin.setPassword(password);
//可以去数据库查询
//这里做查询 ,前端传过来有值就加入到Session作用域中
if (admin != null) {
//不为空
request.getSession().setAttribute("admin",admin);
return "back";
}else {
return "index";
}
}
测试
总结下几个步骤:
1、创建我们自己的拦截器类并继承 HandlerInterceptorAdapter类,重写preHandle方法。
2、创建一个Java类实现WebMvcConfigurer接口,并重写 addInterceptors 方法。
3、实例化我们自定义的拦截器,然后将对象手动添加到拦截器链中(在addInterceptors方法中添加)。
4.Restful风格API构建
@GetMapping,处理 Get 请求
@PostMapping,处理 Post 请求
@PutMapping,用于更新资源
@DeleteMapping,处理删除请求
@PatchMapping,用于更新部分资源
URI: /资源名称/资源标识 HTTP请求方式区分对资源CRUD操作
Restful风格api
5.SpringBoot的错误处理机制
1、默认效果,浏览器,返回一个默认的错误页面,如下所示:
2、自定义错误页面:
(1)有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下】,发生此状态码的错误就会来到 对应的页面; 可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);
(2)没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;
(3)以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面;
@ControllerAdvice
public class ErrorController {
/**
* 处理所有的异常
* @param e
* @return
*/
@ExceptionHandler(value = {Exception.class})
public ModelAndView exceptions(Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("error", e);
modelAndView.setViewName("error");
return modelAndView;
}
}