目录
创建 Spring Boot 2.0.3 web 应用
外置 Tomcat 服务器设置与部署
Spring MVC 流程开发测试
视图前后缀配置
外置 Tomcat 服务器启动原理
1、嵌入式 Servlet 容器的应用打成为可执行的 jar、war 包,优点是 简单、便携;缺点是 不支持 JSP、优化定制比较复杂(使用定制器、全局配置文件修改)
2、Spring Boot 提供程序员可以使用外置的 Servlet 容器,本文以外置的 Tomcat 服务器为例,此时应用要打包成为 war 包。
简而言之,大概流程如下:
1)先创建一个 war 包项目,利用 idea 创建好目录结构
2)将嵌入式的 Tomcat 指定为 provided,表明 dependency 由 JDK 或者容器提供;
3)必须编写一个 SpringBootServletInitializer 的子类,并调用 configure 方法
创建 Spring Boot 2.0.3 web 应用
1、新建项目,仍然使用 IDEA 的 Spring Initializr 初始化器快速创建项目。
2、外置 Tomcat 服务器时,打包类型选择 war 包。勾选 web 组件。
3、应用默认pom. xml 文件内容(注意 tomcat 组件的 scope 为 provided):
<?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.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wmx</groupId>
<artifactId>tiger2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>tiger2</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- scope=provided 表明 dependency 由 JDK 或者容器提供-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</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>
4、应用默认生成的 ServletInitializer.java 内容:
4.1、相比于嵌入式的 Servlet 容器项目,外置容器时会多一个 ServletInitializer.java 文件,作用是用于初始化 Servlet。
4.2、如果以后需要将一个嵌入式 Servlet 容器的 Spring Boot 项目直接转为外置的 Tomcat 服务器时,也需要手写此文件。
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* 自定义类继承 SpringBootServletInitializer,自定义类名字可以自己随便取
* 作用是应用启动时,会自动执行 configure 方法,从而初始化 Spring Boot的 Servlet
*
* @author wangmaoxiong
*/
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
//传入SpringBoot应用的主程序
return application.sources(Tiger2Application.class);
}
}
外置 Tomcat 服务器设置与部署
1、创建 web.xml:从上面的默认结构中可以看到 “ src/main” 下面还有 webapp/WEB-INF/web.xml 没有自动生成,可以自己手动创建 web.xml,也可以点击工具栏的 "Project Structure" 按钮进行项目构建。
2、index.jsp:同理也可以手动创建一个 index.jsp 页面作为项目的默认首页。
3、项目部署(Artifacts):设置 xx:war exploded(解压的 war)的输出目录为本地的 tomcat 服务器下的 webapps 目录下。
4、Run/Debug Configurations:运行/调试配置,因为是外置 Tomcat 服务器部署,所以不再直接运行 @SpringBootApplication 注解的启动类,而是运行本地的 Tomcat 服务器。
4.1、因为动图超过大小限制,上传在了 github:MyDocument/runConfigruature.gif at master · wangmaoxiong/MyDocument · GitHub
4.2、可以看到运行成功,且 war 包解压在本地 Tomcat 的 webapps 目录下,将来部署时直接拷贝即可。
Spring MVC 流程开发测试
1、这里不操作数据库,只做简单的浏览器访问控制层,然后返回到指定 jsp 页面。
2、HelloController 控制层代码:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.UUID;
/**
* @author wangmaoxiong
*/
@Controller
public class HelloController {
/**
* http://localhost:8080/hello/world?message=蚩尤后裔
*
* @param message :接收页面参数
* @param model :往页面返回参数
* @return
*/
@GetMapping("hello/world")
public String world(@RequestParam String message, Model model) {
//设置返回参数
model.addAttribute("message", message);
model.addAttribute("token", UUID.randomUUID().toString());
//跳转到 jsp 页面
return "/WEB-INF/pages/hello/world.jsp";
}
}
3、world. jsp 内容:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>你好!世界。</title>
</head>
<body>
<h3>你好!世界。Hello World</h3>
<p>message=${message}</p>
<p>token=${token}</p>
</body>
</html>
视图前后缀配置
1、如同以前开发 Spring MVC 项目时,可以在 springMVC.xml 中配置内部资源视图解析器的前后缀规则一样,Spring Boot 也可以在全局配置中进行配置。
2、官方文档参考:Spring Boot Reference Guide
#设置后台访问 jsp 视图路径前缀
spring.mvc.view.prefix=/WEB-INF/pages/
#设置后台访问 jsp 视图路径后缀
spring.mvc.view.suffix=.jsp
3、此时后台访问视图层时,可以不再写路径前后缀。
外置 Tomcat 服务器启动原理
1、Servlet3.0 标准中的 ServletContainerInitializer 会扫描所有 jar 包下的 META-INF/services/javax.servlet.ServletContainerInitializer 文件中指定的类并加载
2、加载的就是 Spring web 包下的 SpringServletContainerInitializer
3、然后扫描所有 @HandleType(WebApplicationInitializer)
4、加载 SpringBootServletInitializer 并运行 onStartup 方法
5、加载 @SpringBootApplication 主类,启动容器等
本文到此结束,其它开发可以像 Spring Boot 出现之前一样进行开发,可以配置 web.xml 等。