servletContext读取web应用中的资源文件。
------------------------------
InputStream is=this.getServletContex().getResourceAsStream("/WEB_INF/classes/XXXX.properties");
InputStream is=this.getServletContex().getRealPath("/WEB_INF/classes/XXXX.properties");
FileInputStream fis =new FileInputStream(path);//此处path指的是相对路径,
web应用中,相对java虚拟机。
----------------------------
如果读取资源文件的程序不是servlet,应该用classload来加载,如java程序中获取资源文件。
通过类装载的方式读取资源文件
注意:
通过类装载的方式读取资源文件的内容,如果动态的更改资源文件的内容不会立即生效(类加载器在成功加载某个类之后,会把得到的 java.lang.Class类的实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载)。
如果要求立即生效,可以通过类装载的方式得到资源文件的位置,之后再通过操作文件的方式获得输入流。
String path=obj.class.getClassLoader.getResource("XXXX.properties").getPath();
FileInputStream fis =new FileInputStream(path);
<wbr><wbr>props.load(is);</wbr></wbr>
下面是之前看别人在广西联通项目中通过资源文件定义数据源,并读取资源文件的方式,存在一些不足:数据源配置信息与web层无关,不应使用ServletContextListener类型的实例对象(关联ServletContextEvent)方法getWebClassRootPath()来获取资源文件的路径。
----写完整路径:
<wbr><wbr><wbr> public Properties loadProperties(String propsfile) throws Exception {<wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><br><wbr><wbr>Properties props = new Properties();<br><wbr><wbr>try {<br><wbr><wbr><wbr>FileInputStream stream;<br><wbr><wbr><wbr><br><wbr><wbr><wbr>String path = WebVarLoader.getWebClassRootPath();<br><wbr><wbr><wbr>try {<br><wbr><wbr><wbr><wbr>stream = new FileInputStream(new File(path + propsfile));<br><wbr><wbr><wbr>} catch (Exception e) {<br><wbr><wbr><wbr><wbr>e.printStackTrace();<br><wbr><wbr><wbr><wbr>stream = new FileInputStream(new File(propsfile));<br><wbr><wbr><wbr>}<br><wbr><wbr><wbr>props.load(stream);<br><wbr><wbr>} catch (Exception e) {<br><wbr><wbr><wbr>e.printStackTrace();<br><wbr><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>return props;<br><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr><wbr><wbr> public Connection getConnection(String propsFile) throws Exception {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (propsFile == null || propsFile.length() == 0) {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // propsFile = Global.jndiFile;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> System.out.println("propsFile is blank");<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Properties props = loadProperties(propsFile);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> String dbSourceName = props.getProperty("DataSource");<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Context ctx = new InitialContext(props);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> javax.sql.DataSource dbSource = (javax.sql.DataSource) ctx.lookup(dbSourceName);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (dbSource == null) {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> throw new Exception("Cann't find the datasource " + dbSourceName);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return dbSource.getConnection();<br><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
package bss.common.base.tools;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class WebVarLoader implements ServletContextListener {
<wbr><br><wbr>private static String path = "";</wbr></wbr>
<wbr><br><wbr>private static String webClassRootPath = "";</wbr></wbr>
<wbr><br><wbr>private static final String FILE_SEP = (String) System.getProperty("file.separator");</wbr></wbr>
<wbr><br><wbr>public void contextDestroyed(ServletContextEvent arg0) {<br><wbr><wbr>// TODO Auto-generated method stub<br><wbr>}</wbr></wbr></wbr></wbr></wbr>
<wbr><br><wbr>public void contextInitialized(ServletContextEvent event) {<br><wbr><wbr>path = event.getServletContext().getRealPath("/");<br><wbr><wbr>webClassRootPath = path + FILE_SEP + "WEB-INF" + FILE_SEP + "classes" + FILE_SEP;<br><wbr><wbr><br><wbr><wbr>//FIXME delete below 2<br><wbr><wbr>System.out.println("[DEBUG] path : "+path);<br><wbr><wbr>System.out.println("[DEBUG] web_class_rootpath : "+ webClassRootPath);<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><br><wbr>public static String getWebClassRootPath() {<br><wbr><wbr>return webClassRootPath;<br><wbr>}</wbr></wbr></wbr></wbr></wbr>
}
----------------------------classload方式------------------
Properties props = new Properties();
InputStream is=obj.class.getClassLoader.getResourceAsStream("XXXX.properties");
<wbr><wbr>props.load(is);</wbr></wbr>
<wbr>String dbSourceName = props.getProperty("DataSource");</wbr>