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 的分工如下:
-
Tomcat 默认的 JSPServlet 负责响应
.jsp请求。 -
我们自己的 HelloServlet 负责响应
.do请求。 -
凡是没有 Servlet 响应的请求,都被『漏给』DefaultServlet 处理。
情况二
将 HelloServlet 的 urlpattern 配置为 /,此时项目中的各个 Servlet 的分工如下:
-
Tomcat 默认 JSPServlet 负责响应
.jsp请求。 -
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 项目,对于静态资源的访问有其他的操作。
相关文章:
JavaWeb 中的静态资源访问
文章目录 JavaWeb 中的静态资源访问1. Tomcat 中的两个默认 ServletJSPServletDefaultServlet配置引起的 bug情况一情况二情况三 2. 总结3. 如何允许静态资源访问 JavaWeb 中的静态资源访问 1. Tomcat 中的两个默认 Servlet Tomcat 有两个默认的 Servlet,你的 Web…...
asp.net web api 用户身份验证
前后端分离的开发中,应用服务需要进行用户身份的验证才允许访问数据。实现的方法很简单。创建一个webapi项目。在App_Start目录下找到WebApiConfig.cs, 在里面增加一个实现类。 public static class WebApiConfig{public static void Register(HttpConfi…...
3DTile是不是没有坐标的选择?
可参考以下内容: 一、坐标参考系统(CRS) 3D Tiles 使用右手笛卡尔坐标系;也就是说,x和y的叉积产生z。3D Tiles 将z轴定义为局部笛卡尔坐标系的向上。tileset的全局坐标系通常位于WGS 84地心固定(ECEF)参考系(EPSG4978)中,但它不是必须的&am…...
数据采集三防平板丨三防平板电脑丨停车场应用
随着现代科技的不断发展,三防平板已经成为许多人工作和生活的必备工具。在停车场这个场景中,三防平板的应用可以大大提高停车场管理的效率和安全性。 停车场是现代城市交通管理的重要组成部分,它直接关系到城市交通的流畅和公共安全。停车场…...
解决git push时的too_many_commits提示
解决git push时的too_many_commits提示 提示内容 push时报错如下: Sorry, you were trying to upload xxxxxx commits in one push 原因分析 这个应该是因为在提交规则里配置了 一次只允许提交一个 commit,这样当 icode 上有 commit 没有合入时&…...
GPT-4助力我们突破思维定势
GPT-4在突破思维局限、激发灵感和促进知识交叉融合方面的作用不可小觑,它正逐渐成为一种有力的工具,助力各行业和研究领域的创新与发展。 GPT-4在突破传统思维模式、拓宽创新视野和促进跨学科知识融合方面扮演着越来越重要的角色: 突破思维…...
【前端工程化面试题】什么是 CI/CD
CI/CD 是软件开发中的两个重要实践,分别代表持续集成(Continuous Integration)和持续交付/持续部署(Continuous Delivery/Continuous Deployment)。 持续集成 (Continuous Integration, CI):持续集成是一种…...
kafka的安装,用于数据库同步数据
1.0 背景调研 因业务需求,需要查询其他部门的数据库数据,不方便直连数据库,所以要定时将他们的数据同步到我们的环境中,技术选型选中了kafkaCDC Kafka是Apache旗下的一款分布式流媒体平台,Kafka是一种高吞吐量、持久…...
Bean 的作用域你知道么 ?
Bean 的作用域有哪些? 所谓的作用域,其实就是说这个东西在哪个范围内可以被使用 , 如我们定义类的成员变量的时候使用的public,private等这些也是作用域的概念 Spring的Bean的作用域, 描述的就是这个Bean在哪个范围内可以被使用. 不同的作用域决定了Bean的创建, 管理和销毁的…...
Windows 使设置更改立即生效——并行发送广播消息
目录 前言 1 遍历窗口句柄列表 2 使用 SendMessageTimeout 发送延时消息 3 并行发送消息实现模拟广播消息 4 修改 UIPI 消息过滤器设置 5 托盘图标刷新的处理 6 完整代码和测试 本文属于原创文章,转载请注明出处: https://blog.csdn.net/qq_5907…...
PostgreSQL使用session_exec和file_fdw实现失败次数锁定用户策略
使用session_exec 、file_fdw以及自定义函数实现该功能。 缺陷:实测发现锁用户后,进去解锁特定用户。只能允许一次登陆,应该再次登陆的时候,触发函数,把之前的日志里的错误登陆的信息也计算到登录次数里了。而且foreig…...
Jmeter实现阶梯式线程增加的压测
安装相应jmeter 插件 1:安装jmeter 管理插件: 下载地址:https://jmeter-plugins.org/install/Install/,将下载下来的jar包放到jmeter文件夹下的lib/ext路径下,然后重启jmeter。 2:接着打开 选项-Plugins Ma…...
Linux----防火墙之保存规则
一、关于iptables规则的保存 之前写的iptables的设置,但是都是临时生效的,一旦电脑重启,那么就会失效,如何永久保存,需要借助iptables-save命令,开机生效需要借助iptables-restore命令,并写入规…...
spring-orm:6 HibernateJpaVendorAdapter源码解析
版本 spring-orm:6.1.3 源码 org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter public class HibernateJpaVendorAdapter extends AbstractJpaVendorAdapter {// 旧版本Hibernate的方言类是否存在标识private static final boolean oldDialectsPresent Clas…...
php捕获Fatal error错误与异常处理
在php5的版本中,如果出现致命错误是无法被 try {} catch 捕获的,如下所示: <?phperror_reporting(E_ALL); ini_set(display_errors, on);try {hello(); } catch (\Exception $e) {echo $e->getMessage(); } 运行脚本,最终…...
PyCharm 调试过程中控制台 (Console) 窗口内运行命令 - 实时获取中间状态
PyCharm 调试过程中控制台 [Console] 窗口内运行命令 - 实时获取中间状态 1. yongqiang.py2. Debugger -> Console3. Show Python PromptReferences 1. yongqiang.py #!/usr/bin/env python # -*- coding: utf-8 -*- # yongqiang chengfrom __future__ import absolute_imp…...
MacBook Pro如何安装rust编程环境
安装过程分为以下几步: 1. 安装Homebrew。Homebrew是一个流行的MacOS的包管理器,可用于方便地安装各种软件。打开终端,运行以下命令: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD…...
SparkUI任务启动参数介绍(148个参数)
文章目录 SparkUI任务启动参数介绍(148个参数)1 spark.app.id: Spark 应用程序的唯一标识符。2 spark.app.initial.jar.urls: Spark 应用程序的初始 Jar 包的 URL。3 spark.app.name: Spark 应用程序的名称。4 spark.app.startTime: Spark 应用程序的启动…...
nginx 安装
Nginx 简介 nginx一种十分轻量级的http服务器一种高性能的HTTP和反向代理服务器,同时是一个IMAP/POP3/SMTP 代理服务器其中官网网站 安装Nginx 使用源码编辑安装 #提前安装相关工具软件包 yum -y install net-tools tar unzip gcc make pcre-devel openssl-devel httpd-too…...
手撕扩散模型(一)| 训练部分——前向扩散,反向预测代码全解析
文章目录 1 直接使用 核心代码2 工程代码实现2.1 DDPM2.2 训练 三大模型VAE,GAN, DIffusion扩散模型 是生成界的重要模型,但是最近一段时间扩散模型被用到的越来越多的,最近爆火的OpenAI的 Sora文生视频模型其实也是用了这种的方…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
作为点的对象CenterNet论文阅读
摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表,并对每一个位置进行分类。这种做法既浪费又低效,并且需要额外的后处理。在本文中,我们采取了不同的方法。我们将物体建模为单…...
学习 Hooks【Plan - June - Week 2】
一、React API React 提供了丰富的核心 API,用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素,JSX 会被编译成该函数…...
