SpringMVC之静态资源访问

文章目录

  • SpringMVC之静态资源访问
    • 1. 后缀形式没有『静态资源访问』问题
    • 2. / 和 /* 会遇到『静态资源访问』问题
    • 3. 解决方案一
    • 4. 解决方案二

SpringMVC之静态资源访问

1. 后缀形式没有『静态资源访问』问题

如果你将 DispatcherServlet 的 url-pattern 配置成后缀形式,例如,*.do,那么,DispatcherServlet 就只会处理特定形式的请求,而将静态资源的请求 URI『漏给』Servlet 容器提供的 Default Servlet 。

而 Servlet 容器的 Defautl Servlet 的处理逻辑是:将 URI 看作一个文件的路径名,在对应的位置去找这个文件,读取其内容,并将读到的内容发回给请求方。这也正是我们期望的对静态资源的处理方式。

因此,非 RESTful 风格的 Java Web 项目就采用这种方案。不要无缘无故去掉 URI 中的后缀,自找麻烦。

2. / 和 /* 会遇到『静态资源访问』问题

当你将 DispatcherServlet<url-pattern> 配置成 //* 时,会遇到静态资源访问问题。

不过,它俩的原因不太一样:

  • <url-pattern>/</url-pattern> 的原因

    由于 url-pattern 设置成了 / ,因此,DispatcherServlet 的身份将变为『Default Servlet』,而 Servlet 容器自带的『Default Servlet』则不再起作用。

    但问题是,DispatcherServlet 的对 URI 的处理逻辑中又没有像 Servlet 容器自带的『Default Servlet』那样的处理静态资源的逻辑,那么最终,Dispatcher Servlet 最终无法对静态资源访问的 URI 做出正确处理,而导致 404 。

  • <url-pattern>/*</url-pattern> 的原因

    由于 url-pattern 设置成了 /* ,而 /* 的优先级和范畴又异常强大,因此,啥请求都走到了 DispatcherServelt 这里,包括静态资源请求。

    虽然,Servlet 容器自带的『Default Servlet』此时是存在的,但是没有任何请求会『漏到』它这里,它会『闲着无所事事』。

    在 Servlet 容器自带的『Default Servlet』空闲的同时,DispatcherServlet 的对 URI 的处理逻辑中又没有对静态资源的处理逻辑,那么最终,Dispatcher Servlet 最终无法对静态资源访问的 URI 做出正确处理,而导致 404 。

3. 解决方案一

通过配置,让 DispatcherServlet 去『利用』Servlet 容器的自带的『Default Servlet』,这样,从外观上看,DispatcherServlet 就具备了处理静态资源的能力,自然也就解决了静态资源访问问题。

  • 配置文件版:spring-web.xml

    <mvc:default-servlet-handler />
    

    考虑到并非所有的容器的默认的 DefaultSevlet 的 name 并非是 default ,所以在非 Tomcat 容器中,需要手动指定其 name 。

    <mvc:default-servlet-handler default-servlet-name=「所使用的 Web 服务器默认使用的 Servlet 名称」/>
    
    • Tomcat, Jetty, JBoss, and GlassFish:“default”

    • Google App Engine:“_ah_default”

    • WebLogic:“FileServlet”

    • WebSphere:“SimpleFileServlet”

  • Java 代码配置版:SprinbWebConfig.java

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();
    }
    

4. 解决方案二

再通过配置mvc:resources『告诉』DispatcherServlet,哪些请求是静态资源请求,而不是 Servlet 请求

假定项目的目录结构如下:

webapp
├── img
│   ├── ...
│   └── ...
├── js
│   ├── ...
│   └── ...
├── css
│   ├── ...
│   └── ...
└── WEB-INF└── jsp├── ...└── ...

.jsp 页面类似如下:

<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.2.1.1.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>

我们需要表达这样的逻辑:但凡以 /xxx 开始的请求,都是针对 /xxx/ 目录下的静态资源的访问。

  • 配置文件版:spring-web.xml

    <mvc:resources location="/xxx/" mapping="/xxx/**" />   
    

    location 元素表示 webapp 目录下的 xxx 目录;mapping 元素表示以 /xxx 开头的所有请求路径。

    例如:

    <mvc:resources mapping="/img/**" location="/img/" />   
    <mvc:resources mapping="/js/**"  location="/js/"  />    
    <mvc:resources mapping="/css/**" location="/css/" />  
    
  • 代码配置版:SpringWebConfig.java

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/img/**") .addResourceLocations("classpath:/img/").addResourceHandler("/js/**") .addResourceLocations("classpath:/js/").addResourceHandler("/css/**") .addResourceLocations("classpath:/css/");// classpath: 可省略}
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/809895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】浏览器与事件循环

浏览器的进程模型 主要包含&#xff1a;浏览器进程、网络进程、渲染进程&#xff1b; 一个进程就是一块内存空间&#xff1b; 进程&#xff1a;操作系统资源分配的基本单位&#xff0c;每一个进程都拥有独立的内存空间和系统资源&#xff0c;可以独立运行&#xff1b; 线程…

开课通知 | 5月六西格玛绿带培训火热招生

尊敬的各位学员&#xff1a; 天行健管理咨询将于近期开展六西格玛绿带公开课&#xff0c;旨在为广大企业和个人提供专业的六西格玛绿带培训&#xff0c;帮助大家掌握六西格玛绿带的核心知识和技能&#xff0c;提升工作效率和质量。现将相关事宜通知如下&#xff1a; 一、培训时…

工智能图像降噪软件 ON1 NoNoise AI 2024 for Mac激活版

ON1 NoNoise AI 2024 for Mac是一款专为Mac用户设计的先进人工智能图像降噪软件。其核心功能在于能够利用机器学习技术&#xff0c;快速并智能地消除图像中的噪点&#xff0c;无论是亮度噪点还是颜色噪点&#xff0c;都能得到显著的改善。 软件下载&#xff1a;ON1 NoNoise AI …

【AR】使用深度API实现虚实遮挡

遮挡效果 本段描述摘自 https://developers.google.cn/ar/develop/depth 遮挡是深度API的应用之一。 遮挡&#xff08;即准确渲染虚拟物体在现实物体后面&#xff09;对于沉浸式 AR 体验至关重要。 参考下图&#xff0c;假设场景中有一个Andy&#xff0c;用户可能需要放置在包含…

揭秘英特尔AI芯片如何做到比H100训练快40%、推理快50%

英特尔&#xff0c;开始正面硬刚英伟达了。 深夜时分&#xff0c;英特尔CEO帕特基辛格激动展示全新AI芯片Gaudi 3&#xff0c;引领未来科技潮流&#xff0c;开启智能新篇章。 他为什么开心到现场直接蹦迪&#xff1f; 看下Gaudi 3的性能结果&#xff0c;就一目了然了&#xf…

【回溯】Leetcode 78. 子集【中等】

子集 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2…

算法打卡day32

今日任务&#xff1a; 1&#xff09;738.单调递增的数字 2&#xff09;968.监控二叉树 738.单调递增的数字 题目链接&#xff1a;738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;贪…

(Java)数据结构——正则表达式

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 正则表达式概念 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xf…

初学网络编程

网络编程是指编写能够在网络环境中运行&#xff0c;进行数据通信的程序的过程。它涵盖了从建立网络连接、发送和接收数据&#xff0c;到关闭连接等一系列操作。网络编程是开发网络应用程序的基础&#xff0c;它使得不同的计算机和设备能够通过网络进行数据交换和通信。 三个核…

微机消谐装置能够有效消除电网中的谐波干扰

随着电力技术的飞速发展&#xff0c;电网系统的稳定性与安全性成为了电力工业关注的重点。在这个背景下&#xff0c;微机消谐装置以其卓越的性能和广泛的应用领域&#xff0c;逐渐成为了电网系统中不可或缺的一部分。 微机消谐装置是一种基于微处理器技术的先进设备&#xff0c…

ELK企业级日志分析系统(elasticsearch+logstash+kibana)

目录 一.ELK概述 1.定义 &#xff08;1&#xff09;ElasticSearch &#xff08;2&#xff09;Kiabana &#xff08;3&#xff09;Logstash &#xff08;4&#xff09;Filebeat 2.filebeat结合logstash带来好处 3.为什么要是用ELK&#xff1f; 4.完整日志系统基本特征 …

无界面 centOS 中使用 DrissionPage

无界面 centOS 中使用 DrissionPage 1. centos 安装 chrome2. python 代码DrissionPage简介 某电影网站使用了加密js&#xff0c;无法直接从主页上爬取电影信息&#xff0c;只好借助 selenium 等工具。selenium 需要在服务器上安装浏览器和对应的 driver。我的服务器是无界面 c…

Docker学习笔记(一):入门篇,Docker概述、基本组成等,对Docker有一个初步的认识

前言 记录时间 [2024-4-5] 在先前的文章中&#xff0c;笔者进行了Windows系统下YOLOv8模型的简单测试&#xff0c;并由此引发思考&#xff1a;是否能尝试将此模型运行在Linux中呢&#xff1f;又或者&#xff0c;运行在Docker中。关于Docker的学习就这么展开了。 本文便是有关D…

RX8130CE为用户提供带复位延迟和主备电管理的解决方案

实时时钟作为设备的精确时钟来源&#xff0c;其作用如同人的心脏&#xff0c;为设备提供准确稳定的心跳.而便携式设备由于应用场景多变&#xff0c;所以对内部元器件要求也相对较高&#xff0c;这就对作为核心器件的实时时钟模块提出不少挑战。世强代理品牌EPSON实时钟模块产品…

Web3:下一代互联网的崛起与革命性展望

随着科技的飞速发展&#xff0c;互联网正在经历一场前所未有的变革。Web3&#xff0c;作为互联网的下一代&#xff0c;正以其独特的魅力和潜力&#xff0c;引领着这场革命性的浪潮。本文旨在深入探讨Web3的概念、特点以及对未来的展望&#xff0c;为读者呈现一个全面而深入的We…

【Linux】开始了解重定向

送给大家一句话&#xff1a; 人真正的名字是&#xff1a;欲望。所以你得知道&#xff0c;消灭恐惧最有效的办法&#xff0c;就是消灭欲望。 – 史铁生 《我与地坛》 开始了解重定向 1 前言2 重定向与缓冲区2.1 文件描述符分配规则2.2 重定向的现象2.3 重定向的理解2.4 缓冲区…

【Python】探索Python中的aiohttp:构建高效并发爬虫

后来 我总算学会了 如何去爱 可惜你 早已远去 消失在人海 后来 终于在眼泪中明白 有些人 一旦错过就不再 &#x1f3b5; HouZ/杨晓雨TuTu《后来》 在数据密集和网络密集的任务中&#xff0c;提高程序的执行效率是非常重要的。Python作为一门强大的编程语言…

jmeter生成随机数的详细步骤及使用方式

Apache JMeter 是一个用于测试性能的开源工具&#xff0c;它可以模拟多种类型的负载并测量应用程序的性能。在 JMeter 中生成随机数可以通过使用预定义的函数来实现。以下是生成随机数的详细步骤及使用方式&#xff1a; 安装 JMeter&#xff1a; 首先&#xff0c;你需要在你的计…

5.6 mybatis之RowBounds分页用法

文章目录 mybatis 中&#xff0c;使用 RowBounds 进行分页&#xff0c;非常方便&#xff0c;不需要在 sql 语句中写 limit&#xff0c;即可完成分页功能。但是由于它是在 sql 查询出所有结果的基础上截取数据的&#xff0c;所以在数据量大的sql中并不适用&#xff0c;它更适合在…

【Python】OPC UA 服务器扫描工具

引言 OPC UA&#xff08;开放平台通信统一架构&#xff09;是一种跨平台的、开放的数据交换标准&#xff0c;广泛用于工业自动化领域。在工业4.0的大背景下&#xff0c;OPC UA服务器在网络中的部署日益增多&#xff0c;如何快速有效地发现这些服务器成为了一个实际需求。本文将…