Reading Web Application Resources
Background
Developing a simple web application (Eclipse + JBoss + Apache Tomcat) to generate XML files.
Problem
The "Business Area" list queries against the database, and the "Column Cluster" list queries the database using the selected "Business Area" items. Both of these are unique queries that are stored external text files.
The files are currently stored in the following locations:
- WebContent/META-INF/business-areas.sql
- WebContent/META-INF/column-clusters.sql
These are then used to seed PreparedStatement
s.
Source Code
The method to read the SQL code might resemble:
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;
}
Questions
I would like to know:
- What are the best practices for storing such assets for deployment as part of a web app? (That is, is
META-INF
a good location, or isMETA-INF/resources
preferred?) - What APIs would you recommend for reading the file content? (That is, how do I write the
open
method so that it finds the files to open?)
I already have JNDI in place to establish the database connection, but would rather not use JNDI to obtain handles to the files, if possible.开发者_开发技巧
Related Sites
- 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
Thank you!
The right location (and also the common practice) is to place them under your source
directory, which will then gets compiled into WEB-INF/classes
directory. I'm not sure what you meant by "classes directory is volatile" in your response to @Dave, but this is how most (if not all) Java web apps store things. WEB-INF/classes
is not just for Java classes. It's common to see logging properties file (like log4j), Hibernate and Spring XML files stored under source
directory and you can safely access the files using something like this:-
// 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));
Some useful information about the use of META-INF: What's the purpose of META-INF?
I had similar concerns as Dave Jarvis about mixing resources with classes
and lib
, so I did some fiddling and found this solution:
I placed my resource files in WEB-INF/resources
. Then, to load them, I used this:
getClass().getClassLoader().getResourceAsStream("../resources/main.xml");
I don't know that using a ..
is a much cleaner solution, but my files are at least not mixed with classes or jars.
I'd put them in WEB-INF/classes, or bundle them inside your application.jar which will go inside WEB-INF/lib. Then you can load them from the classpath as explained here and here
Even better, if you use maven, the best practice is to put these type of files inside src/main/resources and then maven will take care of this for you.
精彩评论