Spring Boot 使用外置 Servlet 容器:从配置到部署全指南

在 Spring Boot 开发中,我们通常使用嵌入式 Servlet 容器(如 Tomcat),它能将应用打包成可执行 JAR,简化部署流程。但在某些场景下(如需要支持 JSP、复杂的容器定制或企业级部署规范),我们需要使用外置 Servlet 容器。本文将详细介绍如何配置 Spring Boot 使用外置 Tomcat,并解释其工作原理。

一、嵌入式与外置 Servlet 容器对比

特性嵌入式 Servlet 容器(JAR 包)外置 Servlet 容器(WAR 包)
打包方式可执行 JARWAR 包
容器位置内置在应用中独立安装在服务器上
JSP 支持默认不支持(需额外配置)原生支持
定制灵活性有限(需通过配置类)高(可直接修改容器配置)
部署方式直接运行 JAR 文件部署到外置容器(如 Tomcat)
适用场景快速开发、微服务、简单部署企业级应用、需要 JSP、复杂配置

二、使用外置 Servlet 容器的步骤

1. 创建 WAR 项目

首先,需要创建一个 WAR 类型的 Maven 项目。在 IDEA 中,可通过以下方式配置:

  • 新建项目时选择 "Spring Initializr"
  • 打包方式选择 "War"
  • 勾选 "Spring Web" 依赖

 

项目结构如下(重点关注与 JSP 相关的目录):

wservlet/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/qcby/wservlet/
│   │   │       ├── controller/      // 控制器
│   │   │       ├── WservletApplication.java  // 主程序类
│   │   │       └── ServletInitializer.java   // 外置容器启动器
│   │   ├── resources/
│   │   │   └── application.properties  // 配置文件
│   │   └── webapp/                   // Web资源目录(外置容器必需)
│   │       ├── WEB-INF/
│   │       │   └── jsp/              // JSP页面目录
│   │       └── WEB-INF/web.xml       // Web配置(可选)
│   └── pom.xml                       // 依赖配置

2. 配置依赖(pom.xml)

核心是将嵌入式 Tomcat 设置为provided(仅编译时生效,不打包到 WAR 中),并指定打包方式为war

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" ...><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.9.RELEASE</version></parent><groupId>com.qcby</groupId><artifactId>wservlet</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging>  <!-- 打包为WAR --><dependencies><!-- Web核心依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 嵌入式Tomcat设为provided(不打包) --><dependency><groupId>orgId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>  <!-- 关键配置 --></dependency></dependencies><build><plugins><!-- 编译版本配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- Spring Boot打包插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

关键说明provided scope 确保嵌入式 Tomcat 不会被打包到 WAR 中,避免与外置容器冲突。

配置项目的目录结构

3. 编写 ServletInitializer 类

外置容器启动时,不会执行 Spring Boot 主类的main方法,而是通过SpringBootServletInitializer子类初始化应用。因此需要创建该类:

package com.qcby.wservlet;import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;// 继承SpringBootServletInitializer,用于外置容器启动
public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {// 传入Spring Boot主程序类,关联应用上下文return application.sources(WservletApplication.class);}
}

作用:相当于传统 Web 项目的web.xml,负责在容器启动时加载 Spring Boot 应用。

4. 配置主程序类

主程序类与普通 Spring Boot 应用一致,但需确保@SpringBootApplication注解正确:

package com.qcby.wservlet;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class WservletApplication {// 主方法(嵌入式容器启动入口,外置容器时不执行)public static void main(String[] args) {SpringApplication.run(WservletApplication.class, args);}
}

5. 配置 JSP 视图(可选)

外置容器天然支持 JSP,需在application.properties中配置视图解析器:

# 应用名称
spring.application.name=wservlet# JSP视图配置
spring.mvc.view.prefix=/WEB-INF/jsp/  # JSP文件存放路径
spring.mvc.view.suffix=.jsp          # 视图后缀

创建 JSP 页面(src/main/webapp/WEB-INF/jsp/suc.jsp):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Success</title>
</head>
<body><h1>Hello, 外置Tomcat!</h1>
</body>
</html>

6. 创建控制器

编写一个简单的控制器,映射请求到 JSP 视图:

package com.qcby.wservlet.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/suc")
public class SucController {// 映射路径:/suc/index@RequestMapping("/index")public String index() {System.out.println("访问suc页面");return "suc";  // 对应WEB-INF/jsp/suc.jsp}
}

7. 部署到外置 Tomcat

  1. 下载并安装 Tomcat:从官网下载 Tomcat(建议 8.5 + 版本),解压到本地目录。

  2. 打包 WAR 文件

    • 在 IDEA 中执行mvn clean package,生成 WAR 包(位于target/wservlet-0.0.1-SNAPSHOT.war)。
    • 可将 WAR 包重命名为简化名称(如wservlet.war)。
  3. 部署到 Tomcat

    • 将 WAR 包复制到 Tomcat 的webapps目录下。
    • 启动 Tomcat(执行bin/startup.batbin/startup.sh)。
    • Tomcat 会自动解压 WAR 包并部署应用。
  4. 访问应用

    • 地址格式:http://localhost:8080/[WAR包名称]/[请求路径]
    • 示例:http://localhost:8080/wservlet/suc/index,将显示 JSP 页面内容。

 

三、工作原理:JAR 与 WAR 启动差异

  1. JAR 包启动(嵌入式容器)

    • 执行main方法,通过SpringApplication.run()启动 IOC 容器。
    • 自动创建嵌入式 Servlet 容器(如 Tomcat),并将应用部署到该容器。
  2. WAR 包启动(外置容器)

    • 外置容器(如 Tomcat)启动时,会扫描webapps目录下的 WAR 包。
    • 执行ServletInitializerconfigure方法,初始化 Spring 应用上下文。
    • 由外置容器接管请求处理,不再依赖嵌入式容器。

核心区别:外置容器的生命周期由容器本身管理,Spring Boot 应用作为 Web 应用被部署,而非作为独立进程运行。

四、常见问题与解决方案

  1. JSP 页面 404 错误

    • 检查spring.mvc.view.prefix是否正确(需对应webapp/WEB-INF/jsp/)。
    • 确保webapp目录在src/main下(IDEA 默认资源目录)。
  2. 依赖冲突

    • 避免引入与外置容器版本冲突的依赖(如不同版本的 Tomcat API)。
    • 确保spring-boot-starter-tomcat的 scope 为provided
  3. 访问路径问题

    • 外置容器部署时,应用上下文路径为 WAR 包名称(可在 Tomcat 的server.xml中自定义)。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92626.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

借助AI学习开源代码git0.7之九diff-files

借助AI学习开源代码git0.7之九diff-files diff-files.c 是一个用于比较工作目录中的文件和 Git 索引&#xff08;暂存区&#xff09;中文件的工具。 实质上&#xff0c;它是 git diff命令在不指定特定提交时功能的核心实现。 主要功能分析&#xff1a; 1. 核心功能 diff-files …

社区资源媒体管理系统设计与实现

社区资源媒体管理系统设计与实现 1. 系统概述 社区资源媒体管理系统是一个专为社区户外广告打造的高效、专业化平台&#xff0c;旨在实现社区媒体的数字化管理、智能投放和便捷交易。该系统将整合社区各类广告资源&#xff0c;为广告主、物业公司和社区居民提供一站式服务。 1.…

12.1.6 weak_ptr

weak_ptr weak_ptr会指向一个share_ptr&#xff08;使用一个share_ptr来初始化weak_ptr&#xff09;&#xff0c;但并不会增加这个share_ptr的引用计数器&#xff0c;其析构也不会减少share_ptr的引用计数器。 构造函数及使用 #include <iostream> #include <memory&g…

深度分析Java内存模型

Java 内存模型&#xff08;Java Memory Model, JMM&#xff09;是 Java 并发编程的核心基石&#xff0c;它定义了多线程环境下线程如何与主内存&#xff08;Main Memory&#xff09;以及线程的本地内存&#xff08;工作内存&#xff0c;Working Memory&#xff09;交互的规则。…

代码随想录算法训练营第五十二天|图论part3

101. 孤岛的总面积 题目链接&#xff1a;101. 孤岛的总面积 文章讲解&#xff1a;代码随想录 思路&#xff1a; 与岛屿面积差不多&#xff0c;区别是再dfs的时候&#xff0c;如果碰到越界的&#xff0c;需要用一个符号标记这不是孤岛再continue #include <iostream> #i…

前端实现 excel 数据导出,封装方法支持一次导出多个Sheet

一、前言 后台管理项目有时会有需要前端导出excel表格的功能&#xff0c;有时还需要导出多个sheet&#xff0c;并给每个sheet重新命名&#xff0c;下面我们就来实现一下。 二、实现效果图 三、实现步骤 1、 安装 命令行安装 xlsx 和 file-saver npm install xlsx -S npm i…

【Lambda 表达式】返回值为什么是auto

一个例子&#xff1a; int x 10; auto add_x [x](int y) -> int {return x y; }; int result add_x(5); // 结果是 15lambda 是匿名类型&#xff0c;必须用 auto 来接收。&#xff08;必须写auto&#xff0c;不可省略&#xff09;内层 -> auto 是函数的返回类型自动推…

【小董谈前端】【样式】 CSS与样式库:从实现工具到设计思维的跨越

CSS与样式库&#xff1a;从实现工具到设计思维的跨越 一、CSS的本质&#xff1a;样式实现的「施工队」 CSS作为网页样式的描述语言&#xff0c;其核心能力在于&#xff1a; 精确控制元素的尺寸、位置、颜色实现响应式布局和动画效果与HTML/JavaScript协同完成交互体验 但CS…

MTSC2025参会感悟:大模型 + CV 重构全终端 UI 检测技术体系

目录 一、传统 UI 自动化的困局:高成本与低效率的双重枷锁 1.1 根深蒂固的技术痛点 1.2 多维度质量挑战的叠加 二、Page eyes 1.0:纯视觉方案破解 UI 检测困局 2.1 纯视觉检测的核心理念 2.2 页面加载完成的智能判断 2.3 视觉模型驱动的异常检测 2.4 大模型赋能未知异…

使用Claude Code从零到一打造一个现代化的GitHub Star项目管理器

在日常的开发工作中&#xff0c;我们经常会在GitHub上star一些有用的项目库。随着时间的推移&#xff0c;star的项目越来越多&#xff0c;如何有效管理这些项目成为了一个痛点。 今天&#xff0c;分享我使用Claude Code从零构建的一个GitHub Star管理插件。项目背景与需求分析 …

为什么 Linux 启动后还能升级内核?

✅ 为什么 Linux 启动后还能升级内核&#xff1f; 简单结论&#xff1a; 因为 “安装/升级内核 ≠ 当前就使用该内核”&#xff0c;Linux允许你安装多个内核版本&#xff0c;并在下次启动时选择其中一个来加载运行。 &#x1f9e0; 举个现实生活类比 你在穿一件衣服&#xff08…

Go语言实战案例-统计文件中每个字母出现频率

以下是《Go语言100个实战案例》中的 文件与IO操作篇 - 案例19&#xff1a;统计文件中每个字母出现频率 的完整内容。本案例适合用来练习文件读取、字符处理、map统计等基础技能。&#x1f3af; 案例目标读取一个本地文本文件&#xff0c;统计并打印出其中每个英文字母&#xff…

Notepad++工具操作技巧

1、notepad -> ctrlf -> 替换(正则表达式) -> $-a ->每行的行尾加a&#xff1b; 2、notepad -> ctrlf -> 替换(正则表达式) -> ^-a ->每行的行首加a &#xff1b; 3、按住alt切换为列模式 4、删除空行-不包括有空格符号的空行 查找替代 查找目标…

领码课堂 | Java与AI的“硬核“交响曲:当企业级工程思维遇上智能时代

摘要 &#x1f680; 在AI工业化落地的深水区&#xff0c;Java正以其独特的工程化优势成为中流砥柱。本文系统解构Java在AI项目全生命周期中的技术矩阵&#xff0c;通过"三阶性能优化模型"、"微服务化AI部署架构"等原创方法论&#xff0c;结合大模型部署、M…

面经 - 基于Linux的高性能在线OJ平台

真实面试环境中&#xff0c;被问到的相关问题&#xff0c;感兴趣的可以看下1. 这个项目是你独立完成的吗&#xff1f;团队中你的职责是什么&#xff1f;是的&#xff0c;这个项目是我独立完成的&#xff0c;从需求分析、系统设计到项目部署都我做的。重点工作包括&#xff1a;使…

Ubuntu 20.04 上安装 SPDK

以下是在 Ubuntu 20.04 上安装 SPDK (Storage Performance Development Kit) 的完整步骤&#xff1a;1. 系统准备# 更新系统 sudo apt update sudo apt upgrade -y# 安装基础依赖 sudo apt install -y git make gcc g libssl-dev libaio-dev libnuma-dev \pkg-config python3 p…

解决WPS图片在Excel表格中无法打开

若出现无法打开的情况&#xff0c;还请回到WPS中&#xff0c;点击图片&#xff0c;右键&#xff1a;转化为浮动图片保存&#xff0c;然后便能正常打开&#xff01;

【Ollama】open-webui部署模型

目录 一、本地部署Ollama 1.1 进入官网复安装命令 1.2 执行安装命令 1.3 验证是否安装成功 二、启动Ollama服务 三、运行模型 方法一&#xff1a;拉取模型镜像 方法二&#xff1a;拉取本地模型 四、使用Open WebUI 部署模型 4.1 创建虚拟环境 4.2 安装依赖 4.3 运行…

C#文件操作(创建、读取、修改)

判断文件是否存在 不存在则创建默认文件 并写入默认值/// <summary>/// 判断文件是否存在 不存在则创建默认文件 并写入默认值/// </summary>public void IsConfigFileExist(){try{// 获取应用程序的当前工作目录。string fileName System.IO.Directory.GetCurr…

基于阿里云平台的文章评价模型训练与应用全流程指南

基于阿里云平台的文章评价模型训练与应用全流程指南 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;觉得好请收藏。点击跳转到网站。 1. 项目概述 1.1 项目背景 在当今信息爆炸的时代&…