Spring MVC 入門案例:從代碼到原理的深度剖析

一、引言

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 請求接收

請求到達?DispatcherServletDispatcherServlet?根據?web.xml?中的配置,將請求轉發給 Spring MVC 框架處理

6.3 處理器映射

DispatcherServlet?根據?@RequestMapping?注解的配置,找到對應的控制器方法?HelloController.sayHello

6.4 處理器執行

調用?sayHello?方法,處理業務邏輯,接收并打印?username?參數。

6.5 視圖解析

sayHello?方法返回邏輯視圖名?sucDispatcherServlet?根據?springmvc.xml?中配置的視圖解析器,將邏輯視圖名解析為實際的 JSP 頁面路徑?/WEB-INF/pages/suc.jsp

6.6 視圖渲染

DispatcherServlet?將請求轉發到?suc.jsp?頁面,渲染并返回給用戶。

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

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

相關文章

零基礎學前端-傳統前端開發(第四期-JS基礎-數組)

注&#xff1a;JS文章流程為&#xff1a;數據類型>>運算>>語法&#xff0c;語句>>對象>>數組>>函數>>類 什么是數組&#xff1a;數組是一種非常常用的數據結構&#xff0c;用于存儲一組有序的值。這些值可以是數字、字符串、對象&#xff…

深入理解 Docker 及常用命令

在云計算與容器化技術飛速發展的今天&#xff0c;Docker 已成為開發者必備的核心技能。本文將從底層原理到實戰操作&#xff0c;系統梳理 Docker 的核心知識體系&#xff0c;結合大量實操案例幫助讀者快速掌握容器化部署的全流程。 一、Docker 核心概念與底層原理 1.1 容器技…

【衛星通信】衛星與5G深度融合的架構研究——釋放非地面網絡潛能,構建全球無縫連接【3GPP TR 23.700-19 V0.1.0 (2025-04)】

引言 隨著5G網絡部署的持續推進&#xff0c;衛星通信在覆蓋偏遠地區、保障應急通信等場景中的重要性日益凸顯。3GPP Technical Report&#xff08;TR&#xff09;23.700-19 V0.1.0&#xff08;2025-04&#xff09;作為Release 20階段的最新研究成果&#xff0c;系統性地探討了…

kicad運行時出錯,_Pnext->_Myproxy = nullptr;訪問內存出錯

花費了比較長的時間&#xff0c;解決了編譯過程中遇到的許多問題后&#xff0c;終于把這個開源的工程編譯好了&#xff0c;運行post build 腳本將需要的鏈接文件拷貝好。正當我以為沒有任何問題了&#xff0c;雙擊可執行程序運行。 結果運行起來的時候報錯了&#xff0c;提示無…

資深Java工程師的面試題目(一)并發編程

以下是幾道針對Java并發編程的面試題&#xff0c;涵蓋基礎知識、高級概念和實際應用場景&#xff0c;適合資深Java工程師的面試評估&#xff1a; 1. 線程池與任務調度 題目: 描述Java線程池的核心參數&#xff08;如corePoolSize、maximumPoolSize、keepAliveTime等&#xff…

解決Spark4.0.0依賴問題

Apache Spark 4.0.0 沖突解決指南 1. 問題背景 在嘗試運行一個基于 Apache Spark 4.0.0 的 Java 應用程序。根據 Spark 4.0.0 的發布說明&#xff0c;該版本默認支持 Scala 2.13 和 JDK 17。在初始設置和運行過程中&#xff0c;遇到了以下主要問題&#xff1a; 依賴沖突 (PO…

什么是SeaTunnel

SeaTunnel&#xff1a;高性能、分布式數據集成平臺 1. 什么是SeaTunnel&#xff1f; SeaTunnel&#xff08;原名Waterdrop&#xff09;是一個高性能、分布式、可擴展的數據集成平臺&#xff0c;專為大規模數據同步、ETL&#xff08;Extract, Transform, Load&#xff09;和實…

Android 使用OkHttp 下載文件失敗問題定位和修復

一、背景 使用Okhttp下載文件時,存在失敗情況,剛開始以為是網絡問題,后面添加相關日志發現,是在網絡波動比較大的情況下,被判為timeout超時,結束了下載任務。 二、解決方案 有問題的下載配置寫法: 注:這里只是展示配置下載的關鍵代碼 val client OkHttpClient()val request…

【Docker基礎】Docker核心概念:命名空間(Namespace)之PID詳解

目錄 引言 1 基礎概念回顧 1.1 命名空間概述 1.2 命名空間的類型 2 PID命名空間詳解 2.1 PID命名空間的概念 2.2 PID命名空間的作用 2.3 PID命名空間的工作原理 2.3.1 PID命名空間的創建與銷毀 2.3.2 PID命名空間的層次結構 2.3.3 PID命名空間的進程ID映射 3 PID命…

SSM框架:企業級Java開發利器

SSM框架詳解&#xff1a;Java企業級開發的核心基石 SSM框架是Java企業級開發中最流行的框架組合&#xff0c;由Spring、Spring MVC和MyBatis三大框架整合而成。這個輕量級的框架組合為Java開發者提供了高效、靈活的企業級應用解決方案。 一、SSM框架組成解析 1. Spring框架 …

網絡安全中的人工智能應用

人工智能&#xff08;AI&#xff09;在網絡安全中的應用從根本上改變了企業抵御網絡威脅的方式。它利用先進的機器學習&#xff08;ML&#xff09;算法分析多源海量風險數據&#xff0c;挖掘威脅模式&#xff0c;從而更輕松地快速應對新興風險。AI 能以驚人的速度和準確性幫助發…

Vue + Spring Boot 前后端交互實踐:正確使用 `Content-Type: application/json` 及參數傳遞方式

在前后端分離開發中&#xff0c;前端通過 HTTP 請求與后端進行數據交互是常見的操作。其中&#xff0c;Content-Type 是決定請求體格式的重要字段之一。本文將以一個具體的例子出發&#xff0c;講解如何在 Vue 前端 使用 Axios 發送 JSON 格式請求&#xff0c;并在 Spring Boot…

微服務拆分 SpringCloud

拆分原則 什么時候拆分 大多數小型項目&#xff1a; 一般是先采用單體架構&#xff0c;隨著用戶規模擴大、業務復雜后再逐漸拆分為微服務架構&#xff08;前易后難&#xff09;。確定的大型項目&#xff1a; 資金充足&#xff0c;目標明確&#xff0c;可以直接選擇微服務架構…

DataX Hive寫插件深度解析:從數據寫入到Hive表關聯實戰

引言 在大數據處理流程中&#xff0c;將數據高效寫入Hive表是數據倉庫建設的關鍵環節。DataX作為阿里巴巴開源的數據同步工具&#xff0c;其Hive寫插件&#xff08;Hdfswriter&#xff09;提供了將數據寫入HDFS并與Hive表無縫關聯的能力。本文將系統介紹Hdfswriter的功能特性、…

基于國產USRP搭建十六通道同步采集系統, 耗費200萬 歡迎免費體驗

隨著無線通信、雷達探測和電子偵察等技術的發展&#xff0c;多通道信號同步采集的需求日益突出。我司基于8臺USRP-LW N321設備&#xff0c;構建了一套高精度十六路通道信號同步采集系統&#xff0c;該系統通過并行采集與精確時頻對齊&#xff0c;可為空間譜測向和MIMO系統等關鍵…

《前端編譯工具源映射配置:Webpack與Gulp的深度剖析》

當我們深入探索不同前端編譯工具時&#xff0c;Webpack與Gulp在源映射配置上的差異與特色&#xff0c;如同隱藏在代碼深處的神秘寶藏&#xff0c;等待我們去挖掘、去解讀。 Webpack作為現代前端構建的核心工具&#xff0c;在源映射配置方面展現出了高度的靈活性與可定制性。它…

4. 時間序列預測的自回歸和自動方法

4.1自回歸 自回歸是一種時間序列預測方法&#xff0c;僅依賴于時間序列的先前輸出&#xff1a;該技術假設下一個時間戳的未來觀測值與先前時間戳的觀測值存在線性關系。 在自回歸中&#xff0c;前一個時間戳的輸出值成為預測下一個時間戳的輸入值&#xff0c;并且誤差遵循簡單線…

Android 多屏幕旋轉控制原理與實戰

在嵌入式設備、雙顯示終端或定制系統中&#xff0c;Android 多屏幕控制&#xff08;尤其是屏幕方向旋轉&#xff09;是一個兼具挑戰與價值的功能模塊。本文將深入分析如何識別多個顯示、如何通過系統 API 控制旋轉&#xff0c;并討論為何某些 displayId 無法旋轉。 &#x1f4c…

faiss上的GPU流程,GPU與CPU之間的聯系

GPU使用流程 1、初始化階段 1.1:初始化GPU資源對象 目的: 為GPU上的操作分配和管理資源,例如臨時內存和CUDA流。 操作: 創建StandardGpuResources對象來管理GPU的內存和計算資源。例如: faiss::gpu::StandardGpuResources res; res.setTempMemory(1024 * 1024 * 512); …

在CentOS 7系統安裝PostgreSQL 15時出現`libzstd.so.1`依賴缺失問題

--> 正在處理依賴關系 libzstd.so.1()(64bit)&#xff0c;它被軟件包 postgresql15-server-15.13-1PGDG.rhel7.x86_64 需要---> 軟件包 python3-pip.noarch.0.9.0.3-8.el7 將被 安裝---> 軟件包 python3-setuptools.noarch.0.39.2.0-10.el7 將被 安裝--> 解決依賴關…