servlet 返回可访问文件_Servlet第二篇「Servlet细节、ServletConfig、ServletContext」
Servlet的调用图
前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解
Servlet的细节
一个已经注册的Servlet可以被多次映射
同一个Servlet可以被映射到多个URL上。
无论我访问的是http://localhost:8080/Demo1还是http://localhost:8080/ouzicheng。我访问的都是Demo1。
Servlet映射的URL可以使用通配符
通配符有两种格式:
- *.扩展名
- 正斜杠(/)开头并以“/*”结尾。
匹配所有
匹配扩展名为.jsp的
如果.扩展名和正斜杠(/)开头并以“/”结尾两种通配符同时出现,匹配的是哪一个呢?
- 看谁的匹配度高,谁就被选择
- *.扩展名的优先级最低
Servlet映射的URL可以使用通配符和Servlet可以被映射到多个URL上的作用:
- 隐藏网站是用什么编程语言写的【.php,.net,.asp实际上访问的都是同一个资源】
- 用特定的后缀声明版权【公司缩写】
Servlet是单例的
为什么Servlet是单例的
浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。
每次访问请求对象和响应对象都是新的
对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
线程安全问题
当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。
原则:
- 如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}
- 如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题
load-on-startup
如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
作用:
- 为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据
- 完成一些定时的任务【定时写日志,定时备份数据】
在web访问任何资源都是在访问Servlet
当你启动Tomcat,你在网址上输入http://localhost:8080。为什么会出现Tomcat小猫的页面?
这是由缺省Servlet为你服务的!
- 我们先看一下web.xml文件中的配置,web.xml文件配置了一个缺省Servlet
- 什么叫做缺省Servlet?凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求
- 既然我说了在web访问任何资源都是在访问Servlet,那么我访问静态资源【本地图片,本地HTML文件】也是在访问这个缺省Servlet【DefaultServlet】
- 证实一下:当我没有手工配置缺省Servlet的时候,访问本地图片是可以访问得到的
- 现在我自己配置一个缺省Servlet,Demo1就是我手工配置的缺省Servlet,覆盖掉web.xml配置的缺省Servlet
- 下面我继续访问一下刚才的图片,此时输出的是Demo1这个Servlet写上的内容了
- 总结:无论在web中访问什么资源【包括JSP】,都是在访问Servlet。没有手工配置缺省Servlet的时候,你访问静态图片,静态网页,缺省Servlet会在你web站点中寻找该图片或网页,如果有就返回给浏览器,没有就报404错误
ServletConfig对象
ServletConfig对象有什么用?
通过此对象可以读取web.xml中配置的初始化参数。
现在问题来了,为什么我们要把参数信息放到web.xml文件中呢?我们可以直接在程序中都可以定义参数信息,搞到web.xml文件中又有什么好处呢?
好处就是:能够让你的程序更加灵活【更换需求,更改配置文件web.xml即可,程序代码不用改】
获取web.xml文件配置的参数信息
- 为Demo1这个Servlet配置一个参数,参数名是name,值是zhongfucheng
在Servlet中获取ServletConfig对象,通过ServletConfig对象获取在web.xml文件配置的参数
ServletContext对象
什么是ServletContext对象?
当Tomcat启动的时候,就会创建一个ServletContext对象。它代表着当前web站点
ServletContext有什么用?
- ServletContext既然代表着当前web站点,那么所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。
- ServletConfig获取的是配置的是单个Servlet的参数信息,ServletContext可以获取的是配置整个web站点的参数信息
- 利用ServletContext读取web站点的资源文件
- 实现Servlet的转发【用ServletContext转发不多,主要用request转发】
Servlet之间实现通讯
ServletContext对象可以被称之为域对象
到这里可能有一个疑问,域对象是什么呢?其实域对象可以简单理解成一个容器【类似于Map集合】
实现Servlet之间通讯就要用到ServletContext的setAttribute(String name,Object obj)方法, 第一个参数是关键字,第二个参数是你要存储的对象
- 这是Demo2的代码
- 这是Demo3的代码
- 访问Demo3可以获取Demo2存储的信息,从而实现多个Servlet之间通讯
获取web站点配置的信息
如果我想要让所有的Servlet都能够获取到连接数据库的信息,不可能在web.xml文件中每个Servlet中都配置一下,这样代码量太大了!并且会显得非常啰嗦冗余。
- web.xml文件支持对整个站点进行配置参数信息【所有Servlet都可以取到该参数信息】
- Demo4代码
- 试一下Demo3是否能拿到,相同的代码
读取资源文件
第一种方式:
- 现在我要通过Servlet111读取1.png图片
- 按我们以前的方式,代码应该是这样的。
- 当我们访问的时候,却出错了!说找不到1.png文件
- 这是为什么呢?我们以前读取文件的时候,如果程序和文件在同一包名,可以直接通过文件名称获取得到的!,原因很简单,以前我们写的程序都是通过JVM来运行的,而现在,我们是通过Tomcat来运行的
- 根据web的目录规范,Servlet编译后的class文件是存放在WEB-INFclasses文件夹中的
- 看到这里,我们知道了要进入classes目录中读取文件,所以我们将代码改成以下方式
- 再去读取时,就发现可以获取到文件了。
- 但是现在问题又来了,我读取文件的时候都要写上绝对路径,这样太不灵活了。试想一下,如果我将该读取文件的模块移到其他的web站点上,我的代码就又要修改了【因为web站点的名字不一样】。
- 我们通过ServletContext读取就可以避免修改代码的情况,因为ServletContext对象是根据当前web站点而生成的
- 代码如下所示:
第二种方式:
- 如果我的文件放在web目录下,那么就简单得多了!,直接通过文件名称就能获取
- 代码如下所示
第三种方式:
通过类装载器读取资源文件。
- 我的文件放在了src目录下【也叫做类目录】
- 代码如下所示
- 我的文件放在了src目录下的包下
- 代码如下,添加包名路径即可。
原则:如果文件太大,就不能用类装载器的方式去读取,会导致内存溢出
原文地址:https://dwz.cn/cQtQEKw2作者: Java3y
servlet 返回可访问文件_Servlet第二篇「Servlet细节、ServletConfig、ServletContext」相关推荐
- servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上)
我们在开发中无时无刻都在与Servlet进行接触,只是因为框架的封装性,我们很少直接地去操作servlet,但再怎么封装,基本的思路都不会变化,变得只是实现的方式, Servlet是什么: 网上的回答 ...
- servlet 返回可访问文件_Windows 10 可直接访问 Linux 文件
Windows.Linux虽然看似两套对立的系统,但也一直在努力尝试互通,比如微软这边,Windows 10此前就增加了WSL Linux子系统,接下来还会持续改进.升级. 从Windows 10 v ...
- 初学Python——文件操作第二篇
前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...
- Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】
Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...
- servlet post 返回值是一个对象_Servlet第二天
学习主题:Servlet 学习目标: 1 掌握Servlet重要对象request的使用 2 掌握Servlet重要对象response的使用 3 掌握如何解决乱码问题 4 掌握请求转发和重定向 5. ...
- linux系统读取第二个盘的数据,磁盘及文件系统管理—第二篇
挂载配置文件 每行定义一个要挂载的文件系统及相关属性 使用mount -a挂载/etc/fstab文件中所定义的文件系统 配置文件格式: 一共分为6个字段: 1.要挂载的设备:指定挂载设备 可指定设备 ...
- 2019年最新十篇「深度学习领域综述」论文
点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 了解当下,方能向前. 1.A guide to deep learning in he ...
- 该文件可能是只读的 或者您要访问的位置_Linux应用编程之文件操作 系统调用篇(下)...
关注.星标公众号,直达精彩内容 ID:嵌入式情报局 作者:情报小哥 1文件操作实战 上篇文章跟大家介绍了Linux系统调用的文件操作API函数,其实跟C语言中的文件读取操作差不多,所以今天小哥就利用那 ...
- C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)的解决方法
C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)的解决方法 参考文章: (1)C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文 ...
最新文章
- 如何将广告始终定位到网页右下角
- RDKit | 基于最大公共子结构(MCS)的分子比对
- [蓝桥杯][算法提高VIP]摆花-多重背包计数问题
- 在Spring boot 配置过滤器(filter)
- ThreadLocal的练习代码
- Pytorch 中 matmul 广播
- linux主从库配置文件,Linux系统中MongoDB安装及主从配置linux操作系统 -电脑资料
- DNG格式转换器:​Adobe DNG Converter for Mac支持m1中文版
- 《人工智能:一种现代的方法》笔记(一)
- 了解下HTML5大前端是什么
- Ingress暴露服务的方式
- hackintosh技巧
- 1058:求一元二次方程
- 互联网医院软件|互联网医院系统开发|在线问诊提高医疗效率
- 摸个鱼的功夫,就学会了MySQL的DATE_FORMAT函数
- windows计算机锁屏的快捷键是什么,win10锁屏快捷键是什么_win10怎么使用快捷键锁屏...
- 超级好用的编辑器UltraEdit
- Redis面试题 70道
- Lifecycle, LifecycleOwner, LifecycleObserver类讲解
- 太原师范学院C语言真题,单片机KeilC语言应用研究-太原师范学院.doc
热门文章
- linux 切换pip路径_【Python基础】PIP 镜像源配置轻松搞定
- 永中office属于职称计算机吗,2017职称计算机考试WPS_Office检测练习及答案13-中华考试网...
- 从入门到入土:Python爬虫学习|实例练手|详细讲解|爬取腾讯招聘网|一步一步分析|异步加载|初级难度反扒处理|寻找消失的API来找工作吧
- 字节跳动辟谣“出售AI技术”和“成立打车项目”;GitHub 因代码版权问题遭抵制;贝佐斯正式卸任亚马逊 CEO|极客头条...
- 为什么 Deno 没有众望所归?超越 Node.js 还要做些什么?
- 库克考虑卸任苹果CEO,谁会是下一任接班人?
- 小霸王被申请破产重整;虎牙员工自曝被HR抬出公司;Office 2010被微软终止服务|极客头条
- 72000 Star 下载工具被 GitHub 下架,背后的数字千年版权法案是什么?
- 微软与 OpenAI 达成合作,获得 GPT-3 独家使用授权!
- 进击的小程序:品牌自营GMV同比增长210%,这些行业增速最快……