全国咨询热线:400-618-4000

Java培训之ServletContext读取web应用中的资源文件

更新时间:2019年03月25日18时08分 来源:传智播客Java培训学院

有时候,我们希望读取web应用中的一些资源文件,比如配置文件、图片等等。为此,在ServletContext接口中提供了一些读取web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径等。下面我们来一一了解这些方法,具体如下:

1.获取真实路径

假如现在web应用下有一个test.txt文件,想要在Servlet中获取这个资源文件,就可以使用ServletContext的相关方法来获取。下面我们通过一个案例来了解这个方法该如何使用,详情请参考ServletContext获取资源方法案例详解,点击此处 下载源代码,如下所示:
(1)创建web应用,Example15,该应用下新建一个Servlet类,PathServlet,主要代码如例1-1所示:
例1-1 PathServlet.java
public class PathServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
//”/”表示web应用的根路径
      System.out.println("ServletContext get real path:");
        ServletContext servletContext=this.getServletContext();
        String path=servletContext.getRealPath("/");
        System.out.println(path);
        String indexPath=servletContext.getRealPath("/index.jsp");
        System.out.println(indexPath);
    }
}
(2)PathServlet在web.xml文件中配置的访问路径是:“/PathServlet”。
(3)将web应用Example15发布到Tomcat服务器,然后启动Tomcat服务器,在浏览器地址栏上输入:http://localhost:8080/Example15/PathServlet,控制台打印结果,如图1-1所示:

图1-1 控制台打印结果
由图1-1可知,ServletContext接口的getRealPath(String path)方法返回的是资源文件在服务器文件系统上的真实路径。参数path代表资源文件的虚拟路径,它应该以正斜线(/)开始,“/“表示当前web应用的根目录,也可以不以“/“开始,但是建议大家一斜线开始,这样比较规范一些。

2.获取资源流

ServletContext不仅可以获取资源的真实路径,还可以获取资源流,即将资源以输入流的方式获取,下面通过一个案例来详细了解该方法的使用,具体如下:
(1)修改PathServlet,在该类的doGet()方法中添加如下代码,如例1-3所示:
例1-3 StreamServlet.java
  //使用ServletContext获取资源流
        System.out.println("ServletContext get inputstream:");
        InputStream input=servletContext.getResourceAsStream("/index.jsp");
        System.out.println(input);
(2)重新启动Tomcat服务器,在浏览器地址栏上输入:http://localhost:8080/Example15/StreamServlet,控制台显示结果如图1-2所示:

图1-2 控制台打印结果
由图1-2可知,ServletContext接口的getResouceAsStream(String path)方法可以获取path指定资源的流,path路径可以不以“/”开头,类似于getRealPath(String path)方法。其实这个方法也可以理解为,先获得资源的真实路径,再使用InputStream input=new FileInputStream(new File(servletContext.getRealPath(path)))创建一个输入流。

3.获取指定目录下的所有资源路径

使用ServletContext可以获取指定目录下的所有资源路径,例如获取WEB-INF目录下的所有资源路径:
(1)修改PathServlet,在该类的doGet()方法中添加如下代码,如例1-4所示:
例1-5 getResourcePaths()方法使用
//使用ServletContext获取指定目录下所有资源路径
        System.out.println("ServletContext get all path:");
        Set<String> paths=servletContext.getResourcePaths("WEB-INF");
        System.out.println(paths);
 (2)重新启动Tomcat服务器,在浏览器地址栏再次访问http://localhost:8080/Example15/PathServlet,控制台打印结果如图1-3所示:

图1-3 控制台打印结果
由图1-3可知,通过ServletContext接口的getResourcePaths(String path)方法,将WEB-INF目录下的所有资源路径都获取到了,该方法的返回值是一个Set集合,需要注意的是WEB-INF目录下的lib和classes都是目录,但是通过getResourcePaths()方法不会进一步会获得lib和classes目录下的资源路径。而且,该方法的参数一定要以”/”开头,否则会报错。

本文版权归传智播客Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Java培训学院
首发:http://www.itcast.cn/javaee