使用Spring官网的Spring Initializr生成一个SpringBoot项目
使用Spring Initializr配置生成初始化项目
访问项目网址
进入Spring-boot
项目网址 https://spring.io/projects/spring-boot
。在页面最下方找到 Quick Start
连接,点击进入。在这里你会看到关于项目的初始化配置。
配置项目的初始化参数
选择项目类型是Maven项目或是Gradle项目。
选择项目语言是JAVA
或是Kotlin
或是Groovy
。
选择SpringBoot的版本。
填写项目的元数据:如组织Group,这里一般是公司的域名反转com.***。Artifact,这里一般填写当前项目的名称。Option,默认选项打开后可以填写项目名称、描述、包名、打包方式Jar或是War、Java版本。
然后选择项目的依赖,可以通过搜索来选择需要添加的依赖。
下载项目
最后点击最下方的 Generate the project
按钮,会自动下载一个初始的SpringBoot
项目结构zip
包。解压放到你自己的项目目录即可。
使用IDEA导入初始化项目
打开IDEA,在欢迎界面选择 Import Project
。选择刚刚下载并解压的项目包。然后在下一个界面选择第一项 Create project from existing sources
从存在的资源创建项目,点击右下角的 Next
按钮。在接下来的界面中,项目名称、项目位置、及项目格式都可以默认不动,再次点击右下角的 Next 按钮。
然后,会让告之你有些文件夹会加入到项目的根目录中,这里直接点击右下角的 Next
按钮。然后接下来在让你确认下maven包装器的信息,直接 右下角的 Next
按钮。接下来是显示项目模块结构及模块依赖,这里因为是一个初始的单模块项目,直接 Next
。
最后,是确认整个项目所依赖的库包信息,一般很长的列表,直接 Next
按钮,在下一个界面中点击 Finish
按钮。
至此,整个SpringBoot
项目导入的工作就完成了。
初始化项目结构
在项目的根目录下找到Maven项目的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 通过这个starter可以将所需要的依赖包全部引入 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 项目的描述信息 -->
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- 项目的Java版本号为 1.8 -->
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 引入依赖包 -->
<dependencies>
<!-- spring boot的依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 用于单元测试的的依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在项目的根目录下 src/main/java/com/..
下会有一个 **Application.java
类,这个类就是SpringBoot
应用的启动类。
在项目在项目的根目录下 src/main/seources/application.properties
是项目的配置文件
使用IDEA构建一个SpringBoot初始化项目
使用IDEA构建一个SpringBoot初始化项目
配置项目参数
打开IDEA后选择面板左侧 Create New Project 项,进入创建项目类型的选择界面。这里在右侧选择 Spring Initializr ,左侧面板的 Project SDK 选择JDK版本,不可低于1.8。选择初始化服务的URL为默认的 Default:https://start.spring.io ,等待获取到到Spring初始化的配置选项。
项目元数据配置:
Group:组织,一般填写公司反转的域名
Artifact:项目名称/标识
Type:根据需要选择Maven或是Gradle
Language:根据需要选择Java、Kotlin、Groovy
Packaging:打包方式根据需要选择jar或是war
Java Version:选择8或是以上
Version:项目版本
Name:项目名称
Description:项目描述
Package:包名
填写完以上的信息后进入要勾选依赖项,这里构建意见最简洁的SpringBoot项目,在右侧面板选择 Web ,在左侧面板勾选 Spring Web Starter,点击 Next 按钮。
接着填写 Project Name 项目名称和选择 Project location 项目本地位置,点击 Finish 按钮完成项目初始化。
编写一个控制层向客户端响应JSON数据的简单代码案例
项目目录结构
project
|-src
|-main
|-java
|-com.example.demo
|-controller
|-UserController.java
|-pojo
|-User.java
|-DemoApplication.java
代码
Controller层的UserController.java
package com.example.demo.controller;
import com.example.hehe.pojo.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/get")
public User getUser() {
User user = new User();
user.setName("jack");
user.setAge(18);
return user;
}
}
pojo层的User.java
package com.example.demo.pojo;
import lombok.Data;
@Data
public class User {
private String name;
private int age;
}
DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
点击IDEA
顶部工具栏的绿色运行按钮 Run DemoApplication
运行项目。
在浏览器客户端输入http://localhost:8080/user/get
,可以接收到响应的JSON
数据。
{"name":"jack","age":18}
扩展知识
扩展1:DemoApplication.java在包的根目录下,要与 controller、pojo 在同一层级,不然,SpringBooot无法扫描到注解。浏览器访问会出现“Whitelabel Error Page”。
扩展2:UserController.java 中的注解 @RestController 相当于是 @Controller 和 @ResponseBody 两个注解的组合,使用 @RestController 后不用再单独写 @ResponseBody 注解。
扩展3:@ResponseBody注解的作用是将返回结果序列化为JSON的形式向客户端返回响应数据。
扩展4:在pojo层User.java的代码中不用写getter和setter方法是因为使用 “lombok” 插件,首先在pom.xml中加入 lombok 的依赖,重点是然后需要在IDEA的插件中搜索 lombok 插件并安装。然后在pojo类中使用注解 @Data、@Getter、@Setter。分别的意思是自动生成全部Getter和Setter方法、只生成Getter方法、只生成Setter方法。这3个注解可以写在类上面表示为所有的属性自动生成,或是写在单个属性上表示只为这个属性自动生成。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
扩展5:项目运行的方式可以点击上方的绿色 Run Application 按钮,也可以在 DemoApplication.java 类中反键选 Run ’Application‘ 选项,或是点击 类名左侧的绿色运营按钮。效果都是一样的。
扩展6:在运行的控制台中可以看到SpringBoot启动的服务器及端口信息。
2019-08-08 18:00:57.236 INFO 4172 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
Jackson在序列化响应数据时的常用注解
Jackson
可以用于在想客户端响应数据时对数据进行序列化工作。
在 编写一个控制层向客户端响应JSON数据的简单代码案例 这个项目的结构基础上,我们对pojo
类进行一些修改来看一下 Jackson
的几个常用注解的用法。
pojo
层的User.java类原来的代码:
package com.example.demo.pojo;
import lombok.Data;
import java.util.Date;
@Data
public class User {
private String name;
private int age;
private Date birthday;
private String nikeName;
}
客户端的响应结果为:
{"name":"jack","age":18,"birthday":"2019-08-08T11:13:58.015+0000","nikeName":null}
我们对pojo层的User.java类代码添加注解:
package com.example.demo.pojo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Date;
@Data
public class User {
@JsonProperty("Name")
private String name;
@JsonIgnore
private int age;
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss a", locale = "zh", timezone = "GMT+8")
private Date birthday;
@JsonInclude(JsonInclude.Include.NON_NULL)
private String nikeName;
}
客户端的响应结果为:
{"birthday":"2019-08-08 07:16:20 下午","Name":"jack"}
@JsonProperty
:响应字段的名字
@JsonIgnore
:在响应的数据中忽略该字段
@JsonFormat
:对响应的日期格式数据进行格式化
@JsonInclude
:如果响应的数据中该字段为null,则不包含在响应的数据中。JsonInclude.Include.NON_NULL
是一个枚举值,
devtools启用热部署的使用
使用devtools可以在SpringBoot项目的文件发生修改后自动重启生效,devtools在实现热部署的时候不会对项目的jar包进行重启,而只是重新重新编译了class,所以重启的效率是比较快的。
但是不建议启动,我的体验是只要修改了就会自动重启项目,IDEA开启了自动保存,有时候反而不便。根据实际情况尝试。
在pom.xml中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
修改 src/resources/application.properties 文件
spring.thymeleaf.cache=true
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java
spring.devtools.restart.exclude=WEB-INF/**
修改IDEA的配置 Preferences/Build,Execution,Deployment/Compiler 下的 Build project automatically 勾选。
修改IDEA注册项,Mac版本的快捷键是 Shift+Option+Command+/
打开 Registry ,勾选 Compiler autoMake allow when app running。
SpringBoot 的服务器配置的方法
在项目的根目录 application.properties
文件中配置
# 服务容器启动的端口
server.port=8089
# 服务启动的上下文路径,生产环境一般不配置,如果配置了此项,在客户端浏览器访问的时候要在端口后加上这里的值
server.servlet.context-path= /Demo
# 发生错误时的跳转地址
server.error.path=/error
# 服务容器会话的超时时间,默认30分钟
server.servlet.session.timeout= 60
# 服务绑定的IP,一般不设置,如果设置了此项,启动服务时如果本机IP不是设置的值将会抛出异常
server.address=172.16.4.154
# 针对服务容器的配置,url编码
server.tomcat.uri-encoding=utf-8
# 针对服务容器的配置,最大线程数
server.tomcat.max-threads=250
SpringBoot 整合thymeleaf模板
在SpringBoot项目中整合thymeleaf
在 编写一个控制层向客户端响应JSON数据的简单代码案例 这个项目的结构基础上,我们做一些调整。
在 pom.xml 中,添加 thymeleaf 的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
在 src/resources/application.properties 中添加关于 thymeleaf
的相关配置
# 静态文件的放置路径
spring.thymeleaf.prefix=classpath:/templates/
# thymeleaf的静态文件后缀
spring.thymeleaf.suffix=.html
# thymeleaf的模式为HTML5
spring.thymeleaf.mode=HTML5
# thymeleaf的编码
spring.thymeleaf.encoding=UTF-8
# thymeleaf的上下文类型
spring.thymeleaf.servlet.content-type=text/html
# 缓存在开发环境设置为false,线上环境设置为true
spring.thymeleaf.cache=false
在 src/resources/templates 目录下新建一个index.html文件,重点注意:在 标签中要声明引入 thymeleaf 模板 xmlns:th="http://www.thymeleaf.org"
,标签上的 th:text="${title}"
用于接收后端传递到前端的数据。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${title}"></h1>
</body>
</html>
修改 Controller 层中的代码,这里要注意我们响应的是模板。而不是 JSON 数据,所以对应的注解需要做调整。
在 index 方法中,return 的字符串是 src/resources/templates 目录下对应的模板文件名,参数 ModelMap map
使用 addAttribute
方法将数据传递到前端
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
@RequestMapping("/index")
public String index(ModelMap map) {
map.addAttribute("title", "Hello Thymeleaf");
return "index";
}
}
在客户端浏览器访问http://localhost:8080/index
查看显示的效果
thymeleaf
模板的标签常用方法
SpringBoot 全局异常处理类
在 编写一个控制层向客户端响应JSON数据的简单代码案例 这个项目的结构基础上编写一个全局的异常处理类和显示的页面。
在 com.example.demo 包路径下新建一个异常处理 exception 文件夹,并新建一个异常处理类。
@ControllerAdvice 注解可以扩展 Controller 的全局功能,它包含三个 注解 @ExceptionHandler、@InitBinder、@ModelAttribute。
@ExceptionHandler 为全局的异常处理。
package com.example.demo.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ControllerAdvice
public class GlobalExceptionHandler {
public static final String ERROR_VIEW = "error";
@ExceptionHandler(value = Exception.class)
public Object errorHandler(HttpServletRequest req, HttpServletResponse resp, Exception e) throws Exception {
e.printStackTrace();
ModelAndView mv = new ModelAndView();
mv.addObject("exception", e);
mv.addObject("url", req.getRequestURL());
mv.setViewName(ERROR_VIEW);
return mv;
}
}
在 src/resources/templates 目录下新建一个错误处理界面,并接收
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Error</title>
</head>
<body>
<h1>系统错误</h1>
错误路径:
<p th:text="${url}"></p>
错误信息:
<p th:text="${exception.message}"></p>
</body>
</html>
测试一下,我们在Controller层中写一行报错的代码。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
@RequestMapping("/index")
public String error() {
int i = 1 / 0;
return "index";
}
}
在客户端浏览器访问 http://localhost:8080/index
后会跳转显示统一的错误页面 error.html 。
系统错误
错误路径:
http://localhost:8080/index
错误信息:
/ by zero
扩展
在前后端分离的项目中,我们的请求到后端后,如果发生异常需要统一的向前端返回错误数据信息,这里我们需要对全局错误类进行以下调整。
package com.example.demo.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public IMoocJSONResult defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
e.printStackTrace();
return e.getMessage();
}
}