Spring Boot项目中会使用到的小技巧

使用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();
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值