javaWeb项目之Servlet学习笔记----ServletContext的读取方法

ServletContext ------- ServletContext的getServletContext()获取ServletContext对象 研究javax.servlet.ServletContext接口 1、javax.servlet.ServletContext是一个接口 2、javax.servlet.ServletContext是Servlet规范中的一员 3、apache Tomcat 服务器对ServletContext接口的实现类完整类名: org.apache.catalina... 阅读详情

 

https://www.cnblogs.com/fjdingsd/p/4846727.html

ServletContext类中有这么四个方法:

  getRealPath(String path)

  getResource(String path)

  getResourceAsStream(String path)

  getResourcePaths(String path)

  这四个方法都使用web工程下某个web资源路径的字符串表现形式作为参数,而每个方法返回不同的类型,我们通过这四个方法之一可以获取某个资源,并对其进行读取和修改操作。

 

假设我们的【myservlet】web工程中有一个数据库的配置文件:database.properties,在这个数据库中已经有了一些参数,而我们在web工程中希望读取这个配置文件中的有关信息:

  

  getResourceAsStream(String path) 

 先来看看ServletContext中的getResourceAsStream()方法,这个方法返回InputStream对象。由于我们的配置文件为properties文件,所以可以用Properties对象来装载这个输入流,代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        InputStream in = context.getResourceAsStream("/database.properties");
        
        Properties prop = new Properties();
        prop.load(in);
        
        String url = prop.getProperty("url");
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        System.out.println(url);
        System.out.println(username);
        System.out.println(password);
    }

getRealPath() 

接下来看看ServletContext中的getRealPath()方法,这个方法返回String对象。由于我们的配置文件为properties文件,所以可以用Properties对象来装载这个输入流,代码如下:

ServletContext context = this.getServletContext();
        String filePath = context.getRealPath("/database.properties");
        
        FileInputStream fis = new FileInputStream(filePath);
        Properties prop = new Properties();
        prop.load(fis);
        
        String url = prop.getProperty("url");
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        System.out.println(url);
        System.out.println(username);
        System.out.println(password);

使用getRealPath()方法的好处在于这个方法还可以获取文件名,而getResourceAsStream()方法就只能获取文件流了。例如获取文件名:

ServletContext context = this.getServletContext();
        String filePath = context.getRealPath("/WEB-INF/web.xml");
        System.out.println(filePath);
        
        if(filePath == null) {
            System.out.println("所找文件不存在!");
        }
        String fileName = filePath.substring(filePath.lastIndexOf("\\"));
        System.out.println("文件为:"+fileName);

getResource()

 

接着来看看ServletContext中的getResource()方法,这个方法返回URL对象。而URL对象具有打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream的openStream()方法。由于我们的配置文件为properties文件,所以可以用Properties对象来装载这个输入流,代码如下:

 

 1      ServletContext context = this.getServletContext();
 2         URL fileUrl = context.getResource("/database.properties");
 3         InputStream in = fileUrl.openStream();
 4         
 5         Properties prop = new Properties();
 6         prop.load(in);
 7         
 8         String url = prop.getProperty("url");
 9         String username = prop.getProperty("username");
10         String password = prop.getProperty("password");
11         System.out.println(url);
12         System.out.println(username);
13         System.out.println(password);

 

最后在浏览器中访问这个Servlet,那么在MyEclipse的控制台上能看到的数据正好是database.properties中我们配置的信息:

 

以上说完了几种通过ServletContext对象来读取web应用下的某个资源文件,只要通过读取的方法,并将资源相对于web工程的路径作为参数传入其中便可。我们上述的例子都是直接在web工程中,或者web工程的某个目录下,而如果我们把某个web资源放置在MyEclipse中的【src】目录中,那么该如何读取呢:

  

  我们说过,这个web应用在发布时,会将【src】目录下的.java文件编译成为.class字节码文件,由服务器自动将这些字节码文件放置在该web应用中的【WEB-INF】下的【classes】目录里,如果没有【classes】目录,服务器会自动帮我们创建,因此,只要是放置在【src】目录中的资源,最后也会被服务器自动放置在【classes】目录中,这样我们可以继续通过ServletContext对象来获取:

ServletContext context = this.getServletContext();
        InputStream in = context.getResourceAsStream("/WEB-INF/classes/database.properties");
        
        Properties prop = new Properties();
        prop.load(in);
        
        String url = prop.getProperty("url");
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        System.out.println(url);
        System.out.println(username);
        System.out.println(password);

 

关于web工程下某个web资源在不同位置下的问题:

 

  问题一:我们为什么不能用传统方式,如FileInputStream或者File对象来直接获取web工程中的资源呢?其实也是可以的,但是有个路径的问题,Servlet中方法所需要的路径都是相对于web应用的路径,而传统的FileInputStream等等中方法所需的路径参数都是相对于虚拟机的路径。而又因为我这个web应用是从MyEclipse中的Tomcat里启动的,所以这时候的虚拟机目录其实是Tomcat中的【bin】目录。所以如果想用传统方式读取文件必须每次都将文件放置在Tomcat的【bin】目录下, 这是多么麻烦的事,因此我们开发web工程就应该使用web工程中的方法来读取文件!但是,这却又引出了问题二。。。

  问题二:当我们web工程中有别的非Servlet的类时,比如JavaBean,当JavaBean需要连接数据库时,这就是非Servlet对象读取web工程中的资源文件了,不能用ServletContext来读取,问题一种也说过不能用传统方式如FileInputStream来读取,那么该如何读取呢?

  答案是:类加载器!关于类加载器的学习请好好查阅相关文章,也是很重要的。由于在【src】目录下的Java程序经过编译成字节码class文件,如果要用到这些类,Java虚拟机需要先将这些字节码文件加载到内存中才可以使用,而这个过程就是由类加载器来完成。因此这就有一个知识点,如果我们将某个web资源放置在【src】目录下,因为这是个web工程,服务器会自动将各个字节码文件重新放置在【classes】目录下, 而这个web资源也会重新被服务器放置在【classes】目录下,那么类加载器能加载【classes】目录下所有的字节码文件,同时,同处在这个目录下的web资源也会被类加载器加载进内存,这时我们就可以使用类加载器读取该web资源了。

  例:在【myservlet】的dao包中创建一个Student的JavaBean对象,并在src【目录下】创建一个student的配置文件student.properties,而这个配置文件内容如下图所示:

  

在Student类中,我们需要通过类加载器来获取输入流来读取这个文件:

public class Student {    
    public void getStudent() throws IOException {
        ClassLoader loader = Student.class.getClassLoader();
        InputStream in = loader.getResourceAsStream("student.properties");
        
        Properties prop = new Properties();
        prop.load(in);
        
        String studentName = prop.getProperty("name");
        String studentAge = prop.getProperty("age");
        System.out.println(studentName+":"+studentAge);
    }
}

另外创建一个Servlet作为可以供浏览器访问的对象,在该Servlet中创建Student的示例来获取配置文件中的内容,这样就达到了从非Servlet对象读取web资源内容并向Servlet对象传递数据:

public class ServletDemo3 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Student student = new Student();
        student.getStudent();
    }
}

注意,这种方法只能是web资源放置在【src】目录中才可以使用,如果要读取的web资源是放置在web工程的目录下,使用类加载器也还是无法读取,因为类加载器只能读取类目录下的文件,这时候非Servlet类就无法读取资源文件,只能使用ServletContext来读取了。

  方立勋老师说:“类加载器只能加载【classes】目录下的所有文件一次,这样在服务器运行web工程的过程中,如果我们修改【classes】目录下的student.properties配置文件,则由于类加载器不再加载,因此使用类加载器的方式不能读取修改后的内容”

但是我修改后,还是可以使用类加载器的方式读取classes】目录下修改后的student.properties配置文件,难道是因为JDK7的原因吗?

  不过不管是什么原因,方立勋老师针对他的问题所采取的解决方案还是值得学习的,他采用先用类加载器获取该配置文件的路径,然后再采用传统方式获取这个文件的输入流。所以在Student中的getStudent()方法代码改为:

public class Student {    
    public void getStudent() throws IOException {
        ClassLoader loader = Student.class.getClassLoader();
        URL fileUrl = loader.getResource("student.properties");
        String filePath = fileUrl.getPath();

        FileInputStream fis = new FileInputStream(filePath);
        Properties prop = new Properties();
        prop.load(fis);
        
        String studentName = prop.getProperty("name");
        String studentAge = prop.getProperty("age");
        System.out.println(studentName+":"+studentAge);    
}
}

 

 

JavaWeb——Servlet(全网最详细教程) JavaWeb技术之Servlet 阅读详情

相关推荐

用ServletContext对象读取javaweb项目的资源文件

文章目录一、项目结构二、dbinfo.properties三、ServletDb.java四、部署项目,访问浏览器五、运行结果 一、项目结构 二、dbinfo.properties #数据库 url=jdbc:mysql://localhost:3306 #用户名 username=username1 #密码 password=passworde1 三、ServletDb.java packa...

龟的小号的博客 661

Servlet中的getServletContext()方法详解

     这两天刚刚学到这个类,看了视频,翻了书,我觉得还是比较乱,javaee里面的jdk也写的比较乱,所以今天有时间整理一下吧: 其实我觉得还是从下面这段话先来解释吧: public class ServletContext01 extends HttpServlet {     protected void doGet(HttpServletRequest request, HttpS...

凡心所向,素履所往,生如逆旅,一苇以航 6万+

javaWeb(四)Servlet简介及其实现、ServletContext类的三个应用、ServletContext记录用户登陆次数

1、Servlet简介及其实现: servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。 实现步骤: Myeclipse新建一个Web project 新建Servlet的文件 新建一个类, 实现Servlet接口(这里通常是继承已经实现了相关接口的父类Htt...

PizAn的博客 1357

getServletContext()

getServletContext() 一个servlet可以使用getServletContext()方法得到web应用的servletContext 即而使用getServletContext的一些方法来获得一些值getServletContext.getAttribute(); ...

weixin_44940145的博客 2486

服务器被攻击植入挖矿病毒,CPU占用高问题排查处理(.systemd-service.sh)

客户服务器遭攻击,部署的应用服务经常性被停止,服务器CPU占用居高不下,top查看如下: 可以看到第一个bash任务,占用cpu近400%,非正常的应用程序和脚本任务,多半是被植入了木马信息。 查看该进程的符号连接,发现已经是被删除的状态 /usr/bin/-bash (deleted),无法查看其启动程序的信息 查看定时任务:cat /etc/crontab,发现都是正常的应用程序定时脚本 又用 crontab -l 查看了一下,发现了异常定时任务如下,同top里的异常任务一致...

gottst0113的博客 2120

Vivado实战:UltraScale/UltraScale+器件eFUSE寄存器配置与安全编程全解析

本文详细解析了Xilinx UltraScale/UltraScale+器件中eFUSE寄存器的配置与安全编程方法。从芯片唯一身份标识到加密密钥烧录,再到用户寄存器的灵活应用和安全控制寄存器的配置技巧,全面介绍了如何利用eFUSE功能提升硬件安全性。文章还提供了JTAG接口安全管理和NKZ文件备份方案,帮助开发者避免常见陷阱,确保安全编程的可靠性。

weixin_42535703的博客 428

ServletContext

ServletContext

墨染的博客 1111

保姆级教程:用TI IWR6843雷达板跑通3D人体追踪demo(附CCS/UniFlash避坑指南)

本文提供了一份详尽的TI IWR6843毫米波雷达开发板3D人体追踪demo实现指南,涵盖开发环境搭建、工程导入编译、固件烧录及可视化工具配置全流程。特别针对CCS和UniFlash使用中的常见问题给出解决方案,帮助开发者快速掌握3D People Tracking技术应用。

weixin_29159441的博客 503

getServletContext()方法使用指南

1、getServletContext()方法代码片段 public class ServletContext01 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取对象 ServletContext context = get

Arther666的博客 1万+

java实现自动发送微信QQ消息(可发图片)

自动发送微信/QQ/微博等消息 一:功能:实现发送QQ/微信/微博消息,程序控制。 效果演示(实现自动发生QQ微信消息给女友,发微博信息也可以就不演示了) 二:原理讲解:将剪贴板的内容给发送到QQ微信中去,复制粘贴发送。 模拟真实操作进行发送信息。 三:前期准备,软件安装,及初步测试。...

XURUNFA950827的博客 1万+

OmniDrive(3):逐行代码详解

模型效果: 端到端联合规划与推理 接下来,简单介绍下训练的配置 1.1 模型配置 模型基于sparse query based的3D Bev感知框架StreamPetr ,用query来编码动态目标(如车辆、行人)和静态地图元素(如车道线)。(1) tran、test和val数据配置 指定真值的文件路径: ann_file 指定输出处理的pipeline: 训练使用, test 和val使用 指定是否需要时序训练seq_mode (2)数据处理pipeline 自定义的Dataset 通过类实现,训

@bangbang的博客 719

JavaWeb开发(五)Servlet-ServletContext

在Serv1et中如果当前的web资源不想处理请求时,可以通过forward方将当前的请求传递给其它的Web资源处理,这种方式称为请求转发。(1)请求转发的相关方法:RequestDispatcher对象,可以通过request.getRequestDispatcher()方法获取调用这个对象的foward方法就可以实现请求转发。

qq_36158551的博客 1569

pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图

博主基于https://github.com/hpc203/GroundingDINO-onnxrun项目分享的onnx c++推理代码,修改为GroundingDINO模型的tensorrt推理代码。对于600x400的输入,在3060显卡下,cuda 12.1,TensorRT-10.4.0,window环境下53ms处理完一张图片。

a486259的博客 1220

JavaWeb学习笔记8 —— ServletContext常用方法(setAttribute、getAttribute、getInitParameter等)

web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用; 主要方法: ```java ServletContext context = this.getServletContext(); ``` ## 1、共享数据 用到的主要方法: ```java //设置 context.setAttribute("参数名",参数值(可以是变量名)); //获取 context.getAttribute("参数名"); ``` 在这个Servlet中保

影龙武的博客qq_43594119 4287

第七篇:A133 Android 10 触摸提示音过大

描述: 开启触摸提示音功能之后,客户反馈触摸提示音过大,需要改小。 解决方案: 看代码注释,在framework下搜索方法即可。 /** @see AudioManager#playSoundEffect(int) */ public void playSoundEffect(int effectType) { playSoundEffectVolume(effectType, -1.0f); } /** @see AudioManager#playSoundEff

qq_33088619的博客 1696

查找【优快云】- 人工客服

【代码】查找【优快云】- 人工客服。

👨‍💻 前端开发者 | 技术分享者 1401

02、javaweb--使用IDEA+Maven创建Servlet项目

使用servletContext共享数据:当前应用的所有servlet可以拿到保存着servletcontext中的数据;由于远程仓库获取文件较多,网速较慢,可以添加一个参数,只获取原型中的内部核心文件,提升加载速度;2.选择maven,勾选“Create from archetype",表明选择从远程仓库中的获取原型模板进行创建;添加新的项目子模块:右击项目的“new -> module",选择添加模板webapp并进行配置;重置工程目录:删除src文件夹,因为会将需求的新建项目作为工程主模块;

weixin_50811484的博客 2715

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JavaWeb(五)——Servlet、Mapping问题、ServletContext

1. Servlet 简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个类,实现Servlet接口 把开发好的Java类部署到web服务器中 把实现了Servlet接口的Java程序叫做 Servlet 2. HelloServlet Serlvet接...

吃饭了吗 706

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JavaWeb ——servlet学习3之ServletContext

JavaWeb ——servlet学习3之ServletContext 每个web工程都只有一个ServletContext对象。 说白了也就是不管在哪个servlet里面,获取到的这个类的对象都是同一个。 作用: 获取全局配置参数 获取web工程中的资源 存取数据,servlet间共享数据 域对象 获取全局配置参数: <context-param&gt...

子敬的技术博客 293

JavaWeb学习(五)---ServletContext对象/通过servletContext对象读取配置文件

JavaWeb学习(五)—ServletContext对象/通过servletContext对象读取配置文件 01 ServletContext对象 WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的`ServletContext`对象,它代表当前web应用。一个WEB应用中的所有`Servlet`共享同一个`ServletContext`对象,`Servlet`对象之间可以通过`Ser...

DOGIOOH的博客 662

JavaWeb笔记——Servlet基础、ServletContext

JavaWeb笔记——Servlet基础、ServletContext

threewsl的博客 337

JavaWeb_ServletContext读取Web应用下的资源文件

咋

weixin_45460315的博客 472

JavaWeb三大组件之一-Servlet

因为现在我们的请求都是基于HTTP协议的,所以我们应该专门为HTTP请求写一个Servlet做为通用父类。由上图我们可以看出,以后再写Servlet 可以直接继承HttpServletØ Servlet 一个标准Ø GenericServlet 是Servlet接口子类Ø HttpServlet 是GenericServlet子类,一个专门处理Http请求的Servlet。

m0_75163045的博客 1314

javaweb(Servlet的概述,原理,Mapping问题,ServletContext)

(1) Servlet的概述 就是sun公司开发动态web的一门技术,Sun在这些API中提供一个接口叫做:Servlet 开发一个Servlet程序,只需要完成两个小步骤: * 编写一个类,实现Servlet接口 * 把开发好的Java类部署到web服务器中 (把实现了Servlet接口的Java程序叫做,Servlet)Serlvet接口Sun公司有两个默认的实现类:HttpServlet,G...

Liyuehahaha的博客 605

【JavaWeb】重新认识 Servlet 的初始化 [ 回顾 Servlet ]

Servlet 是 Java 提供的一门动态Web资源开发技术。…

ebb29bbe的博客 2686

【JavaWeb】学习之ServletContext总结

概念引入 一.什么是ServletContext? Tomcat启动的时候,需要识别webapps下的各个WEB应用,识别各个WEB应用的同时为每个WEB应用创建对应的对象ServletContext,一个WEB应用对应一个ServletContext。每个ServletContext中都有一个很大的MAP,并且tomcat在启动之初就向这个MAP中放入了大量的键值对的数据.当然我们也可以通过程序...

xiongchu的博客 312
上一篇: javaWeb项目之Servlet学习笔记----ServletContext类
下一篇: javaWeb项目之Servlet学习笔记----响应对象HttpServletResponse
iamlinuxasd
博客等级 码龄10年 4粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值