`

(转载)从读取properties文件说开去,浅谈web容器中类加载器

 
阅读更多
今天刚好有人让我写个通过读取properties连接数据库的小demo.

汗啊,普通项目中可以使用的文件读取,在web项目中总报空指针异常.

查阅了资料明白,赶紧记录下来,希望遇到此类问题的童鞋能引起重视。

废话不说,直接进入主题!

代码清单1:

01
import java.io.InputStream;
02
import java.util.Properties;
03
 
04
import org.apache.log4j.Logger;
05
/**
06
 *
07
 * 项目名称 PropertiesDemo
08
 * 包   名 com.linfeng.util
09
 * 文 件 名 PropertiesUtil.java
10
 * 开 发 人 Administrator
11
 * 描述信息 Properties文件读取类
12
 * 发布日期 2012-10-31上午11:34:59
13
 * 修改日期
14
 * 修   改  人       
15
 * 版本信息 V1.0
16
 *
17
 */
18
public class PropertiesUtil {
01
private static Logger log = Logger.getLogger(PropertiesUtil.class);
02
 private Properties propertie;
03
 private InputStream inputFile;  
04
 public PropertiesUtil(String filePath){
05
 propertie = new Properties();  
06
        try {  
07
            inputFile = getClass().getResourceAsStream(filePath);   
08
            propertie.load(inputFile);  
09
            inputFile.close();  
10
        } catch (FileNotFoundException ex) {  
11
            log.error("读取属性文件--->失败!- 原因:文件路径错误或者文件不存在");
12
            ex.printStackTrace();  
13
        } catch (IOException ex) {  
14
            log.error("装载文件--->失败!");  
15
            ex.printStackTrace();  
16
        }  
17
 }
18
  
19
 /** 
20
     * 重载函数,得到key的值 
21
     * @param key 取得其值的键 
22
     * @return key的值 
23
     */  
24
    public String getValue(String key)  
25
    {  
26
        if(propertie.containsKey(key)){  
27
            String value = propertie.getProperty(key);//得到某一属性的值  
28
            return value;  
29
        }  
30
        else   
31
            return "";  
32
    }//end getValue(...)  
33
     
34
    /** 
35
     * 重载函数,得到key的值 
36
     * @param fileName properties文件的路径+文件名 
37
     * @param key 取得其值的键 
38
     * @return key的值 
39
     */  
40
    public String getValue(String fileName, String key)  
41
    {  
42
        try {  
43
            String value = "";  
44
            inputFile = getClass().getResourceAsStream(fileName);  
45
            propertie.load(inputFile);  
46
            inputFile.close();  
47
               
48
            if(propertie.containsKey(key)){  
49
                value = propertie.getProperty(key);  
50
                return value;  
51
            }else  
52
                return value;  
53
        } catch (FileNotFoundException e) {  
54
            e.printStackTrace();  
55
            return "";  
56
        } catch (IOException e) {  
57
            e.printStackTrace();  
58
            return "";  
59
        } catch (Exception ex) {  
60
            ex.printStackTrace();  
61
            return "";  
62
        }  
63
    }//end getValue(...)  
64
 /**
65
 * 根据指定资源路径加载单个资源文件,返回Properties类对象的引用。
66
 * 若有异常产生,则Properties类对象为空。
67
 * @param filePath 资源文件的路径的值
68
 * @return 给定资源文件所对应的Properties类对象的引用
69
 */
70
 public static Properties loadPropertiesFile(String filePath){
71
 Properties properties= new Properties();
72
 InputStream is = null;
73
 try {
74
 try{
75
 is=new FileInputStream(filePath);
76
 properties.load(is);
77
 }finally{
78
 if (is!=null) {
79
 is.close();
80
 is=null;
81
 }
82
 }
83
 } catch (Exception e) {
84
 properties = null;
85
 }
86
 return properties;
87
  
88
 }
89
 
90
    }


PropertiesUtil.java 用于进行读取*.properties文件的工具类

通过方法


1
loadPropertiesFile(String filePath)
在普通java项目下可以正常读取properties文件,但是在web项目下,无法读取properties文件,报空指针异常。

这里引出类的加载器的概念

每个Class对象都保留着加载自己的类加载器的引用,可以通过Class对象的getClassLoader方法来获得其引用。ClassLoader通过loadClass方法来加载这个类。

按照类加载器,首先应该加载父类,也就是通常所说的父类优先的原则,但是在web容器中加载顺序有所不同。

通过查找资料找到这样的叙述:


对于运行在 Java EE容器中的 Web 应用来说,类加载器的实现方式与一般的 Java 应用有所不同。不同的 Web 容器的实现方式也会有所不同。以 Apache Tomcat 来说,每个 Web 应用都有一个对应的类加载器实例。该类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中的推荐做法,其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类。这种代理模式的一个例外是:Java 核心库的类是不在查找范围之内的。这也是为了保证 Java 核心库的类型安全。

绝大多数情况下,Web 应用的开发人员不需要考虑与类加载器相关的细节。下面给出几条简单的原则:


每个 Web 应用自己的 Java 类文件和使用的库的 jar 包,分别放在 WEB-INF/classes和 WEB-INF/lib目录下面。
多个应用共享的 Java 类文件和 jar 包,分别放在 Web 容器指定的由所有 Web 应用共享的目录下面。
当出现找不到类的错误时,检查当前类的类加载器和当前线程的上下文类加载器是否正确。



于是对于一个普通web项目,properties文件可以放在src目录下,经过编译器编译之后目录变为WEB-INF/classes目录.

路径变化后,只能通过类加载器来获得文件路径,否则无法加载。

代码清单2:

01
/**
02
 *
03
 * 项目名称 XXXX
04
 * 包   名 com.xxx.mall.util
05
 * 文 件 名 DbUtil.java
06
 * 开 发 人 Administrator
07
 * 描述信息 数据库帮助类
08
 * <p>数据库连接方法</p>
09
 * <p>释放数据库资源方法</p>
10
 * 发布日期 2012-10-31下午03:26:50
11
 * 修改日期
12
 * 修   改  人       
13
 * 版本信息 V1.0
14
 *
15
 */
16
public class DbUtil {
17
    //Connection对象
18
    private  static Connection conn =null;
19
    private static final String PROPERTIES_FILE_PATH="/dbconfig.properties";
20
    /**
21
     * 获得数据库连接对象方法
22
     * @return 返回数据库连接对象conn
23
     */
24
    public static Connection getConnection(){
25
        try {
26
            PropertiesUtil propertiesUtil=new PropertiesUtil(PROPERTIES_FILE_PATH);
27
            Class.forName(propertiesUtil.getValue("driver"));
28
            conn=DriverManager.getConnection(propertiesUtil.getValue("url"), propertiesUtil.getValue("user"), propertiesUtil.getValue("password"));
29
        }catch (ClassNotFoundException e) {
30
            throw new MyDbException("数据库jar包异常",e);
31
        }catch (SQLException e) {
32
            throw new MyDbException("数据库连接字符串异常",e);
33
        }
34
        catch (Exception e) {
35
           throw new MyDbException("数据库连接异常",e);
36
        }
37
        return conn;
38
    }
39
    /**
40
     * 释放数据库资源方法
41
     * @param pmst
42
     * @param rs
43
     * @param conn
44
     */
45
    public static void freeDb(PreparedStatement pmst,ResultSet rs,Connection conn){
46
        if (pmst!=null) {
47
            try {
48
                pmst.close();
49
            } catch (SQLException e) {
50
                 throw new MyDbException("数据库关闭PreparedStatement对象异常",e);
51
            }
52
        }
53
        if (rs!=null) {
54
            try {
55
                rs.close();
56
            } catch (SQLException e) {
57
                 throw new MyDbException("数据库关闭ResultSet对象异常",e);
58
            }
59
        }
60
        if (conn!=null) {
61
            try {
62
                conn.close();
63
            } catch (SQLException e) {
64
                 throw new MyDbException("数据库关闭Connection对象异常",e);
65
            }
66
        }
67
    }
68
 
69
}




源地址:http://my.oschina.net/dlpinghailinfeng/blog/86288
分享到:
评论

相关推荐

    Python实现读取Properties配置文件的方法

    为了在Python中读取这样的文件,我们可以创建一个名为`Properties`的类,该类包含两个方法:`__init__`和`getProperties`。`__init__`用于初始化类实例,并接收文件路径作为参数;`getProperties`方法负责打开文件,...

    java 读取properties文件代码

    7. **使用资源包**:如果你的Properties文件位于项目的资源包中,可以通过类加载器获取输入流,这样在部署到不同环境中时无需修改代码。例如: ```java InputStream input = getClass().getResourceAsStream("/...

    读取properties文件返回map

    - `load(InputStream input)`:接受一个`InputStream`,通常是从文件系统、类路径或网络流中获取。 - `load(Reader reader)`:接受一个`Reader`,适用于处理Unicode编码的文件。 示例代码: ```java ...

    js读取properties文件

    在JavaScript(JS)环境中,读取.properties文件通常用于处理配置数据或者本地化文本。这些文件在Java开发中广泛使用,但JavaScript同样可以借助一些库或技术来读取它们。下面我们将详细探讨如何在JavaScript中实现...

    读取properties文件内容

    ConfigFile configfile = ConfigFile.getInstance("ipConfig123.properties"); String ip = configfile.getkeyvalue("ip"); 可以取出ipConfig123.properties 文件中IP的内容

    读取properties文件工具类

    这个"读取properties文件工具类"是为了简化程序中对`.properties`文件的读取操作而设计的。通过这样的工具类,开发者可以方便地加载和获取配置文件中的属性值,避免重复编写相同的代码。下面我们将详细探讨`...

    利用Java的Properties 类读取配置文件信息

    使用`load()`方法从输入流加载`.properties`文件内容。通常,我们会使用`FileInputStream`打开文件,然后传递给`load()`方法。 ```java try (InputStream in = new FileInputStream("test.properties")) { ...

    SSM 读取properties文件

    这是一个Spring的bean定义类,它允许我们从properties文件中加载和解析属性值,然后将这些值注入到其他bean的属性中。首先,我们需要创建一个properties文件,例如`application.properties`,并放入项目的类路径下...

    properties文件的读取

    使用`Properties`类的`load()`方法从输入流中加载文件内容: ```java import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class PropertiesDemo { public ...

    读取properties返回map并写入文件

    在上述代码中,我们首先创建一个Properties对象`props`,然后通过`load()`方法从指定路径的文件中读取内容。接着,我们遍历Properties对象的键集,将每个键值对添加到HashMap`map`中。这样,我们就得到了一个键值对...

    java 读取WEB-INF下文件夹中的properties文件

    非常实用的读取配置文件的小工具,专门读取WEB-INF下文件夹中的properties文件,代码简洁、亲测没有问题,适用范围广,任何类中都可调用,传入Key及可得到Value

    ResourceBundle与Properties读取maven中resources目录下的资源文件

    - **load(InputStream inStream)**: 此方法用于从`.properties`文件对应的输入流中加载属性列表。例如: ```java Properties pro = new Properties(); FileInputStream in = new FileInputStream("a.properties")...

    读取properties文件

    ### 读取Properties文件:Java中的配置管理利器 在Java编程中,`Properties`类是处理配置文件(通常为`.properties`格式)的关键工具。这种文件格式被广泛应用于存储应用程序的配置信息,如数据库连接字符串、邮件...

    java完美读取properties文件

    在Java编程中,`...总结来说,Java通过`java.util.Properties`类提供了方便的API来读取和操作`properties`文件。在实际开发中,我们应确保正确加载和关闭资源,以及处理可能出现的异常,从而实现“完美”读取。

    c#操作properties,读写配置文件

    除了`Properties.Settings`类之外,还可以使用`ConfigurationManager`类来读取配置文件中的设置。这种方式适用于那些不希望在代码中硬编码配置项名称的情况。 1. **读取设置**: ```csharp string value = ...

    java读取properties配置文件

    在Java中,我们可以使用`java.util.Properties`类来加载和操作这类文件。以下是读取`properties`文件的基本步骤: 1. 加载`properties`文件: - 创建`Properties`对象实例:`Properties prop = new Properties();`...

    java实现properties文件读取

    使用`InputStream`来读取Properties文件,然后调用`load()`方法加载文件内容。这通常在程序启动时进行。 ```java try { InputStream input = new FileInputStream("config.properties"); prop.load(input); } ...

    读取.properties文件

    在Java编程中,读取`.properties`文件是一个常见的任务,这些文件通常用于存储配置信息,如数据库连接字符串、系统参数等。`.properties`文件是一种基于键值对的文本格式,易于理解和编辑。在这个场景中,我们将探讨...

    Java读取.properties文件

    这里是如何使用类加载器读取`.properties`文件的示例: ```java InputStream is = TestProperties.class.getResourceAsStream("/config.properties"); prop.load(is); ``` 此外,`.properties`文件中的特殊字符,...

    JAVA读取properties文件的值

    总结,Java中的`Properties`类是读取和管理`.properties`文件的关键工具。通过使用它,开发者可以方便地管理和使用配置信息,同时还可以利用Spring框架提供的`@ConfigurationProperties`实现更高级的绑定功能。正确...

Global site tag (gtag.js) - Google Analytics