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
英文地址,請注明出處:http://en.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 項目背景 在當今信息爆炸的時代&…