阅读Web应用程序资源

时间:2011-03-03 00:14:44

标签: java web-applications jsf servlets jboss

背景

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

问题

“业务范围”列表针对数据库进行查询,“列群集”列表使用所选的“业务范围”项查询数据库。这两个都是存储外部文本文件的唯一查询。

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

  • 的WebContent / META-INF /商务areas.sql
  • 的WebContent / META-INF /列clusters.sql

然后将这些用于种子PreparedStatement

源代码

读取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;
  }

问题

我想知道:

  1. 存储此类资产以作为Web应用程序的一部分进行部署的最佳做法是什么? (即,META-INF是一个好位置,还是META-INF/resources首选?)
  2. 您建议使用哪些API来阅读文件内容? (也就是说,如何编写open方法以便找到要打开的文件?)
  3. 我已经建立了JNDI来建立数据库连接,但如果可能的话,宁愿不使用JNDI来获取文件的句柄。

    相关网站

    谢谢!

3 个答案:

答案 0 :(得分:6)

正确的位置(以及通常的做法)是将它们放在source目录下,然后将其编译到WEB-INF/classes目录中。我不确定你对@Dave的响应中“classes目录是不是易变的”是什么意思,但这就是大多数(如果不是全部)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?

答案 1 :(得分:4)

我有与Dave Jarvis关于将资源与classeslib混合的类似问题,所以我做了一些小事,找到了这个解决方案:

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

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

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

答案 2 :(得分:0)

我将它们放在WEB-INF / classes中,或者将它们捆绑在application.jar中,它将放在WEB-INF / lib中。然后,您可以按照herehere

中的说明从类路径加载它们

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