0
回答
一个用Digester处理XML配置的例子
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

1. 一个数据库链接池配置文件的内容
<?xml version="1.0" encoding="GBK"?>
<service>    
   <!-- 数据源配置 -->
   <data-sources>
        <data-source name="mcp">  
            <driverClassName>sun.jdbc.odbc.JdbcOdbcDriver</driverClassName>
            <url>jdbc:odbc:testdb</url>
            <username>admin</username>
            <password></password>
            <maxActive>20</maxActive>
            <maxWait>5000</maxWait>
            <defaultAutoCommit>true</defaultAutoCommit>
            <defaultReadOnly>false</defaultReadOnly>
            <validationQuery>SELECT 1</validationQuery>
            <removeAbandoned>true</removeAbandoned>
            <removeAbandonedTimeout>120</removeAbandonedTimeout>
        </data-source>
    <data-sources>
</service>
2. 定义一个对象类,该类对应一个数据源(因为允许同时存在多个数据源)
package com.clickcom.sms;

import java.io.File;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.lang.StringUtils;

/**
 * MCP数据源
 * @author liudong
 */
public class McpDataSource extends BasicDataSource {
    
    String name;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public void setUrl(String url) {        
        String path = new File("").getAbsolutePath();
        this.url = StringUtils.replace(url,"${app}",path);
    }
}
3. 配置解析类

package com.clickcom.sms;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import javax.sql.DataSource;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.ExtendedBaseRules;
import org.xml.sax.SAXException;

/**
 * 数据源
 * @author liudong
 */
public class McpDataSourceFactory {

    private HashMap dataSources = new HashMap();

    /**
     * 初始化数据源
     * 
     * @param config
     * @param base
     * @return @throws
     *         IOException
     * @throws SAXException
     */
    protected synchronized static McpDataSourceFactory initDataSources(
            String config, String base) throws IOException, SAXException {
        String key = base + "/data-source";
        Digester dig = new Digester();
        dig.setValidating(false);
        dig.setRules(new ExtendedBaseRules());
        dig.addObjectCreate(base, McpDataSourceFactory.class);
        dig.addObjectCreate(key, McpDataSource.class);
        dig.addSetProperties(key);
        dig.addBeanPropertySetter(key + "/?");
        dig.addSetNext(key, "addDataSource");
        return (McpDataSourceFactory) dig.parse(config);
    }
    /**
     * 添加数据源,该方法只由Digester调用
     * @param ds
     */
    public final void addDataSource(McpDataSource ds) {
        if (ds != null) dataSources.put(ds.getName(), ds);
    }

    public int size() {
        return dataSources.size();
    }
    /**
     * 获取第一个数据源,该方法用于当数据源只有一个的时候获取其实例
     * @return
     */
    public DataSource getDataSource() {
        Iterator dss = dataSources.values().iterator();
        return dss.hasNext() ? (McpDataSource) dss.next() : null;
    }
    /**
     * 获取指定名称的数据源
     * @param key
     * @return
     */
    public DataSource getDataSource(Object key) {
        return (McpDataSource) dataSources.get(key);
    }
    /**
     * 获取第一个数据源的连接,该方法用于当数据源只有一个的时候获取其实例
     * @return
     */
    public Connection getConnection() throws SQLException {
        Iterator dss = dataSources.values().iterator();
        return dss.hasNext() ? ((McpDataSource) dss.next()).getConnection() : null;
    }
    /**
     * 获取指定名称的数据源的连接
     * @param key
     * @return
     */
    public Connection getConnection(Object key) throws SQLException {
        return ((McpDataSource) dataSources.get(key)).getConnection();
    }
    /**
     * 获取所有的数据源名称
     * @return
     */
    public Set names() {
        return dataSources.keySet();
    }
    /**
     * 获取所有的数据源实例
     * @return
     */
    public Iterator datasources() {
        return dataSources.values().iterator();
    }

    public static void main(String[] args) throws Exception {
        McpDataSourceFactory mdsf = McpDataSourceFactory.initDataSources(
                "export/mcp-config.xml", "service/data-sources");
        Iterator names = mdsf.names().iterator();
        while (names.hasNext())
            System.out.println(names.next());
    }

}

开发的思路我先不写了,把这个例子贴出来照着它试试就有感觉了:)

举报
红薯
发帖于9年前 0回/839阅
顶部