JavaWeb 中的静态资源访问

文章目录

  • JavaWeb 中的静态资源访问
    • 1. Tomcat 中的两个默认 Servlet
      • JSPServlet
      • DefaultServlet
      • 配置引起的 bug
        • 情况一
        • 情况二
        • 情况三
    • 2. 总结
    • 3. 如何允许静态资源访问

JavaWeb 中的静态资源访问

1. Tomcat 中的两个默认 Servlet

Tomcat 有两个默认的 Servlet,你的 Web 项目会『无意中』用到它们。JSPServlet 和 DefaultServlet 。

JSPServlet 用于响应 .jsp 请求;DefaultServlet 则是默认的『兜底』的 Servlet 。

JSPServlet

其实 JSPServlet 并非一个,应该是整个项目有多少个 JSP 页面,就会有对应的多少个 JSPServlet 。

JSPServlet 的工作大家都很清楚了,它涉及到 .jsp 文件的工作原理。

当你第一次访问一个 .jsp 页面时,Tomcat 会根据你的 jsp 页面『帮』你写一个 Servlet,即此处的 JSPServlet 。

访问 jsp 页面最终触发的是这个 Servlet 的执行。在这个 Servlet 中会生成一个页面的内容(html格式字符串),并发回给客户端浏览器。

DefaultServlet

DefaultServlet 是 Tomcat 提供的默认的『兜底』的 Servlet,相当于它的 <urlpattern> 配置的是 /

DefaultServlet 中的 doPost 方法交由 doGet 方法进行处理。而 doGet 方法兜兜转转最后执行了一个 copy 方法,在 copy 方法中把找到静态资源文件,将其内容读出并写入 Response 对象的输出流,这样你的浏览器就看到静态数据了。

配置引起的 bug

结合我们自定义的 Servlet,和 JSPServlet、DefaultServlet,会让初学者造成一些不知所以的 bug :

情况一

将 HelloServlet 的 urlpattern 配置为 *.do,此时项目中的各个 Servlet 的分工如下:

  1. Tomcat 默认的 JSPServlet 负责响应 .jsp 请求。

  2. 我们自己的 HelloServlet 负责响应 .do 请求。

  3. 凡是没有 Servlet 响应的请求,都被『漏给』DefaultServlet 处理。

情况二

将 HelloServlet 的 urlpattern 配置为 /,此时项目中的各个 Servlet 的分工如下:

  1. Tomcat 默认 JSPServlet 负责响应 .jsp 请求。

  2. HelloServlet 负责响应所有的其它请求。

注意,你的 HelloServlet 就替代了 Tomcat 默认的 DefaultServlet 在做「兜底」的工作。

此时,你就无法访问静态资源!

除非你的 HelloServlet 实现了 Tomcat 的 DefaultServlet 同样的功能。

情况三

将 HelloServlet 的 urlpattern 配置为 /*,此时项目中的各个 Servlet 的分工如下:

所有的请求都由你的 HelloServlet 处理

/* 是路径匹配,它的优先级高于 .jsp。所以当用户输入 xxx.jsp 时,是 HelloServlet『先』响应了这个请求,轮不到 Tomcat 的 JSPServlet 来响应这个 .jsp 请求。

此时,在静态资源无法访问的基础上,jsp 也无法访问了。

2. 总结

逻辑上,用户所访问的资源分为 3 种:

  • Servlet

  • JSP

  • 静态资源(例如:html、css、js、png 等)

Tomcat 判断请求的资源的类型,也是按照上述顺序在判断:先判断是否是请求 Servlet(.do 请求),再判断是否是 JSP(.jsp 请求)。要是都不是,那么就是静态资源(.png 等请求)。

通过配置,进行合理安排,我们应该/预期达到如下效果:

  • 对于 Servlet 的请求的处理,由我们自定义的 Servlet 进行处理。

  • 对于 JSP 的请求的处理,由 Tomcat 中的 JspServlet 自动处理。

  • 对于 静态资源 的处理,由 Tomcat 中的 DefaultServlet 自动处理。

[!attention] 注意
从本质上来讲,DefaultServlet 并不是『专门』处理静态资源的工具。而是说,既不是由我们自定义的 Servlet 处理的资源,又不是由 JspServlet 处理的资源,最后统统都交由 DefaultServlet 处理。

DefaultServlet 作为『兜底』的 Servlet ,它的 url-pattern 是 / ,注意,并非 /*

毫无疑问,web.xml不需要 显示地配置 DefaultServlet(否则,它也就不会叫 Default Servlet 了)。

同样的道理,其实我们也从未在(也不需要在) web.xml 中显示地配置过 JspServlet 。

3. 如何允许静态资源访问

当要访问静态资源时,可以在 web.xml 中明确指定什么样的请求(即对静态资源的请求)交由 DefaultServlet 进行处理(逻辑上,以下配置也可以省略不写,默认既是如此):

<servlet-mapping><servlet-name>default</servlet-name> <!-- 在默认的配置中,DefaultSevlet 的 servelt-name 就是叫 default --><url-pattern>*.html</url-pattern><url-pattern>*.css</url-pattern><url-pattern>*.js</url-pattern><url-pattern>*.jpg</url-pattern><url-pattern>*.png</url-pattern>
</servlet-mapping>

注意

  • WEB-INF 目录下内容不允许直接公共访问,所以静态资源通常是放到与 WEB-INF 同级的目录下面。
  • 如果是 SpringMVC 项目,对于静态资源的访问有其他的操作。

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

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

相关文章

JavaSec 之 XXE 简单了解

文章目录 XMLReaderSAXReaderSAXBuilderDocumentBuilderUnmarshaller**SAXParserFactory**XMLReaderFactoryDigester总结 XMLReader public String XMLReader(RequestBody String content) {try {XMLReader xmlReader XMLReaderFactory.createXMLReader();// 修复&#xff1a…

Tomcat信创平替之TongWEB(东方通),安装步骤

我的系统: 银河麒麟桌面系统V10(SP1) 开局先吐槽一下(当然国产也是需要大量时间与金钱的投入),感觉国产软件进入死循环:国家推动国产→国产收费→还要钱?→用国外开源→国产无发普及→靠国家推动 正题: 1.先进入东方通申请使用 2.客服会发送一个TongWEB包与license.dat给你…

出生年(PTA团体天题练习题)巧用sprintf函数

以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个数字都不相同的…

Sora 对未来视频创作伦理的挑战和思考

Sora 对未来视频创作伦理的挑战和思考 随着人工智能技术的飞速发展&#xff0c;AI视频模型Sora的出现为视频创作带来了革命性的变革。然而&#xff0c;在技术进步的同时&#xff0c;也带来了一些伦理问题值得我们深思。 1. 真实性和虚假信息: Sora能够生成逼真的视频画面&…

值得推荐的5 款免费好用的数据恢复软件,学生党快收藏吧!

数据丢失是很多人都会遇到的问题&#xff0c;今天我带来5款免费好用的数据恢复软件推荐。 在日常生活中&#xff0c;我们经常因为误删除、格式化、清空回收站等原因丢失数据。这时&#xff0c;我们可以使用数据恢复软件来帮助我们找回丢失的数据。市面上的数据恢复软件琳琅满目…

maven3下载地址(含旧版本)

因为现有的3.8版本与IDEA不兼容&#xff0c;我需要下载3.6版本&#xff0c;但是官网的位置非常隐蔽&#xff0c;找了很多资料才看到。故记录一下。Index of /dist/maven/maven-3 选择需要的版本 选择binaries 选择zip文件下载就可以了

操作系统(1)——学习导论(Ⅰ)

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/6grrU) 学习导论什么是操作系统主要功能强调 操作系统历史硬件层面处理器重要特点and功能 存储器磁盘I/O设备小程常用的I/O设备及其特点 小程一言 本操作系统专栏&#xff0c;是小程在学操作系统的过程中的第一步&#xff…

用SpEL优雅实现Kafka中的消息被group中所有机器都消费

通常来说&#xff0c;Kafka中的一条消息在同一个消费组&#xff08;group&#xff09;中只能被一个消费者消费&#xff0c;这种场景在应用端集群部署的时候非常适用。 还有一种业务场景&#xff0c;需要让每台机器都消费topic中的消息。例如本地缓存的场景&#xff0c;在应用集…

go interface{} 和string的转换问题

1.遇到的问题 问题来源于,我sql模版拼接遇到的问题。 首先&#xff0c;这样是没有问题的。 var qhx interface{} "qhx"s : qhx.(string)fmt.Println(s) 但是当我在这段代码里用的时候:1.类型断言 var sqlStr "select * from tx_user where username %s"…

关于LeetCode中第三题的最长子串

题目是这样子的 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 这道题主要使用到的思路是滑动窗口&#xff0c;每当我们选择一个字符作为查询的开始之后&#xff0c;每次搜到的子串都要判断是否存在重复的字符&#xff0c;如果存在&#xff0c…

【自然语言处理】:实验4答案,预训练语言模型实现与应用

代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主&#xff0c;接实验技术指导1对1 实验要求布置请看http://t.csdnimg.cn/1sh7s 运行模型&#xff0c;测试模型在有 100%…

真Unity3D编辑器Editor二次开发

IMGUI Editor Label 改变颜色 分享一个很神奇的颜色 一开始这么写&#xff0c;以为不行的&#xff0c; private void OnGUI()(){GUILayout.Label("<colorred>name:</color>ffdasilufoi");//。。。。 } 结果这么写又好了&#xff0c; private GUIStyle m…

python播放PCM 音频文件

python播放PCM 音频文件 一&#xff1a;pyaudio安装二&#xff1a;Python播放PCM音频文件 一&#xff1a;pyaudio安装 CtrlR输入cmd打开控制台执行如下命令 pip install PyAudio二&#xff1a;Python播放PCM音频文件 import pyaudio# 初始化播放器 p pyaudio.PyAudio() str…

基于qt的图书管理系统----03核心界面设计

参考b站&#xff1a;视频连接 源码github&#xff1a;github 目录 1 添加软件图标2 打包程序3 三个管理界面设计4 代码编写4.1 加载界面4.2 点击按钮切换界面4.3 组团添加样式4.4 搭建表头4.5 表格相关操作 从别人那里下载的项目会有这个文件&#xff0c;里边是别人配置的路径…

Java核心-核心类与API(2)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;这次介绍StringBuffer/StringBuilder/StringJoiner类。StringBuffer和StringBuilder是我们学习的重点&#xff0c;建议对比学习&#xff0c;做好区分。 一、StringBuffer类 1、概述 1&#xff09;问题 由于 String 类…

直接插入排序+希尔排序+冒泡排序+快速排序+选择排序+堆排序+归并排序+基于统计的排序

插入排序&#xff1a;直接插入排序、希尔排序 交换排序&#xff1a;冒泡排序、快速排序 选择排序&#xff1a;简单选择排序、堆排序 其他&#xff1a;归并排序、基于统计的排序 一、直接插入排序 #include<stdio.h> #include<stdlib.h> /* 直接插入排序&#…

flet 音乐播放组件 audio的几点注意的地方

最近做一个flet的播放器&#xff0c;遇到很多坑。这里记录一下。 audio, 要使用的话&#xff0c;必须放在page.overlay里面才能播放。 audio1 Audio(srcf"{tracks_list[i]}", autoplayFalse)page.overlay.append(audio1)page.update() #更新overlay的内容audio1.p…

Apache Calcite 动态数据管理框架入门介绍

原文地址&#xff1a; Apache Calcite 动态数据管理框架介绍 背景 随着数据规模的不断增长和数据源的多样化&#xff0c;开发人员需要面对各种挑战&#xff0c;如何高效地管理、查询和分析海量数据成为了一个迫切的问题。 在这样的背景下&#xff0c;出现了许多优秀的开源组…

RSA加密原理

2024.2.23 密钥对的生成过程 1、随机找两个质数 P 和 Q &#xff0c;P 与 Q 越大&#xff0c;越安全 本例取 P 67 &#xff0c;Q 71 计算他们的乘积 N P * Q 4757 转化为二进为 1001010010101&#xff0c;该加密算法即为 13 位&#xff0c;实际使用中的算法是往往是 …

前瞻性规划:解决数据中心机房通用性问题

随着技术的快速发展&#xff0c;数据中心机房的建设面临着不断变化的挑战。在机房规划和设计阶段&#xff0c;缺乏对用户需求的深入分析和对未来发展趋势的考量&#xff0c;往往会导致机房通用性不足&#xff0c;从而影响其长期使用效率和稳定性。本文将探讨数据中心机房建设中…