一、引言

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 将被 安装--> 解决依赖关…