当前位置: 首页 > web >正文

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.xdnf.cn/news/13676.html

相关文章:

  • Docker 构建文件代码说明文档
  • qemu-kvm+virt-manager创建虚拟机设置桥接模式
  • 告别手动做PPT!4款AI工具实现自动化生成
  • Python—turtle绘图库使用方法
  • 【论文阅读笔记】高光反射实时渲染新突破:3D Gaussian Splatting with Deferred Reflection 技术解析
  • 技术专栏|LLaMA家族——模型架构
  • 算法学习笔记:2.大根堆算法——数据流的中位数​​or最后一块石头的重量
  • 【Redisson】锁可重入原理
  • Redis初识第一期
  • 从0到1构建高并发秒杀系统:实战 RocketMQ 异步削峰与Redis预减库存
  • 接口测试常用工具及测试方法(基础篇)
  • 【MySQL】视图
  • 电话号码的字母组合
  • 12.ack,ACK 的区别与含义
  • 【项目实践】SMBMS(Javaweb版)(五)供应商管理模块
  • 时间同步技术在电力系统中的应用二
  • 现代建筑中空气流向管理系统SKGL的智能化趋势
  • 稳定币的监管
  • Agent应用案例精选,以及主流Agent框架开源项目推荐
  • 软件测试面试题总结【含答案】
  • 3.3.2 纠错编码(海明校验码)
  • web项目实现PWA和Browsersync的安装及使用方法
  • 锂电池3V\3.3V\3.7V升5V升压芯片,选型指南
  • 欧洲AI的崛起:Mistral推出首款逻辑推理模型Magistral,挑战美中AI霸主地位
  • UE5 学习系列(七)导入bridge资产包
  • 雷卯针对易百纳EB-SS528-DC-175开发板防雷防静电方案
  • 龙虎榜——20250611
  • 内核性能调优
  • 什么是分布式锁,及其实现
  • 洛谷 P2757 [国家集训队] 等差子序列