web项目的相对路径和绝对路径

这个博客源于我遇到的bug

bug描述:大家都知道相对路径和绝对路径的含义,但是大家有没有想到web工程和非web工程的相对路径和绝对路径呢?

这就是我要在这篇博客中主要说明的。

需求:在web项目中获取到指定文件夹中的文件名称

在idea上的目录:src/main/resources/base/esXml/的目录下有 很多xml文件,要获取该目录条件下 所有xml文件的文件名称

web项目的相对路径和绝对路径_第1张图片

1. 非web项目(包括web项目上的junit测试):下面是获取指定目录下文件名的代码

public static List getFile(String path) {

    File file = new File(path);


    File[] array = file.listFiles();

    List list = new ArrayList<>();

    for (int i = 0; i < array.length; i++) {

        if (array[i].isFile()) {

            list.add(array[i].getName());
        }
    }
    return list;
}

path:src/main/resources/base/esXml/

结果:

1.xml

2.xml

......

而上面的path就是相对路径(相对于当前项目为根目录,前面没有“/”)

当然我们也可以使用绝对路径path:users/IdeaProject/项目名称/src/main/resources/base/esXml/

2. 如果是web项目的,大家就要小心了,无论是相对路径还是绝对路径

原因:当我们用Tomcat启动项目的时候,是将工程重新编译的放到Tomcat中执行的,随之的目录结构也会发生变化

没有用Tomcat启动项目的目录:users/IdeaProject/项目名称/src/main/resources/base/esXml/

使用Tomcat启动项目的目录:/Users/zhangruibiao/install/apache-tomcat-8.5.9/webapps/ROOT/WEB-INF/classes

是放到tomcat目录下执行的,所有原来的相对路径和绝对路径都会是错的了

web项目的相对路径和绝对路径_第2张图片


上图是工程重新编译并在tomcat下执行的目录结构,而要获取esXml文件夹下的xml文件的目录:

/Users/zhangruibiao/install/apache-tomcat-8.5.9/webapps/ROOT/WEB-INF/classes/esXml/

 相比于非web项目的目录:users/IdeaProject/项目名称/src/main/resources/base/esXml/

有很大不同,这时在项目上我们要获取的目录应该是第一个,下面是获取该路径的代码

public String getPath(){
    String pathWebroot = this.getClass().getResource("/").toString();
    pathWebroot = pathWebroot + "esXml/";
    LOG.info(pathWebroot);
    String path = pathWebroot.substring(5);
    LOG.info(path);
    return path;
}
 
  

代码解释:大家应该很好奇为什么会有红色的代码,那是做什么的呢?

看了该代码的两个LOG日志打印,相信就会明白了

file:/Users/zhangruibiao/install/apache-tomcat-8.5.9/webapps/ROOT/WEB-INF/classes/esXml/

/Users/zhangruibiao/install/apache-tomcat-8.5.9/webapps/ROOT/WEB-INF/classes/esXml/

相比于第二个日志,第一个多了个"file:"这么段字符串,需要截掉才行。
以上就是web项目和非web项目绝对路径的差别。

除了上面的需要说明的还有一点需要大家注意:

Idea上Resources配置文件的加载目录:我要获取的是 src/main/resources/base/esXml/ 目录下的文件名称,而在上图Tomcat目录下并没有resources文件夹,所以大家需要注意的是配置文件在tomcat中的加载是直接滤过src/main/resources/base/这一串目录的,而是直接在classes(/Users/zhangruibiao/install/apache-tomcat-8.5.9/webapps/ROOT/WEB-INF/classes/esXml/)目录下暴露esXml文件夹,这个和第一张图idea中的目录结构是相呼应的。


你可能感兴趣的:(web项目的相对路径和绝对路径)