項目結構圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SM5ATMxgDOhJTYihzY3ImNzYzX5EDMxgTM5AzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
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.6.2</version>
</parent>
<packaging>war</packaging>
<groupId>com.kaven</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot</name>
<description>springboot</description>
<properties>
<java.version>1.8</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-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>hello-world</finalName>
</build>
</project>
打包成
WAR
:
<packaging>war</packaging>
聲明
Spring Boot
應用的内嵌
Tomcat
容器的作用域,在應用運作時不使用内嵌
Tomcat
容器,因為需要使用外部
Tomcat
容器。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
application.properties
:
server.port=8080
Spring Boot
應用的預設啟動端口也是
8080
,這裡隻是為了示範。
HelloWorldController
:
package com.kaven.springboot.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@GetMapping("/hello-world")
public String helloWorld() {
return "Hello World";
}
}
啟動類:
package com.kaven.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
ApplicationInitializer
(繼承
SpringBootServletInitializer
抽象類,和啟動類同級):
package com.kaven.springboot;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ApplicationInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootApplication.class);
}
}
SpringBootServletInitializer
抽象類是一個
WebApplicationInitializer
,以傳統的
WAR
部署運作
SpringApplication
。将
Servlet
、
Filter
和
ServletContextInitializer
這些
bean
從應用程式上下文綁定到伺服器。要配置應用程式,需要重寫
configure(SpringApplicationBuilder)
方法(調用
SpringApplicationBuilder.sources(Class...)
)。如果将
SpringBootServletInitializer
與其他
WebApplicationInitializer
結合使用,可能還需要添加
@Ordered
注解來配置特定的啟動順序。
WebApplicationInitializer
僅在建構
war
檔案并部署它時才需要。
開始打包。
下載下傳
Tomcat
:
- 下載下傳位址
部落客下載下傳的版本是
9.0.58
。
2.6.2
版本的
Spring Boot
内嵌的
Tomcat
版本為
9.0.56
,為了避免麻煩,可以使用和内嵌
Tomcat
一樣的版本。
将
WAR
檔案複制到
Tomcat
的
webapps
檔案夾下。
啟動
Tomcat
,輕按兩下下圖示記的腳本。
Tomcat
的啟動日志輸出如下圖所示(存在亂碼),可見
Started ApplicationInitializer in 2.55 seconds (JVM running for 5.401)
,說明實作的
SpringBootServletInitializer
被使用了。
Tomcat
啟動成功。
接口可以正常通路。
解決
Tomcat
亂碼,需要添加一條配置到
conf
檔案夾下的
logging.properties
配置檔案中。
java.util.logging.ConsoleHandler.encoding = GBK
重新啟動
Tomcat
,
Tomcat
的啟動日志輸出就沒有亂碼了。