SpringMVC 配置详解
SpringMVC 是 Spring 框架中用于构建 Web 应用程序的模块,它基于 MVC(Model-View-Controller)设计模式,能够将业务逻辑、数据和显示分离,从而提高代码的可维护性和可扩展性。本文将详细介绍 SpringMVC 的配置步骤和相关要点。
一、SpringMVC 简介
SpringMVC 是 Spring 框架的一部分,它提供了对 MVC 架构的支持,使得开发 Web 应用更加高效和灵活。在 SpringMVC 中,控制器(Controller)负责处理用户请求,并调用相应的业务逻辑;模型(Model)用于存储数据;视图(View)则负责将数据以适当的格式展示给用户。
二、SpringMVC 配置步骤
1. 创建 Maven 项目
首先,创建一个 Maven 项目,这样可以方便地管理项目的依赖。在项目的 pom.xml 文件中,添加 SpringMVC 所需的依赖项,包括 Spring 框架、Servlet API 等。例如:
<dependencies><!-- Spring MVC 依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.12.RELEASE</version></dependency><!-- Servlet API 依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!-- 其他依赖... -->
</dependencies>
2. 配置 web.xml
在 web.xml 文件中,需要配置 SpringMVC 的前端控制器 DispatcherServlet。这个控制器是 SpringMVC 的核心,它负责接收和分发用户请求。配置示例如下:
<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_4_0.xsd"version="4.0"><!-- 配置 SpringMVC 前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 可选:指定 SpringMVC 配置文件的位置 --><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/springmvc-servlet.xml</param-value></init-param><!-- 启动时加载 --><load-on-startup>1</load-on-startup></servlet><!-- 配置前端控制器的映射 --><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>
在这里,<servlet-name> 是前端控制器的名称,可以自定义;<servlet-class> 指定了前端控制器的类;<init-param> 用于指定 SpringMVC 配置文件的位置,如果不配置该参数,则默认在 /WEB-INF/[servlet-name]-servlet.xml 文件中查找配置;<load-on-startup> 表示在服务器启动时加载该 Servlet;<url-pattern> 配置了前端控制器的映射路径,这里配置为 /,表示拦截所有请求。
3. 创建 SpringMVC 配置文件
在上面的配置中,我们指定了 SpringMVC 配置文件的位置为 /WEB-INF/springmvc-servlet.xml。现在需要创建这个文件,并在其中进行相关的配置。例如:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 扫描控制器所在的包 --><context:component-scan base-package="com.example.controller" /><!-- 启用 SpringMVC 的注解驱动 --><mvc:annotation-driven /><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" /></bean></beans>
在该配置文件中,<context:component-scan> 用于扫描控制器所在的包,以便 Spring 能够自动检测和管理控制器类;<mvc:annotation-driven> 启用了 SpringMVC 的注解驱动,这样可以使用 @Controller、@RequestMapping 等注解来定义控制器和请求映射;<bean> 定义了一个视图解析器,用于将逻辑视图名解析为实际的视图页面路径,这里配置了 JSP 页面的前缀和后缀路径。
4. 创建控制器类
接下来,创建一个控制器类,并使用 Spring 的注解进行标记和定义请求映射。例如:
package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping("/hello")public String hello(Model model) {model.addAttribute("message", "Hello, SpringMVC!");return "hello";}
}
在这个控制器类中,@Controller 注解表明该类是一个控制器;@RequestMapping 注解用于定义请求的映射路径,当用户访问 /hello 路径时,将调用 hello 方法;Model 参数用于将数据传递到视图页面,在方法中通过 model.addAttribute 将数据添加到模型中;return "hello"; 表示逻辑视图名,视图解析器会根据配置将其解析为 /WEB-INF/views/hello.jsp。
5. 创建视图页面
根据上面的配置和控制器代码,创建一个 JSP 页面作为视图。在项目的 WEB-INF/views/ 目录下创
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Hello Page</title>
</head>
<body><h1>${message}</h1>
</body>
</html>
这个 JSP 页面通过 ${message} 获取模型中的数据并展示在页面上。
6. 部署和测试
完成以上配置后,将项目部署到服务器(如 Tomcat)上,启动服务器并访问 http://localhost:8080/your-project-name/hello,应该能看到页面显示 "Hello, SpringMVC!",说明 SpringMVC 配置成功。
三、SpringMVC 配置要点总结
-
项目依赖:确保在
pom.xml中正确添加了 SpringMVC 和相关依赖。 -
前端控制器配置:在
web.xml中配置DispatcherServlet,并设置其映射路径和配置文件位置。 -
SpringMVC 配置文件:在配置文件中扫描控制器包、启用注解驱动、配置视图解析器等。
-
控制器开发:使用注解定义控制器类和请求映射,处理用户请求并返回视图。
-
视图页面:根据视图解析器的配置创建相应的视图页面,展示数据。
四、高级配置(可选)
1. 视图解析器的多样化配置
除了常用的 InternalResourceViewResolver 外,还可以根据需要配置其他类型的视图解析器,如 BeanNameViewResolver、ResourceBundleViewResolver 等,以满足不同的视图解析需求。
2. 文件上传配置
在 SpringMVC 中,可以通过配置 MultipartResolver 来支持文件上传功能。例如:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="10485760" /> <!-- 设置最大上传大小为10MB -->
</bean>
同时,在控制器中使用 @RequestParam 注解接收上传的文件。
3. 拦截器配置
SpringMVC 支持拦截器的配置,用于在请求处理前后执行一些公共逻辑,如权限验证、日志记录等。配置拦截器需要在 SpringMVC 配置文件中定义拦截器链:
<mvc:interceptors><bean class="com.example.interceptor.LoggingInterceptor" />
</mvc:interceptors>
然后创建拦截器类,实现 HandlerInterceptor 接口,并重写 preHandle、postHandle、afterCompletion 等方法。
五、总结
通过以上步骤,我们详细介绍了 SpringMVC 的配置过程,从项目依赖的添加到前端控制器的配置,再到控制器、视图解析器等的设置,每一步都进行了清晰的讲解。SpringMVC 的配置虽然有一定的复杂性,但只要理解了其核心原理和配置要点,就能灵活地运用它来开发高效、灵活的 Web 应用程序。在实际开发中,还可以根据项目需求进行更高级的配置和扩展,以满足各种复杂的业务场景。
相关文章:
SpringMVC 配置详解
SpringMVC 是 Spring 框架中用于构建 Web 应用程序的模块,它基于 MVC(Model-View-Controller)设计模式,能够将业务逻辑、数据和显示分离,从而提高代码的可维护性和可扩展性。本文将详细介绍 SpringMVC 的配置步骤和相关…...
详细Linux中级知识(不断完善)
Nginx服务配置 基于主机名配置 映射IP和主机名 [rootlocalhost ~]# vim /etc/hosts 192.168.72.135 www.chengke.com chengke[rootlocalhost ~]# echo "192.168.72.135 www.xx.com" >> /etc/hosts以上是两种方法,前面是你的IP地址,后…...
Spatial Multiplexing Power Save
802.11n中添加的PSMP,SMPS机制。 SM 节能功能可让 STA 在大部分时间内仅通过一条活动接收链运行,从而达到节能目的。 空间复用省电(Spatial Multiplexing Power Save)模式下,节点会关闭多余的天线,仅仅使用一根天线进…...
2025年渗透测试面试题总结-某360-企业蓝军面试复盘 (题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 360-企业蓝军 一、Shiro绕WAF实战方案 二、WebLogic遭遇WAF拦截后的渗透路径 三、JBoss/WebLogic反序…...
实时图像处理:让你的应用更智能
I. 引言 实时图像处理在现代应用中扮演着重要的角色,它能够使应用更加智能、响应更加迅速。本文将深入探讨实时图像处理的原理、部署过程以及未来的发展趋势,旨在帮助开发者更好地理解如何将实时图像处理应用于他们的项目中。 II. 实时图像处理的基础概…...
C语言基础—函数指针与指针函数
函数指针 定义 函数指针本质上是指针,它是函数的指针(定义了一个指针变量,变量中存储了函数的地址)。函数都有一个入口地址,所谓指向函数的指针,就是指向函数的入口地址。这里函数名就代表入口地址。 函…...
用DrissionPage升级网易云音乐爬虫:更稳定高效地获取歌单音乐(附原码)
一、传统爬虫的痛点分析 原代码使用requests re的方案存在以下局限性: 动态内容缺失:无法获取JavaScript渲染后的页面内容 维护成本高:网页结构变化需频繁调整正则表达式 反爬易触发:简单请求头伪造容易被识别 资源消耗大&am…...
OpenCV图像拼接(5)构建图像的拉普拉斯金字塔 (Laplacian Pyramid)
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::createLaplacePyr 是 OpenCV 中的一个函数,用于构建图像的拉普拉斯金字塔 (Laplacian Pyramid)。拉普拉斯金字塔是一种多…...
03 Python 基础:数据类型、运算符与流程控制解析
文章目录 一、数据类型 内置的六大类数字类型整数类型 int浮点数 float布尔 bool字符串 str 变量命名 二、数字类型的相互转换显式类型的转换整数,浮点数,复数 之间的显式转换 隐式类型的转换 三、标识符算术运算符比较运算符逻辑运算符位运算符赋值运算…...
通俗一点介绍什么是场外期权交易 ?
场外期权是交易所以外的市场进行交易的期权,主要由期货公司、证券公司等金融机构根据客户具体要求进行设计,最终由期货公司等机构与客户签订协议的形式进行,通俗一点理解场外期权就是股票做多的玩法交易,下文为大家科普通俗一点介…...
蓝桥杯备考:图的遍历
这道题乍一看好像没什么不对的,但是!但是!结点最大可以到10的5次方!!!我们递归的时间复杂度是很高的,我们正常遍历是肯定通过不了的,不信的话我们试一下 #include <iostream>…...
【机器学习/大模型/八股文 面经 (一)】
1. PPO算法中使用GAE的好处以及参数γ和λ的作用是什么? 参考答案: GAE(Generalized Advantage Estimation) 的优势在于通过指数加权多步TD误差,平衡优势估计的偏差与方差,提升策略优化的稳定性。γ(折扣因子):控制未来奖励的衰减程度,值越大表示更关注长期收益。λ…...
IIS漏洞攻略
一,PUT漏洞 1,在windows server 2003 中开启 WebDAV 和写权限,然后访问并使用BP抓包 2,使用PUT上传一个木马文件,后缀要改成其他格式 3,将上传的木马文件的内容写入到asp文件中,然后进行连接即…...
C++《红黑树》
在之前的篇章当中我们已经了解了基于二叉搜索树的AVL树,那么接下来在本篇当中将继续来学习另一种基于二叉搜索树的树状结构——红黑树,在此和之前学习AVL树类似还是通过先了解红黑树是什么以及红黑树的结构特点,接下来在试着实现红黑树的结构…...
struts2框架漏洞攻略
S2-057远程执⾏代码漏洞 环境 vulhub靶场 /struts2/s2-057 漏洞简介 漏洞产⽣于⽹站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置 或使⽤通配符namespace时,可能会导致远程代码执⾏漏洞的发⽣。同样也可能因为url标签没有设置…...
8662 234的和
8662 234的和 ⭐️难度:中等 🌟考点:模拟、二维前缀和 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int[] a ne…...
Baklib企业CMS的核心功能是什么?
企业CMS标准化发布解析 现代企业内容管理中,标准化发布模板与元数据管理构成了高效运营的基石。通过预置行业适配的文档框架与格式规范,系统能够显著降低内容创建门槛,同时确保品牌视觉与信息架构的一致性。以某智能硬件厂商为例,…...
综合章节:游戏功能扩展与深度开发
模块一:外星人管理与碰撞系统 目标:生成动态外星人群,处理移动、触边检测与子弹碰撞。 # alien.py(基础外星人类) class Alien(Sprite):def __init__(self, game):super().__init__()self.screen game.screenself.i…...
【大模型】DeepSeek攻击原理和效果解析
前几天看到群友提到一个现象,在试图询问知识库中某个人信息时,意外触发了DeepSeek的隐私保护机制,使模型拒绝回答该问题。另有群友提到,Ollama上有人发布过DeepSeek移除模型内置审查机制的版本。于是顺着这条线索,对相…...
金融行业 UE/UI 设计:解锁高效体验,重塑行业界面
在数字化浪潮中,金融行业的竞争日益激烈,用户体验(UE)和用户界面(UI)设计成为企业脱颖而出的关键。兰亭妙微凭借丰富的经验和创新的方法,为金融行业打造了一套行之有效的 UE/UI 解决方案&#x…...
在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败
在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败 当信号和槽在不同线程时,默认使用 队列连接(Qt::QueuedConnection),信号会被放入接收线程的事件队列&…...
从报错到成功:Mermaid 流程图语法避坑指南✨
🚀 从报错到成功:Mermaid 流程图语法避坑指南 🚀 🚨 问题背景 在开发文档或技术博客中,我们经常使用 Mermaid 流程图 来可视化代码逻辑。但最近我在尝试绘制一个 Java Stream 转换流程图时,遭遇了以下报错…...
串口通信接口标准 RS232/422/485
串口通信接口标准 RS232、RS422、R485 目录 串口通信接口标准 4 1 RS232 4 1.1 引言 4 1.2 协议原理 4 1.3 电平标准 5 1.4 应用场景 5 1.5 优缺点 6 1.5.1 优点 6 1.5.2 缺点 6 2 RS422 7 2.1 背景介绍 7 2.2 协议原理 7 2.2.1 差分信号传输 7 2.2.2 电平标准…...
开源链动2+1模式与AI智能名片赋能的S2B2C共享经济新生态
摘要:在数字经济浪潮中,共享经济平台正重塑个体服务者的职业生态。本文基于平台经济理论与创新扩散模型,深入探讨"开源链动21模式"对资源共享效率的革命性提升,解析AI智能名片与S2B2C商城小程序源码的技术赋能机制。通过…...
【论文#目标检测】YOLO9000: Better, Faster, Stronger
目录 摘要1.引言2.更好(Better)3.更快(Faster)4.更健壮(Stronger)使用 WordTree 组合数据集联合分类和检测评估 YOLO9000 5.结论 Author: Joseph Redmon; Ali Farhadi Published in: 2017 IEEE Conference …...
The First Indoor Pathloss Radio Map Prediction Challenge
原文:免费下载 挑战:ICASSP 2025 Chanllenge 摘要:为了鼓励进一步的研究并促进在开发基于深度学习的无线电传播模型时进行公平比较,在室内传播环境中定向无线电信号发射的探索较少的情况下,我们发起了 ICASSP 2025 年首次室内路径损耗无线电地图预测挑战赛。本概述论文介…...
Android系统深度定制:内置Google TTS语音引擎并设为默认的终极指南
一、背景与挑战 在Android 12.0的GMS套件定制化开发中,我们发现原生的文本转语音(TTS)功能存在一个关键问题:Google TTS语音包并非预装组件,导致用户需要手动下载安装后才能使用。本文将通过深度系统定制,…...
dify0.15.3升级至dify1.1.2操作步骤
参考官方文档:https://github.com/langgenius/dify/releases/tag/1.0.0 准备工作 停止docker容器后,首先是备份好现有的 docker-compose.yaml其次,解压 dify-1.1.2.zip,默认解压至 dify-1.1.2,sudo cp -r dify-1.1.2…...
Vue+SpringBoot:整合JasperReport作PDF报表,并解决中文不显示问题
文章目录 一、前言二、后端代码1、pom依赖2、Jaspersoft Studio生成的jasper文件3、main程序测试案例4、解决中文不显示问题5、web接口案例 三、Vue前端代码四、演示效果 一、前言 以前,在流行jdk1.6的时候,作pdf报表,用的软件是iReport。 …...
_DISPATCHER_HEADER结构中的WaitListHead和_KWAIT_BLOCK的关系
第一部分: // // Wait block // // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *R…...
