zoukankan      html  css  js  c++  java
  • java web 资源文件读取

    前提:假设web应用test(工程名) webapps下面有一资源文件test.html

    规则:在获取资源时一般使用的是相对路径,以符号/开头,而 / 代表什么取决于这个地址给谁使用。服务器使用时,/ 表示web应用;浏览器使用时,/ 表示地址,需要指出web应用

    例:

    1. request.getRequestDispatcher("/test.html").forward(request, response);
    2. response.sendRedirect("/test/test.html");
    3. getServletContext.getRealPath("/test.html");
    4. getServletContext.getResourceAsStream("/test.html");
    5. html 内容
    <a href = "/test/test.html">clicked me

    先从工程结构中截一张图出来(这张图是在其他地方复制过来的),从结构中可以看出,分别在三个地方都放了三个配置文件

     1、 直接获取文件流读取文件的方式

    先来读取上图中src目录下的第一个资源文件,看到的第一眼我们很容易写成这样

            ServletContext sc=getServletContext();  
            InputStream out=sc.getResourceAsStream("/src/db.properties");  
            Properties props=new Properties();//读取文件类型创建对象。  

    其实那是错误的,因为在编译打包后,配置文件会被复制到/WEB-INF/classes目录下,也就是说src/目录对应的编译后对应的目录是/WEB-INF/classes.因此正确的写法如下

            ServletContext sc=getServletContext();  
            InputStream in=sc.getResourceAsStream("/WEB-INF/classes/db.properties");  

    第二个资源文件,它放在/src目录下的包里,包名直接转化成目录,它的路径如下

            ServletContext sc=getServletContext();  
            InputStream in=sc.getResourceAsStream("/WEB-INF/classes/cn/itcast/db.properties");  

    第三个资源文件直接放在web应用目录WebRoot目录下

            ServletContext sc=getServletContext();  
            InputStream in=sc.getResourceAsStream("/db.properties");  

    2、获取文件路径的方式

         同样地,从第一个资源文件开始,先来一个容易出错的方式

    FileInputStream in = new FileInputStream("src/db.properties");

        在启动服务器后,访问页面报错后,很多同学肯定会想,肯定要像上面说到的一样,正确路径是/WEB-INF/classes/db.properties。其实不是这样的,正如在文中开头提到的一样,此时用到的相对路径,最关键的问题是以哪个目录为相对?很显然,我们眼睛看到的文件地址并不是真正的位置,而真正的相对路径是启动tomcat服务的startup.bat所在的目录。不过我们可以通过另一种方式去获取它的绝对路径,如下

            ServletContext sc=getServletContext();  
            String path=sc.getRealPath("/WEB-INF/classes/db.properties");  
            Properties props=new Properties();//读取文件类型创建对象。  
            props.load(new FileInputStream(path));  
            String value=props.getProperty("name1");  

     注意:在web应用中,不能以传统方式去获取文件路径,可以通过ServletContext的getRealPath的接口来得到

    第二,第三个资源文件的文件路径方式在此就不再一一列举了,他们的路径与上面第1种方式说的完全一样。

    3、类加载的方式

    这种方式不同于ServletContext方式,它与动态界面servlet完全解耦

    InputStream in = XXX.class.getClassLoader().getResourceAsStream("/db.properties"); 
    //在此的路径我是随便写的一个,这里只讨论加载方式

    由于类在整个程序中只加载一次,通过getResourceAsStream读取文件时,在更改配置文件后,改动的内容不能及时被重新加载。这个时候可以改成这样

    String path = XXX.class.getClassLoader().getResource("/db.properties").getPath(); 

    getResource()将路径当作URL来处理,每次改动都会被重新读取到。

    总结:在web应用中读取资源文件时,必须要用到ServletContext的getRealPath,getResourceAsStream才能得到,除了这两种方法,还可以通过类加载的方式取到文件路径,再以传统的方式去读流。

  • 相关阅读:
    Javascript中最常用的55个经典技巧
    Linux2.6--进程抢占和上下文切换
    redis 无法启动
    Dev GridView-Bind Detail Grid during runtime
    SharePoint场管理-PowerShell(二)
    SharePoint场管理-PowerShell(一)
    SharePoint的安装和配置-PowerShell
    SPField的GetValidatedString方法没有被调用
    PowerShell基础
    什么是工作流?
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/4684746.html
Copyright © 2011-2022 走看看