SpringMVC Day 03 : 处理静态资源
前言
欢迎来到第三天的 SpringMVC 学习系列!在前两天的教程中,我们已经学习了如何搭建 SpringMVC 环境、创建控制器和处理请求等基础知识。今天,我们将继续探索 SpringMVC 的功能,并学习如何处理静态资源。
在现代 Web 应用程序中,静态资源(如图片、CSS 文件、JavaScript 文件等)是构建用户界面和增强用户体验的重要组成部分。SpringMVC 提供了方便的机制来处理这些静态资源,使我们能够有效地管理和提供它们。
本教程将介绍如何在 SpringMVC 中处理静态资源。我们将学习如何配置 SpringMVC 以正确加载和分发静态资源,以及如何在视图中引用这些资源。
一、前期准备
1、新建项目,结构如下

2、添加依赖
<dependencies><!-- springmvc 依赖,会将spring的核心包一并添加进来 --><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.5</version></dependency></dependencies>
3、在 jsp 包下新建一个 hello.jsp 页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>hello.......</h1>
</body>
</html>
4、配置 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/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><!-- 所有的请求都经过核心控制器,但是不处理 static 是无感知的 --><url-pattern>/</url-pattern></servlet-mapping></web-app>
用于配置 Servlet 的映射和加载。在 Spring MVC 中,它用于配置 DispatcherServlet 的初始化和请求映射。
具体来说,这段配置的作用如下:
- 定义了一个名为 "dispatcher" 的 Servlet,并指定了
org.springframework.web.servlet.DispatcherServlet作为其处理类。- 设置了
load-on-startup属性为 1,表示在应用启动时就加载该 Servlet。- 使用
<servlet-mapping>元素将 "dispatcher" Servlet 映射到所有的请求路径上(即<url-pattern>/</url-pattern>),意味着所有的请求都会经过该 Servlet 进行处理。
这段配置的作用是将所有的请求交给 DispatcherServlet 处理,并让它成为应用的核心控制器。DispatcherServlet 将根据请求的 URL 和其他配置信息,将请求分发给相应的处理器方法进行处理,然后返回响应结果。
5、在 controller 包下新建一个HelloController 控制器
@Controller
public class HelloController {@GetMapping("/hello")public ModelAndView hello(){return new ModelAndView("hello");}}
@Controller注解用于将HelloController类标记为一个 Spring MVC 控制器,表示它可以接收和处理 HTTP 请求。@GetMapping("/hello")注解用于将hello()方法映射到路径为 "/hello" 的 GET 请求上。当用户访问该路径时,Spring MVC 将调用hello()方法,并返回一个ModelAndView对象。
ModelAndView对象包含两个部分:模型(Model)和视图(View)。模型用于存储数据,视图用于渲染数据。在这里,ModelAndView对象没有设置任何模型数据,只设置了视图名称为 "hello"。这意味着 Spring MVC 将查找名为 "hello" 的视图,并将其渲染返回给用户。
6、配置 dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 扫描 --><context:component-scan base-package="edu.nf.ch03"/><!-- 启用 mvc 注解处理器 --><mvc:annotation-driven/><!-- 静态资源助理 --><!-- 方式一 : 将静态资源交由容器的默认 servlet来处理,springmvc 不参与解析,常见的 servlet 容器如 tomcat,jetty等都会有一个自带的 defaultServlet 来处理这些静态资源--><mvc:default-servlet-handler/><!-- 方式二:静态资源由 springmvc 自己来处理mapping属性:用于映射资源的 urllocation 属性:用于指定静态资源的本地相对路径例如:下面的配置中,当以 page 为开头的所有请求都会因映射到 static 这个目录中去查找相应的静态资源文件-->
<!-- <mvc:resources mapping="page/**" location="../static/"/>--><!-- 内部资源视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean></beans>
这段 XML 配置的作用如下:
<context:component-scan>:用于扫描指定包下的组件,并将其注册为 Spring 容器中的 Bean。这样可以自动发现和管理这些组件,使它们可以在应用程序中被使用。
<mvc:annotation-driven>:启用 MVC 注解驱动,使得 Spring MVC 可以处理注解相关的请求映射、参数绑定、数据转换等操作。通过这个配置,你可以使用注解来定义控制器、请求映射、请求参数等,简化了开发过程。
<mvc:default-servlet-handler>:启用默认的静态资源处理器。当有静态资源请求时(如 CSS、JS 文件),Spring MVC 将不会处理这些请求,而是将其交给容器的默认 Servlet 处理。这样可以提高性能并减少不必要的开销。
<mvc:resources>:将指定路径下的静态资源映射到指定的 URL 路径上。在这个例子中,mapping="page/**"表示将以/page/开头的 URL 路径映射到静态资源,location="/static/"表示静态资源的存放路径为/static/。这样配置后,当访问以/page/开头的 URL 路径时,Spring MVC 会将对应的静态资源返回给客户端。
<bean>:定义了一个内部资源视图解析器InternalResourceViewResolver,用于将逻辑视图名称解析为具体的 JSP 视图路径。prefix属性表示 JSP 文件的前缀路径,suffix属性表示 JSP 文件的后缀名。通过这个配置,可以简化控制器中返回视图的处理过程。
这段配置主要是为了实现 Spring MVC 的基本功能,包括组件扫描、注解驱动、静态资源处理和视图解析等。它们共同协作,使得开发者可以更方便地开发和管理 Spring MVC 应用程序。
7、测试运行
1)、测试 <mvc:default-servlet-handler/>

2)、测试 <mvc:resources mapping="page/**" location="/static/"/>

二、使用这两种方式处理静态资源的好处
使用 <mvc:default-servlet-handler/> 和 <mvc:resources> 元素可以带来以下好处:
提高性能:使用默认的 Servlet 处理器可以提高静态资源的处理性能,因为容器通常会对静态资源进行缓存和优化。而如果使用 Spring MVC 框架来处理静态资源,每个请求都需要经过框架的处理,会降低性能。
简化配置:使用
<mvc:resources>元素可以简化静态资源的配置,只需要指定映射和位置即可。而如果不使用该元素,可能需要手动配置多个HandlerMapping和HandlerAdapter,增加了配置的复杂度。更好的可维护性:使用
<mvc:resources>元素可以将静态资源的处理与业务逻辑分离,使代码更易于维护和扩展。而如果将静态资源与业务逻辑混在一起处理,可能会导致代码难以维护和扩展。更好的安全性:使用默认的 Servlet 处理器可以提高静态资源的安全性,因为容器通常会对静态资源进行保护,例如防止目录遍历攻击等。而如果使用 Spring MVC 框架来处理静态资源,可能需要手动配置安全措施,增加了安全风险。
使用 <mvc:default-servlet-handler/> 和 <mvc:resources> 元素可以提高性能、简化配置、提高可维护性和安全性。因此,在处理静态资源时,建议使用这两个元素来优化应用程序的性能和可维护性。
三、总结
使用 <mvc:default-servlet-handler/> 和 <mvc:resources> 元素来处理静态资源。
当处理静态资源时,使用 <mvc:default-servlet-handler/> 和 <mvc:resources> 元素可以带来许多好处。首先,使用默认的 Servlet 处理器可以提高性能,因为容器会对静态资源进行缓存和优化。而使用 Spring MVC 框架处理静态资源则会降低性能。其次,这两个元素可以简化配置,减少代码复杂性。通过 <mvc:resources> 元素,我们可以轻松地映射静态资源的位置和 URL 请求。此外,使用默认的 Servlet 处理器还能提高安全性,因为容器通常会对静态资源进行保护。总之,使用 <mvc:default-servlet-handler/> 和 <mvc:resources> 元素能够提高性能、简化配置、提高可维护性和安全性。这些优化措施对于现代 Web 应用程序至关重要。通过示例和代码演示,我们可以更好地理解如何在 Spring MVC 中使用这两个元素来处理静态资源。在实际项目中,合理利用这些元素可以提升应用程序的性能和用户体验。
四、gitee 案例
案例地址:ch03 · qiuqiu/SpringMVC - 码云 - 开源中国 (gitee.com)
相关文章:
SpringMVC Day 03 : 处理静态资源
前言 欢迎来到第三天的 SpringMVC 学习系列!在前两天的教程中,我们已经学习了如何搭建 SpringMVC 环境、创建控制器和处理请求等基础知识。今天,我们将继续探索 SpringMVC 的功能,并学习如何处理静态资源。 在现代 Web 应用程序…...
activiti 用户任务中的执行监听器
前言 略 用户任务中的执行监听器配置界面 监听器事件 用户任务中的执行监听器可以监听到的事件有: start:开始时触发。end:结束时触发。take:执行时触发。 监听器执行方式 监听器的执行方式: 类(classÿ…...
leetcode做题笔记200. 岛屿数量
给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边…...
HTTP 之 options预请求 nginx 解决跨域 postman调试跨域问题
一、HTTP一共有八种常见请求方法 get:参数在url上,浏览器长度有限制,不安全post:参数不可见,长度不受限制put:上传最新内容到指定位置delete:删除请求的url所表示的资源head:不返回…...
MFC知识点
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…...
Spring-手写模拟Spring底层原理
概述 模拟大致的底层原理,为学习Spring源码做铺垫。 实现的功能:扫描路径、依赖注入、aware回调、初始化前、初始化、初始化后、切面 未实现的功能:构造器推断、循环依赖 重点:BeanDefinition、BeanPostProcessor 学习Spring…...
Scala【集合常用方法和函数操作(下)】
Fold、FoldLeft 和 FoldRight object Test03_Fold {def main(args: Array[String]): Unit {// 称作集合外的参数val list List(1,2,3,4)// fold的底层仍然是调用的 foldLeft// 第一个参数是一个值(称作集合内的参数,必须和集合外的参数类型一致)// 第二个参数是一…...
JS加密/解密之那些不为人知的基础逻辑运算符
不多说,直接上干货 使用逻辑非运算符 ! 和双重逻辑非运算符 !!:例如 ![]、!![]、!0、!!0 和 !""、!!""。空字符串的转换:!"" 和 !!""。数组和对象的类型转换:[] []、[] - []、{} [] 和…...
flinksql kafka到mysql累计指标练习
flinksql 累计指标练习 数据流向:kafka ->kafka ->mysql 模拟写数据到kafka topic:wxt中 import com.alibaba.fastjson.JSONObject; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Produ…...
pdf转jpg的方法【ps和工具方法】
pdf转jpg的方法: 1.photoshop办法: pdf直接拖入ps中,另存为*.Jpg文件即可 另外注意的时候,有时候别人给你pdf文件中包含你需要的jpg文件,千万不要截图进入ps中,直接把文件拖入ps中,这样的文件…...
【已解决】Qt发送信号后,槽函数没有响应
Qt发送信号后,槽函数没有响应 检查有没有连接正确的信号和槽函数,有时候,大意了,会写错检查connect函数返回值,有没有连接成功检查对象的创建方式,确保在信号发送前,以及槽函数接收前ÿ…...
Kafka入门05——基础知识
目录 副本数据同步原理 HW和LEO的更新流程 第一种情况 第二种情况 数据丢失的情况 解决方案 Leader副本的选举过程 日志清除策略和压缩策略 日志清除策略 日志压缩策略 Kafka存储手段 零拷贝(Zero-Copy) 页缓存(Page Cache&…...
WordPress(7)配置邮箱发送功能
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、注册登陆163邮箱1. 配置SMTP二、开启smtp1.添加授权码二.在网站中配置smtp服务1.在主题的Boxmoe主题设置中开启邮箱设置三.安装所需要的插件1.安装完毕开启插件即可四.SMTP邮箱服务测试总结…...
简化路径(C++解法)
题目 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 / 开头),请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身࿱…...
CS224W1.1——图机器学习介绍
文章目录 1. 介绍2. 主要问题3. 深度学习如何应用在图结构中4. 课程大纲 学习一下斯坦福CS224W的图机器学习(2021年),并做一下学习笔记,主要是研究方向与图神经网络相关。这次是第一次笔记,图片很多都是从斯坦福的PPT里…...
docker搭建waline评论系统
我这里是给博客网站嵌入评论系统的 1.登录LeanCloud 国际版,没有账号可以注册个 链接:点击跳转 2.新建应用,选择开发版(免费),商用版每个月最低消费5美刀。 3.在设置-应用凭证里面将AppID、AppKey、Maste…...
sql server 生成连续日期和数字
在sqlserver里,可以利用系统表master..spt_values里面存储的连续数字0到2047,结合dateadd()函数生成连续的日期 select convert (varchar(10),dateadd(d, number, getdate()),23) as workday from master..spt_values where type…...
太极v14.0.4 免ROOT用Xposed
一个帮助你免 Root、免解锁免刷机使用 Xposed 模块的 APP 框架。 模块通过它改变系统和应用的行为,既能以传统的 Root/ 刷机方式运作, 也能免 Root/ 免刷机运行;并且它支持 Android 5.0 ~ 11。 简单来说,太极就是个 Xposed 框架…...
python DevOps
在云原生中,python扮演的角色是什么? 在云原生环境中,Python 作为一种高级编程语言,在多个方面扮演着重要角色。云原生是指利用云计算的各种优势(如弹性、可扩展性和自动化),构建和运行应用程序…...
Git(四)底层命令:git对象、树对象、提交对象
目录 一、知识回顾1.1 Linux 基础命令1.2 .git 文件夹解析 二、git 对象(数据对象)2.1 hash-object 存储对象2.2 cat-file 查看对象 三、树对象3.1 ls-files 查看暂存区3.2 update-index 创建暂存区3.3 write-tree 生成树对象3.4 更新暂存区,…...
别再只做静态模型了!用Unity 3D + WebGL打造你的第一个可交互数字孪生看板
从静态到动态:用Unity 3D WebGL构建工业级数字孪生看板实战指南 当传统工业监控系统还停留在二维图表和静态数据展示时,数字孪生技术正在重新定义设备管理的交互方式。想象一下:在浏览器中旋转查看工厂设备的实时三维模型,点击某…...
Nunchaku-flux-1-dev性能调优:针对STM32嵌入式设备演示的图片预处理
Nunchaku-flux-1-dev性能调优:针对STM32嵌入式设备演示的图片预处理 最近在折腾一个智能门禁项目,需要在STM32上跑人脸识别。想法挺简单,本地抓拍人脸,然后传给云端的大模型Nunchaku-flux-1-dev去分析。结果一上手就发现…...
OFA模型在教育领域的应用:智能试题解析系统
OFA模型在教育领域的应用:智能试题解析系统 让AI看懂试卷,让教学更智能 1. 引言:教育场景的智能化需求 你有没有遇到过这样的情况?批改一堆试卷到深夜,眼睛都快看花了;学生拿着练习题来问,你却…...
Windows苹果触控板驱动完全指南:5分钟实现原生级触控体验
Windows苹果触控板驱动完全指南:5分钟实现原生级触控体验 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad…...
Docker镜像与容器操作全攻略
❤️一:镜像:把镜像保存为文件(可放到其他虚拟机中运行): docker save -o centos-7.5-1804.tar(保存的文件名) centos:7.5.1804(仓库:标签)将镜像文件加载到本地镜像库&a…...
3大维度掌握Ryujinx:Switch模拟器从配置到优化的全流程指南
3大维度掌握Ryujinx:Switch模拟器从配置到优化的全流程指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx作为一款用C#编写的开源Switch模拟器,为玩家…...
AIoT设备控制不止是口语转指令!我的用户需求决策模型思考
AIoT设备控制不止是口语转指令!我的用户需求决策模型思考 文章目录AIoT设备控制不止是口语转指令!我的用户需求决策模型思考[toc]前言问题关键需求决策模型模型本质核心价值解决的问题除了解决以上三个核心问题,还可以从其他一些维度来看需求…...
Vue——Vue 3动态表单配置实战:打造灵活的在线问卷系统
写在前面 最近在开发一个内部管理系统时,遇到了一个很有意思的需求:需要实现一个支持动态配置的表单功能,用户可以自定义题目类型、选项内容,还要支持附件上传和时间范围控制。 说实话,这个需求刚开始让我有点头大。动…...
炉石传说自动化系统构建指南:从重复劳动到智能游戏体验
炉石传说自动化系统构建指南:从重复劳动到智能游戏体验 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 发现游戏自动化的价值 在策略卡牌游…...
Visual C++ Redistributable AIO:一站式解决Windows程序运行问题的终极指南
Visual C Redistributable AIO:一站式解决Windows程序运行问题的终极指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过打开游戏或…...
