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学习笔记----ServletContext的读取方法相关推荐

  1. JavaWeb黑马旅游网-学习笔记10【项目代码】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  2. JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  3. JavaWeb黑马旅游网-学习笔记08【旅游线路详情】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  4. JavaWeb黑马旅游网-学习笔记06【旅游线路分页展示分页展示】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  5. JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  6. JavaWeb黑马旅游网-学习笔记04【BaseServlet抽取】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  7. JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  8. JavaWeb黑马旅游网-学习笔记02【注册功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  9. JavaWeb黑马旅游网-学习笔记01【准备工作】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

最新文章

  1. 后处理安装_分享UG后处理出Excel程序单的方法
  2. 有感于“政府傍大款”----谈中小企业融资问题
  3. javaCountDownLatch闭锁
  4. 如何利用远程桌面连接CentOS的Desktop版本
  5. Healing Psoriasis The Natural Alternative-序言(未完待续)
  6. SAP ui5 shell open loading dialog
  7. AutoCAD 2010建筑土木制图高清实例视频教程
  8. Tensorflow官方文档学习理解 (一)
  9. 我必须得告诉大家的 MySQL 优化原理
  10. android播放器录制视频,Android播放器的录制实践
  11. java 输入流详解_java输入输出流详解
  12. STEAM无法打开创意工坊或成就页面
  13. 批量提取html文字,批量提取网页内容(全自动)
  14. 智库大会 | 高端对话:智能科技推动管理学变革...
  15. 【Word文档修改过程中空格下划线打印不出来问题解决】
  16. 如何快速上线、部署javaweb项目
  17. lumen 项目根目录_Lumen简单使用
  18. gnu make 手册 学习笔记 C语言 / C++ 构建工具 part.5 函数 控制语句
  19. 网络系统设计过程中,物理网络设计阶段的任务是(70)。【答案】A
  20. c语言c 下载文件,如何在C/C++中使用WinHTTP下载文件?

热门文章

  1. 快消出海系列:轻松找准波动原因--快消品出口额下降归因分析
  2. Redux入门教程详解(快速上手)
  3. Java、九个硬币的正反面
  4. Java developer interview questions: The hard part
  5. 欧瑞变频器故障码表_欧瑞变频器故障代码
  6. OSCP-Hutch(ldap)
  7. 芯片供给过剩的另一迹象,部分芯片价格暴跌八成,光刻机需求放缓
  8. 借名买房委托协议是否有效?
  9. 最全的模具中英文对照专业术语
  10. crmeb多商户二开退款流程文档