阅读 Web 应用程序资源

Posted

技术标签:

【中文标题】阅读 Web 应用程序资源【英文标题】:Reading Web Application Resources 【发布时间】:2011-07-07 16:52:41 【问题描述】:

背景

开发一个简单的 Web 应用程序(Eclipse + JBoss + Apache Tomcat)来生成 XML 文件。

问题

“业务领域”列表查询数据库,“列簇”列表使用选定的“业务领域”项查询数据库。这两个都是存储外部文本文件的唯一查询。

文件目前存储在以下位置:

WebContent/META-INF/business-areas.sql WebContent/META-INF/column-clusters.sql

然后将这些用于播种PreparedStatements。

源代码

读取 SQL 代码的方法可能类似于:

  private String getSQL() 
    String result = "";

    try 
      BufferedReader br = open( "business-areas.sql" );
      String line = null;

      while( (line = br.readLine()) != null ) 
        result += line;
      

      br.close();
    
    catch( Exception e ) 
      e.printStackTrace();
    

    return result;
  

问题

我想知道:

    存储此类资产以作为 Web 应用程序的一部分进行部署的最佳做法是什么? (也就是说,META-INF 是一个好位置,还是META-INF/resources 是首选?) 您推荐使用哪些 API 来读取文件内容? (即open方法怎么写才能找到要打开的文件?)

我已经有 JNDI 来建立数据库连接,但如果可能的话,我宁愿不使用 JNDI 来获取文件的句柄。

相关网站

http://blogs.oracle.com/alexismp/entry/web_inf_lib_jar_meta http://www.avajava.com/tutorials/lessons/where-do-i-put-resources-in-my-maven-project.html http://docs.jboss.org/jbossweb/3.0.x/config/context.html http://tomcat.apache.org/tomcat-4.0-doc/catalina/docs/api/org/apache/naming/resources/FileDirContext.html

谢谢!

【问题讨论】:

【参考方案1】:

正确的位置(也是常见的做法)是将它们放在您的source 目录下,然后将其编译到WEB-INF/classes 目录中。我不确定您在回复@Dave 时所说的“类目录易变”是什么意思,但这是大多数(如果不是全部)Java Web 应用程序存储内容的方式。 WEB-INF/classes 不仅适用于 Java 类。通常会看到存储在source 目录下的日志记录属性文件(如 log4j)、Hibernate 和 Spring XML 文件,您可以使用以下方式安全地访问这些文件:-

// in this case, the business-areas.sql is located right under "source/sql" directory
InputStream is = getClass().getClassLoader().getResourceAsStream("sql/business-areas.sql");
BufferedReader br = new BufferedReader(new InputStreamReader(is));

关于使用 META-INF 的一些有用信息:What's the purpose of META-INF?

【讨论】:

【参考方案2】:

我和 Dave Jarvis 一样担心将资源与 classeslib 混合,所以我做了一些摆弄,找到了这个解决方案:

我将资源文件放在WEB-INF/resources 中。然后,为了加载它们,我使用了这个:

getClass().getClassLoader().getResourceAsStream("../resources/main.xml");

我不知道使用.. 是一个更干净的解决方案,但我的文件至少没有与类或罐子混合。

【讨论】:

【参考方案3】:

我会将它们放在 WEB-INF/classes 中,或者将它们捆绑在您的 application.jar 中,该文件将进入 WEB-INF/lib 中。然后您可以按照here 和here 的说明从类路径中加载它们

更好的是,如果你使用 maven,最好的做法是将这些类型的文件放在 src/main/resources 中,然后 maven 会为你处理这些。

【讨论】:

以上是关于阅读 Web 应用程序资源的主要内容,如果未能解决你的问题,请参考以下文章

在 Web 应用程序 (Tomcat7) 中从 jar 文件中公开资源

Spring Boot文档阅读笔记-CORS Support

Spring Boot文档阅读笔记-CORS Support

Spring Boot文档阅读笔记-CORS Support

Day10 JavaWeb学习之Tomcat,Web 应用服务器

《架构之美》阅读笔记四