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環境,核心流程包括:
- Servlet容器啟動(如Tomcat):加載Web應用的初始化類;
- Spring容器初始化:創建SpringMVC的IoC容器,加載配置類和Bean;
- DispatcherServlet初始化:注冊核心組件(處理器映射器、適配器等),接管請求處理;
- 應用就緒:接收并處理客戶端請求。
傳統方式通過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
攔截,需通過WebMvcConfigurer
的addResourceHandlers
方法放行:
/*** 配置靜態資源映射(放行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]
排查步驟:
- 檢查
@ComponentScan
的包路徑是否正確(需包含Controller所在包,如com.example.controller
); - 確認
@Controller
和@GetMapping
注解是否正確添加; - 檢查
SpringMvcConfig
是否被MyWebAppInitializer
的getServletConfigClasses
正確引用。
7.2 靜態資源404(CSS/JS無法加載)
錯誤信息:Failed to load resource: the server responded with a status of 404
排查步驟:
- 確認
addResourceHandlers
配置是否正確(/static/**
映射到/static/
); - 檢查靜態資源實際路徑是否正確(如
static/css/style.css
是否存在); - 前端引用路徑是否正確(如
href="/static/css/style.css"
,注意開頭的/
)。
7.3 中文亂碼(POST請求參數)
問題:表單提交的中文參數顯示為亂碼。
排查步驟:
- 檢查
getServletFilters
是否配置了CharacterEncodingFilter
,且setForceEncoding(true)
; - 確認過濾器是否被正確注冊(
MyWebAppInitializer
的getServletFilters
方法是否返回過濾器); - 若使用Tomcat 8.0+,GET請求中文亂碼需在Tomcat的
server.xml
中配置URIEncoding="UTF-8"
(POST亂碼由過濾器解決)。
總結:SpringMVC啟動配置核心要點
SpringMVC基于Java的啟動配置核心是“三個核心組件”:
- MyWebAppInitializer:替代
web.xml
,注冊DispatcherServlet
和過濾器,指定SpringMVC配置類; - SpringMvcConfig:SpringMVC的核心配置,負責掃描Controller、配置視圖解析器和靜態資源;
- DispatcherServlet:由
MyWebAppInitializer
自動注冊,作為請求入口,協調SpringMVC組件工作。
若這篇內容幫到你,動動手指支持下!關注不迷路,干貨持續輸出!
ヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノ