代码之家  ›  专栏  ›  技术社区  ›  pmr

如何从部署为.war文件并在Tomcat5.5中运行的servlet访问配置文件?

  •  1
  • pmr  · 技术社区  · 16 年前

    我试图从.war文件中的servlet访问配置文件。问题是,默认的文件路径是Tomcat根目录本身,对文件的路径进行硬编码也不是一个选项。是否可以通过servletcontext或任何tomcat变量获取任何信息?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Gandalf    16 年前

    如果你把文件放在你的特定WebApple目录(./WebApp/{Servlet }类)下的“类”目录中,那么你可以通过这样做来从Java类内部访问它:

    Class.getResourceAsStream(<filename>);
    

    所以如果您在/webapps/myservlet/classes/conf.xml有一个conf文件

    Class.getResourceAsStream("conf.xml");
    
        2
  •  1
  •   Tim H    16 年前

    甘道夫提供了“正确”的答案。你可以在任何地方安全地使用它。这是你所需要的。

    只是个警告。有些人认为,由于有从战争内部读取数据的方法,这意味着在战争内部写入数据也是可以的。从字面意义上讲,有时候这是真的。但并非总是如此。而且几乎从来都不安全。

    我之所以提到这个,是因为我继承了一个可以做到这一点的webapp。在一个分解的war目录中存储了一个完整的文件目录树。第一次软件升级,“poof!”所有仔细上传的数据文件都不见了。

    所以把战争当作只读的。如果需要写入,请指定AppServer外部的目录。最好是作为web.xml文件中的可配置参数,这样您就可以使用JNDI来查找它,并且可以出于测试目的重写它,而不必修改源代码。

        3
  •  0
  •   Jared    16 年前

    我一点也不确定这是“正确”的做法,但在过去,我已经为配置文件的路径读取了一个环境变量。

    类似这样的事情(在处理异常方面,您应该比本例做得更好……但您明白了这一点):

    public File getConfigurationFile() {
       String envPath = System.getEnv("CONFIG_FILE"); // Use a better-named variable
       if(envPath == null || envPath.equals("") {
          throw new RuntimeException("CONFIG_FILE environment variable not set.");
       } else {
          File f = new File(envPath);
          if(!f.exists())  {
           throw new RuntimeException("CONFIG_FILE environment variable points to non-existent file");
          } else if(!f.isFile()) {
           throw new RuntimeException("CONFIG_FILE environment variable points to non-file entity.");
          } else if(!if.canRead()) {
           throw new RuntimeException("CONFIG_FILE points to unreadable file.");
          } else {
            return f;
          }
       }
    }