SpringMVC快速入門之啟動配置流程

SpringMVC快速入門之啟動配置流程

    • 一、SpringMVC啟動的核心流程
    • 二、環境準備與依賴配置
      • 2.1 開發環境
      • 2.2 Maven依賴配置
    • 三、初始化Servlet容器:WebApplicationInitializer
      • 3.1 實現WebApplicationInitializer
      • 3.2 配置編碼過濾器(解決中文亂碼)
    • 四、配置SpringMVC環境:SpringMvcConfig
      • 4.1 基礎配置(@Configuration + @EnableWebMvc)
      • 4.2 配置視圖解析器(JSP視圖)
      • 4.3 配置靜態資源處理
    • 五、編寫第一個Controller驗證配置
      • 5.1 創建Controller
      • 5.2 創建JSP視圖
    • 六、啟動應用并驗證
      • 6.1 啟動Tomcat
      • 6.2 訪問測試
    • 七、常見問題與排查
      • 7.1 啟動失敗:找不到Controller
      • 7.2 靜態資源404(CSS/JS無法加載)
      • 7.3 中文亂碼(POST請求參數)
    • 總結:SpringMVC啟動配置核心要點

SpringMVC作為主流的Web MVC框架,其啟動配置是入門的核心。不同于傳統的XML配置,現代SpringMVC開發更推薦基于Java配置類的方式,這種方式更靈活且易于維護。本文我將從Servlet容器初始化、SpringMVC環境加載到核心配置類設置,完整解析SpringMVC的啟動配置流程,帶你快速搭建可運行的SpringMVC應用。

一、SpringMVC啟動的核心流程

SpringMVC的啟動本質是在Servlet容器中初始化SpringMVC環境,核心流程包括:

  1. Servlet容器啟動(如Tomcat):加載Web應用的初始化類;
  2. Spring容器初始化:創建SpringMVC的IoC容器,加載配置類和Bean;
  3. DispatcherServlet初始化:注冊核心組件(處理器映射器、適配器等),接管請求處理;
  4. 應用就緒:接收并處理客戶端請求。

傳統方式通過web.xml配置啟動,而現代方式(Servlet 3.0+)可通過Java類完全替代XML,本文將重點講解基于Java配置的啟動方式。

二、環境準備與依賴配置

2.1 開發環境

  • JDK:1.8+
  • Servlet容器:Tomcat 9.0+(支持Servlet 3.1)
  • 構建工具:Maven
  • Spring版本:Spring 5.3.x

2.2 Maven依賴配置

創建pom.xml,添加核心依賴(SpringMVC、Servlet API等):

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>springmvc-quickstart</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.3.20</spring.version><servlet.api.version>4.0.1</servlet.api.version></properties><dependencies><!-- SpringMVC核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- Servlet API(提供Servlet相關類) --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.api.version}</version><scope>provided</scope> <!-- 運行時由容器提供,打包不包含 --></dependency><!-- JSTL(可選,用于JSP頁面) --><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>javax.servlet.jsp.jstl-api</artifactId><version>1.2.2</version></dependency></dependencies><!-- 配置Maven編譯和打包 --><build><plugins><!-- 編譯Java 1.8 --><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><!-- 配置Tomcat插件(方便本地運行) --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat9-maven-plugin</artifactId><version>3.0.0</version><configuration><port>8080</port> <!-- 端口 --><path>/</path> <!-- 上下文路徑 --></configuration></plugin></plugins></build>
</project>

依賴說明

  • spring-webmvc:包含SpringMVC核心類(如DispatcherServlet);
  • javax.servlet-api:提供Servlet規范相關類(如ServletContext);
  • Tomcat插件:無需本地安裝Tomcat,通過mvn tomcat9:run啟動應用。

三、初始化Servlet容器:WebApplicationInitializer

Servlet 3.0+支持通過WebApplicationInitializer接口替代web.xml,實現Servlet容器的初始化配置。這個接口的onStartup方法會在容器啟動時被調用,用于注冊DispatcherServlet和配置過濾器。

3.1 實現WebApplicationInitializer

創建MyWebAppInitializer類,繼承AbstractAnnotationConfigDispatcherServletInitializer(Spring提供的抽象類,簡化配置):

package com.example.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;/*** 替代web.xml,初始化Servlet容器*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 配置根容器的配置類(非Web層Bean,如Service、Dao)* 若無需分層,可返回空數組*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0]; // 本文簡化為單容器,根容器為空}/*** 配置SpringMVC容器的配置類(Web層Bean,如Controller、視圖解析器)*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class}; // 指定SpringMVC配置類}/*** 配置DispatcherServlet的映射路徑(攔截哪些請求)*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"}; // 攔截所有請求(除.jsp)}
}

核心作用

  • getServletConfigClasses:指定SpringMVC的配置類(SpringMvcConfig),用于創建SpringMVC容器;
  • getServletMappings:設置DispatcherServlet的映射路徑為/,即所有請求都由SpringMVC處理;
  • 該類會自動注冊DispatcherServlet到Servlet容器,無需手動配置。

3.2 配置編碼過濾器(解決中文亂碼)

AbstractAnnotationConfigDispatcherServletInitializer可重寫getServletFilters方法注冊過濾器,最關鍵的是配置編碼過濾器(解決POST請求中文亂碼):

@Override
protected Filter[] getServletFilters() {// 創建編碼過濾器CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();encodingFilter.setEncoding("UTF-8");encodingFilter.setForceEncoding(true); // 強制響應編碼為UTF-8return new Filter[]{encodingFilter};
}

作用

  • 所有請求經過該過濾器后,請求和響應的編碼都會被設置為UTF-8;
  • 必須配置,否則POST請求的中文參數會出現亂碼。

四、配置SpringMVC環境:SpringMvcConfig

SpringMvcConfig是SpringMVC的核心配置類,用于配置組件掃描、視圖解析器、靜態資源處理等Web層相關Bean,替代傳統的spring-mvc.xml

4.1 基礎配置(@Configuration + @EnableWebMvc)

package com.example.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;/*** SpringMVC核心配置類*/
@Configuration // 標記為配置類
@EnableWebMvc // 開啟SpringMVC注解驅動(替代<mvc:annotation-driven>)
@ComponentScan("com.example.controller") // 掃描Controller所在包
public class SpringMvcConfig implements WebMvcConfigurer {// 其他配置將在這里添加...
}

核心注解

  • @Configuration:標記該類為Spring配置類;
  • @EnableWebMvc:開啟SpringMVC的注解支持(如@RequestMapping@Controller),自動注冊處理器映射器和適配器;
  • @ComponentScan:掃描com.example.controller包下的@Controller注解類,注冊為SpringBean。

4.2 配置視圖解析器(JSP視圖)

視圖解析器用于將邏輯視圖名(如"index")解析為物理視圖路徑(如/WEB-INF/views/index.jsp),配置InternalResourceViewResolver

/*** 配置JSP視圖解析器*/
@Bean
public InternalResourceViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/"); // 視圖前綴(JSP存放目錄)resolver.setSuffix(".jsp"); // 視圖后綴resolver.setViewClass(JstlView.class); // 支持JSTL表達式return resolver;
}

配置說明

  • 若返回邏輯視圖名"index",視圖解析器會拼接為/WEB-INF/views/index.jsp
  • JSP文件需放在src/main/webapp/WEB-INF/views/目錄(需手動創建)。

4.3 配置靜態資源處理

靜態資源(CSS、JS、圖片等)默認會被DispatcherServlet攔截,需通過WebMvcConfigureraddResourceHandlers方法放行:

/*** 配置靜態資源映射(放行CSS、JS、圖片等)*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {// 訪問路徑:/static/** → 映射到實際路徑:/static/registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}

使用說明

  • src/main/webapp/目錄下創建static文件夾,存放靜態資源(如static/css/style.css);
  • 前端頁面通過/static/css/style.css訪問該資源,SpringMVC會正確映射到實際文件。

五、編寫第一個Controller驗證配置

配置完成后,編寫一個簡單的Controller測試是否生效。

5.1 創建Controller

package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;/*** 第一個Controller*/
@Controller // 標記為控制器
public class HelloController {/*** 處理GET請求:/hello*/@GetMapping("/hello")public String hello(Model model) {// 向視圖傳遞數據model.addAttribute("message", "Hello SpringMVC!");// 返回邏輯視圖名(由視圖解析器解析為JSP)return "hello";}
}

5.2 創建JSP視圖

src/main/webapp/WEB-INF/views/目錄下創建hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>SpringMVC入門</title><!-- 引入靜態資源(測試靜態資源配置) --><link rel="stylesheet" href="/static/css/style.css">
</head>
<body><h1>${message}</h1> <!-- 顯示Controller傳遞的message -->
</body>
</html>

創建靜態資源src/main/webapp/static/css/style.css

h1 {color: blue;
}

六、啟動應用并驗證

6.1 啟動Tomcat

通過Maven命令啟動Tomcat插件:

mvn tomcat9:run

啟動成功后,控制臺會顯示:

[INFO] tomcat9-maven-plugin starting...
[INFO] Server startup in [xxx] milliseconds

6.2 訪問測試

打開瀏覽器,訪問http://localhost:8080/hello

  • 頁面顯示Hello SpringMVC!(藍色文字,說明CSS生效);
  • 若能正常顯示,說明SpringMVC啟動配置成功。

七、常見問題與排查

7.1 啟動失敗:找不到Controller

錯誤信息No mapping found for HTTP request with URI [/hello]

排查步驟

  1. 檢查@ComponentScan的包路徑是否正確(需包含Controller所在包,如com.example.controller);
  2. 確認@Controller@GetMapping注解是否正確添加;
  3. 檢查SpringMvcConfig是否被MyWebAppInitializergetServletConfigClasses正確引用。

7.2 靜態資源404(CSS/JS無法加載)

錯誤信息Failed to load resource: the server responded with a status of 404

排查步驟

  1. 確認addResourceHandlers配置是否正確(/static/**映射到/static/);
  2. 檢查靜態資源實際路徑是否正確(如static/css/style.css是否存在);
  3. 前端引用路徑是否正確(如href="/static/css/style.css",注意開頭的/)。

7.3 中文亂碼(POST請求參數)

問題:表單提交的中文參數顯示為亂碼。

排查步驟

  1. 檢查getServletFilters是否配置了CharacterEncodingFilter,且setForceEncoding(true)
  2. 確認過濾器是否被正確注冊(MyWebAppInitializergetServletFilters方法是否返回過濾器);
  3. 若使用Tomcat 8.0+,GET請求中文亂碼需在Tomcat的server.xml中配置URIEncoding="UTF-8"(POST亂碼由過濾器解決)。

總結:SpringMVC啟動配置核心要點

SpringMVC基于Java的啟動配置核心是“三個核心組件”:

  1. MyWebAppInitializer:替代web.xml,注冊DispatcherServlet和過濾器,指定SpringMVC配置類;
  2. SpringMvcConfig:SpringMVC的核心配置,負責掃描Controller、配置視圖解析器和靜態資源;
  3. DispatcherServlet:由MyWebAppInitializer自動注冊,作為請求入口,協調SpringMVC組件工作。

若這篇內容幫到你,動動手指支持下!關注不迷路,干貨持續輸出!
ヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノ

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90027.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArcGIS水文及空間分析與SWMM融合協同在城市排水防澇領域中的應用

隨著計算機的廣泛應用和各類模型軟件的發展&#xff0c;將排水系統模型作為城市洪災評價與防治的技術手段已經成為防洪防災的重要技術途徑。將創新性融合地理信息系統&#xff08;GIS&#xff09;的空間分析能力與暴雨雨水管理模型&#xff08;SWMM&#xff09;的水動力計算優勢…

PHICOMM(斐訊)N1盒子 - Armbian25.05(Debian 12)刷入U盤/EMMC

PHICOMM(斐訊)N1盒子 - Armbian25.05(Debian 12)刷入U盤/EMMC 文章目錄PHICOMM(斐訊)N1盒子 - Armbian25.05(Debian 12)刷入U盤/EMMC前言1. 確保固件版本為2.192. 刷系統到U盤3. 啟動U盤系統4. U盤系統寫入EMMC5. 關機撥U盤6. 重新上電環境&#xff1a; 系統&#xff1a;Armbi…

《計算機網絡基礎知識全解析:從協議模型到通信實踐》

《計算機網絡基礎知識全解析&#xff1a;從協議模型到通信實踐》 在數字化時代&#xff0c;計算機網絡是信息傳遞的基石&#xff0c;從日常瀏覽網頁到企業數據交互&#xff0c;都離不開網絡協議的規范與支撐。本文將系統梳理計算機網絡的核心知識&#xff0c;從通信模型到具體協…

【補題】Codeforces Global Round 26 E. Shuffle

題意&#xff1a;給出一棵樹&#xff0c;按照以下方式操作 對于當前的所有任意子樹&#xff0c;選出任何一個點從中刪除&#xff0c;然后作為新子樹的根插入到新的樹中&#xff0c;以此遞歸往復&#xff0c;直到原來的樹中節點全部進入新樹&#xff0c;問新樹最多有多少個葉子節…

金倉數據庫風云

O 記我用了這么多年&#xff0c;我最有發言權&#xff0c;我可不敢替&#xff0c;你們誰能搞定&#xff0c;誰上。” 老鄧在會上&#xff0c;狠狠甩了一句氣話。老鄧&#xff08;鄧銘&#xff09;&#xff0c;某大型期貨交易所信息化主管&#xff0c;數據庫老司機。 作為圈里最…

阿里云寶塔Linux面板相關操作記錄

1、清空nginx緩存使用Nginx時&#xff0c;靜態圖片文件會出現緩存&#xff0c;所以需要清空緩存&#xff0c;方法如下&#xff1a;sudo rm -rf /www/server/nginx/proxy_cache_dir/*2、Windows啟動spring boot jar腳本echo off setlocal enabledelayedexpansion:: 配置項目名 s…

Kotlin伴生對象

你已經知道如何為類創建單例對象&#xff08;singleton&#xff09;。不過&#xff0c;在很多情況下&#xff0c;你只需要為某個類維護一個單例&#xff0c;這時候使用類的完整名字會顯得冗長。比如&#xff0c;你可能只需要存儲一個公共的屬性。這種情況下&#xff0c;可以用 …

4G車載錄像機的作用詳解:提升行車安全與智能管理的核心技術

1. 引言隨著物流運輸、公共交通、特種車輛等行業對安全與管理需求的提升&#xff0c;4G車載錄像機已成為現代車輛智能化管理的重要組成部分。它不僅具備傳統行車記錄儀的錄像功能&#xff0c;還結合4G無線通信、AI智能分析、GPS定位、云存儲等技術&#xff0c;實現遠程監控、實…

技術與情感交織的一生 (十)

目錄 笑傲江湖 上 恨 嫌隙 掙扎 救難 論道 取巧 聯手 入魔 決裂 治傷 聚氣 傾心 笑傲江湖 上 恨 身邊的許多朋友都是金庸武俠迷&#xff0c;我也是其中之一。有人說&#xff0c;我的技術像 “任我行” &#xff0c;“吸星大法” 學到最后顯得不倫不類&#xf…

架構進階——解讀集團IT管控治理體系總體規劃【附全文閱讀】

集團IT管控治理體系正步入高質量發展階段&#xff0c;旨在重塑信息化管理價值&#xff0c;解決集團化管理的核心挑戰。首要問題是縱向與橫向的協同管控&#xff0c;需明確各層級在集團戰略決策中的角色與責任&#xff0c;促進跨部門、跨子公司的高效協同。高管激勵機制與人才梯…

亞馬遜自養號測評實戰指南:從環境搭建到安全提排名

在亞馬遜平臺上&#xff0c;自養號測評系統的成敗差異主要源于技術合規性、操作精細度和風控策略的差異。以下是關鍵因素的分析&#xff1a;&#x1f512; 一、環境隔離與偽裝技術底層環境穩定性成功案例&#xff1a;采用獨立服務器硬件參數偽裝&#xff08;如唯一MAC地址、IME…

CSS中的transform

在 CSS 中&#xff0c;transform 是用于用于用于對元素進行幾何變換的屬性&#xff0c;可實現旋轉、縮放、平移、傾斜等效果&#xff0c;且不會影響其他元素的布局&#xff08;不會觸發重排&#xff09;。以下是其核心用法和特性&#xff1a; 1. 基本語法 element {transform: …

MyBatis攔截器插件:實現敏感數據字段加解密

文章目錄一、寫在前面二、編碼實現1、注解2、攔截器插件3、配置插件4、實體類5、測試三、擴展1、優化點一、寫在前面 日常開發中&#xff0c;經常有一些敏感數據&#xff0c;直接寫入數據庫的話&#xff0c;很容易泄露。 本文基于mybatis攔截器插件&#xff0c;實現敏感數據的…

C++_Hello算法_隊列

隊列&#xff08;queue&#xff09;是一種遵循先入先出規則的線性數據結構。顧名思義&#xff0c;隊列模擬了排隊現象&#xff0c;即新來的人不斷加入隊列尾部&#xff0c;而位于隊列頭部的人逐個離開。 如圖 5-4 所示&#xff0c;我們將隊列頭部稱為“隊首”&#xff0c;尾部…

LeetCode 1.

問題描述 倆數之和&#xff1a; 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。你可以假設每種輸入只會對應一個答案&#xff0c;并且你不能使用兩次相同的元素。你可以按…

c練習-c基礎

#include <stdio.h>int main() {//打印數組中的最大值int arr[10];int max,i;for (i 0; i < 10; i){scanf_s("%d", &arr[i]);}max arr[0];for (i 0; i < 10; i){if(max < arr[i 1]){max arr[i 1];}}printf("數組中最大值&#xff1a;%…

Numpy科學計算(五分鐘小白從入門到精通)

2.1 numpy介紹numpy是Python中科學計算的基礎包。它是一個Python庫&#xff0c;提供多維數組對象、各種派生對象&#xff08;例如掩碼數組和矩陣&#xff09;以及用于對數組進行快速操作的各種方法&#xff0c;包括數學、邏輯、形狀操作、排序、選擇、I/O 、離散傅里葉變換、基…

從零掌握微服務通信安全:mTLS全解析

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 在云原生時代&#xff0c;微服務架構的普及帶來了靈活性和可擴展性&#xff0c;但也讓服務間通信的安全性成為核心挑戰。mTLS&#xff08;Mutual TLS&…

Node.js net.Socket.destroy()深入解析

socket.destroy() 是 Node.js net 模塊中用于強制銷毀 TCP 套接字的方法&#xff0c;比 socket.end() 更徹底。下面我將從多個方面全面講解這個方法。 基本用法 const net require(net);const server net.createServer((socket) > {// 強制銷毀套接字socket.destroy(); })…

vmware 克隆虛擬機,報錯:克隆時出錯:指定不存在的設備。然后電腦卡死,只能強制關機再開機。

vmware 克隆虛擬機&#xff0c;報錯&#xff1a;克隆時出錯:指定不存在的設備。然后電腦卡死&#xff0c;只能強制關機再開機。1、問題描述2、問題原因3、解決方法1、問題描述 vmware 版本&#xff1a;vmware workstation pro 17.6.3 克隆虛擬機時&#xff0c;創建完整克隆&am…