一、引言
Spring MVC 是一種基于 Java 的實現了 MVC 設計模式的請求驅動類型的輕量級 Web 框架,它為開發 Web 應用提供了強大而靈活的解決方案。本文將通過一個簡單的 Spring MVC 入門案例,詳細介紹其工作流程,幫助讀者深入理解 Spring MVC 的運行機制。
二、環境準備
在開始編寫代碼之前,我們需要準備好開發環境。本案例使用 Maven 進行項目管理,因此需要在?pom.xml?中添加必要的依賴。以下是?pom.xml?的代碼:
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qcby</groupId><artifactId>01</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>01 Maven Webapp</name><url>http://maven.apache.org</url><!-- 版本鎖定 --><properties><spring.version>5.3.23</spring.version><servlet.api.version>4.0.1</servlet.api.version><jsp.api.version>2.3.3</jsp.api.version><junit.version>4.13.2</junit.version></properties><dependencies><!-- Spring 相關依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- Servlet API --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.api.version}</version><scope>provided</scope></dependency><!-- JSP API --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>${jsp.api.version}</version><scope>provided</scope></dependency><!-- 測試依賴 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies><build><finalName>01</finalName></build>
</project>
這些依賴包含了 Spring 框架、Servlet API、JSP API 以及測試所需的 JUnit 庫。
三、配置文件編寫
3.1?web.xml
?配置
?web.xml?是 Web 應用的核心配置文件,主要用于配置 Servlet、過濾器等。以下是?web.xml?的代碼:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><display-name>Spring MVC Application</display-name><!-- 添加字符編碼過濾器 --><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>
?
- 字符編碼過濾器:用于設置請求和響應的字符編碼為 UTF-8,避免中文亂碼問題。
- DispatcherServlet:Spring MVC 的核心 Servlet,負責接收所有的請求并進行分發處理。通過?
contextConfigLocation
?指定其配置文件為?springmvc.xml
。 - Servlet 映射:將所有以?
.do
?結尾的請求映射到?DispatcherServlet
。
3.2?springmvc.xml
?配置
springmvc.xml?是 Spring MVC 的配置文件,主要用于啟用注解驅動、配置組件掃描和視圖解析器。以下是?springmvc.xml?的代碼:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 啟用注解驅動 --><mvc:annotation-driven/><!-- 配置組件掃描 --><context:component-scan base-package="cn.tx.demo1"/><!-- 配置視圖解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean>
</beans>
?
- 注解驅動:啟用 Spring MVC 的注解功能,如?
@Controller
、@RequestMapping
?等。 - 組件掃描:指定 Spring 容器掃描的包路徑,自動發現并注冊帶有?
@Controller
?等注解的組件。 - 視圖解析器:用于將控制器返回的邏輯視圖名解析為實際的 JSP 頁面路徑。
四、控制器編寫
?控制器是 Spring MVC 中處理請求的核心組件,負責接收請求、處理業務邏輯并返回視圖。以下是?HelloController.java?的代碼:
package cn.tx.demo1;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;@Controller
@RequestMapping("say")
public class HelloController {@RequestMapping(path = "hello.do", method = RequestMethod.GET, params = "username")public String sayHello(String username) {try {PrintStream out = new PrintStream(System.out, true, "UTF-8");out.println("入門方法執行了2...");out.println(username);} catch (UnsupportedEncodingException e) {System.out.println("入門方法執行了2...");}return "suc";}
}
?
@Controller
?注解:將該類標記為控制器,Spring 容器會自動掃描并注冊該類。@RequestMapping
?注解:用于映射請求路徑和請求方法。這里將?/say/hello.do
?的 GET 請求映射到?sayHello
?方法,并且要求請求參數中包含?username
。sayHello
?方法:接收?username
?參數,打印相關信息,并返回邏輯視圖名?suc
。
五、視圖頁面編寫
5.1 首頁?index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>入門程序</title>
</head>
<body>
<%--超鏈接--%>
<h3>入門</h3>
<form action="/say/hello.do" method="post">用戶名:<input type="text" name="username"/><button type="submit">提交</button>
</form>
<a href="/say/hello.do?username=張三" >入門程序</a>
</body>
</html>
?該頁面提供了一個表單和一個超鏈接,用于向?HelloController
?發送請求。
?
?5.2 成功頁面?suc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>成功</title>
</head>
<body>
<h3>入門成功了2...</h3>
</body>
</html>
當請求處理成功后,會跳轉到該頁面。
?如下:
?
六、工作流程分析?
6.1 請求發送
?用戶在瀏覽器中訪問?index.jsp
?頁面,通過表單或超鏈接發送請求到?/say/hello.do
。
6.2 請求接收
請求到達?DispatcherServlet
,DispatcherServlet
?根據?web.xml?中的配置,將請求轉發給 Spring MVC 框架處理
6.3 處理器映射
DispatcherServlet
?根據?@RequestMapping
?注解的配置,找到對應的控制器方法?HelloController.sayHello
。
6.4 處理器執行
調用?sayHello
?方法,處理業務邏輯,接收并打印?username
?參數。
6.5 視圖解析
sayHello
?方法返回邏輯視圖名?suc
,DispatcherServlet
?根據?springmvc.xml?中配置的視圖解析器,將邏輯視圖名解析為實際的 JSP 頁面路徑?/WEB-INF/pages/suc.jsp
。
6.6 視圖渲染
DispatcherServlet
?將請求轉發到?suc.jsp
?頁面,渲染并返回給用戶。