我的编程空间,编程开发者的网络收藏夹
学习永远不晚

web资源如何利用ServletContext类进行获取

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

web资源如何利用ServletContext类进行获取

web资源如何利用ServletContext类进行获取?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

ServletContext类中有这么四个方法:

  1. getRealPath(String path)

  2. getResource(String path)

  3. getResourceAsStream(String path)

  4. getResourcePaths(String path)

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

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

web资源如何利用ServletContext类进行获取

先来看看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);   }

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

web资源如何利用ServletContext类进行获取

接下来看看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);

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

web资源如何利用ServletContext类进行获取

使用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);

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

    ServletContext context = this.getServletContext();     URL fileUrl = context.getResource("/database.properties");     InputStream in = fileUrl.openStream();          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);

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

web资源如何利用ServletContext类进行获取

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

web资源如何利用ServletContext类进行获取

我们说过,这个web应用在发布时,会将【class="lazy" data-src】目录下的.java文件编译成为.class字节码文件,由服务器自动将这些字节码文件放置在该web应用中的【WEB-INF】下的【classes】目录里,如果没有【classes】目录,服务器会自动帮我们创建,因此,只要是放置在【class="lazy" data-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资源如何利用ServletContext类进行获取

关于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来读取,那么该如何读取呢?

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

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

web资源如何利用ServletContext类进行获取

在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 ServletDemo extends HttpServlet {   public void doGet(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {      Student student = new Student();     student.getStudent();   } }

从浏览器中访问该Servlet,可以看到通过类加载器读取的配置文件中的内容:

web资源如何利用ServletContext类进行获取

注意,这种方法只能是web资源放置在【class="lazy" data-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);   } }

这种方式还有一种好处就是,如果要读取的文件过大,而之前通过类加载器将大文件加载进内存就容易导致内存溢出,所以还是采用这种方式比较好。

最后再说明一点,如果是在非Servlet类中采用类加载器获取【classes】目录中的资源,方法参数的路径只需要是相对于【class="lazy" data-src】目录即可。

补充:使用类加载器加载【classes】目录中的资源,得到的路径取决是哪个虚拟机(或服务器)调用,例如上面的代码getStudent()方法,如果是在非Servlet的类的方法中被调用,那么就是使用JVM虚拟机,那么得到的资源路径并不是Tomcat的应用【webapps】目录的路径。因此如果是要为Servlet中提供资源,那么非Servlet类中获取资源的方法,请一定要使用Servlet来调用,这样才能保证得到的资源路径是在Tomcat服务器下的自己的web应用所在目录中的正确位置。

例如下面的例子,我的MyEclipse工作空间在【E】盘,而Tomcat服务器所在路径为【F】盘:

 public class ResourceUtils {      public static void main(String[] args) throws IOException {     getResource();   }      @Test   public static void getResource() throws IOException {          ClassLoader loader = ResourceUtils.class.getClassLoader();     URL url = loader.getResource("student.properties");     String path = url.getPath();     System.out.println(path);   } }

而资源为student.properties配置文件,放置的位置为【class="lazy" data-src】目录下:

web资源如何利用ServletContext类进行获取

这个是在我的一个web应用中定义的一个非Servlet的普通Java类,这个类无论是用JUnit测试还是使用Main函数,亦或是使用别的非Servlet类来调用getResource方法获取在web应用下【class="lazy" data-src】目录中的student.properties资源,显示的路径为MyEclipse的工作空间,而不是Tomcat服务器:

web资源如何利用ServletContext类进行获取

而如果是使用Servlet来调用的话,才是真正显示在Tomcat中web应用所在的地方:

 public class ServletDemo extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {      ResourceUtils.getResource();   } }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

web资源如何利用ServletContext类进行获取

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

web资源如何利用ServletContext类进行获取

web资源如何利用ServletContext类进行获取?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。ServletContext类中有这么四个方法:getRe
2023-05-31

如何利用K8S技术进行K8S资源控制

如何利用K8S技术进行K8S资源控制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。私有云K8S资源控制原理基于前面系列文章的详细阐述,我们已经可以手工去K8S集群的命令行下将C
2023-06-19

.NET Core如何使用CZGL.SystemInfo库获取主机运行资源

今天就跟大家聊聊有关.NET Core如何使用CZGL.SystemInfo库获取主机运行资源,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。简介CZGL.SystemInfo 是一个
2023-06-28

代码行号如何利用Java获取

这篇文章将为大家详细讲解有关代码行号如何利用Java获取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体实现代码:package leo.demo.training;/***
2023-05-31

如何使用 Golang 协程进行资源管理?

资源管理协程:资源获取: 使用 sync.mutex 或 sync.rwmutex 实现互斥访问。资源释放: 使用 defer 语句在协程结束时自动调用释放函数。实战案例:缓冲通道限制同时使用的资源数量,避免资源争用和泄漏。如何使用 Gol
如何使用 Golang 协程进行资源管理?
2024-05-22

编程实践:如何高效利用Linux exit函数进行资源释放

在Linux中,当一个程序需要终止时,可以使用exit()函数关闭打开的文件描述符:确保在程序结束前关闭所有打开的文件描述符。这可以通过在程序中使用close()函数来完成。例如:int fd = open("file.txt", O_RD
编程实践:如何高效利用Linux exit函数进行资源释放
2024-08-29

利用Java 如何获取类名与方法名

这期内容当中小编将会给大家带来有关利用Java 如何获取类名与方法名,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。获取类名:public static void testGetClassName() {
2023-05-31

如何在Java中利用正则表达式对电话号码进行获取

这篇文章将为大家详细讲解有关如何在Java中利用正则表达式对电话号码进行获取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、正则表达式正则表达式,又称 正规表示法 、 常规表示法 (英语:
2023-05-31

利用SpringBoot进行Web开发时如何正确的使用注解

利用SpringBoot进行Web开发时如何正确的使用注解?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、spring-boot-starter-web 依赖
2023-05-31

如何在Kotlin中利用SharedPreferences对数据进行存取

这篇文章将为大家详细讲解有关如何在Kotlin中利用SharedPreferences对数据进行存取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体方法如下/** * author: sm
2023-05-31

如何使用shell获取进程名的内存以及CPU利用率

目录原理:在ubuntu18.04和centos7.9测试:使用方法:总结原理: 1)使用ps得到进程名的所有进程pid ps -C process_name -o pid=2) 使用 /proc
2022-06-05

文件的真实类型如何利用java进行判断

文件的真实类型如何利用java进行判断?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体代码如下:package com.zhuifeng.util.excel
2023-05-31

Python+OpenCV中如何利用K-Means 聚类进行色彩量化

小编给大家分享一下Python+OpenCV中如何利用K-Means 聚类进行色彩量化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!利用 K-Means 聚类进行
2023-06-21

如何进行Kali Linux常用服务配置及获取IP地址

本篇文章为大家展示了如何进行Kali Linux常用服务配置及获取IP地址,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Kali Linux常用服务配置教程获取IP地址下面以Kali Linux为例
2023-06-05

如何在不进行类型检查的情况下获取泛型函数中类型的大小?

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《如何在不进行类型检查的情况下获取泛型函数中类型的大小?》,就带大家讲解一下知
如何在不进行类型检查的情况下获取泛型函数中类型的大小?
2024-04-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录