目录

创建 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 组件。

部署GPU operator 部署和部署哪个对_tomcat

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" 按钮进行项目构建。

部署GPU operator 部署和部署哪个对_部署GPU operator_02

2、index.jsp:同理也可以手动创建一个 index.jsp 页面作为项目的默认首页。

部署GPU operator 部署和部署哪个对_spring_03

3、项目部署(Artifacts):设置 xx:war exploded(解压的 war)的输出目录为本地的 tomcat 服务器下的 webapps 目录下。

部署GPU operator 部署和部署哪个对_spring boot_04

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 页面。

部署GPU operator 部署和部署哪个对_spring_05

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、此时后台访问视图层时,可以不再写路径前后缀。

部署GPU operator 部署和部署哪个对_tomcat_06

外置 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 等。