Digester在项目中应用

Digester由"事件"驱动,通过调用预定义的规则操作对象栈,将XML文件转换为Java对象。

对使用者而言,Digester的核心在于匹配模式与规则(matching pattern + rule)。

其实就两点:

1、用一个XML文件定义Java对象的状态(数据源文件),

2、另一个XML文件定义装载数据源文件的装载逻辑

场景:

CRM要调用帐管的接口查帐单,由于帐管接口未定下来,或者经常变动。

所以先定义好帐单类,因为展示形式相对固定,所以可以先定义好类。

然后

		String result = external2Oss.ossRequest(param);//帐管返回的帐单字符串
		if (param.getRequestNo()==5) {
			result="<?xml version='1.0' encoding='GBK'?><oss-response>	<BillInfo billCycle='20070701_20070801' totalCharge='130.0' unpaymentCharge='130.0' thisCharge='130.0' prepayCharge='0.0' adustmentCharge='0.0' freeCharge='0.0'></BillInfo></oss-response>";
		}
		String clsName = t.getName().replaceAll("\\.", "/") + ".xml";
		URL rulesURL = t.getClassLoader().getResource(clsName);
		Digester d = DigesterLoader.createDigester(rulesURL);
		d.push(obj);
		InputStream is = new ByteArrayInputStream(result.getBytes("GBK"));
		d.parse(is);

 这样,以后改了接口的时候只要修改XML即可。

应用场景:

1.appframe解析defaults.xml

    at org.apache.commons.digester.Digester.parse(Digester.java:1666)
    at com.ai.appframe2.complex.xml.XMLHelper.createDefaults(XMLHelper.java:304)
    at com.ai.appframe2.complex.xml.XMLHelper.getInstance(XMLHelper.java:79)
    at com.ai.appframe2.service.ServiceFactory.<clinit>(ServiceFactory.java:27)

2.tomcat解析server.xml

catalina.java

    protected Digester createStartDigester() {
        long t1=System.currentTimeMillis();
        // Initialize the digester
        Digester digester = new Digester();
        digester.setValidating(false);
        digester.setRulesValidation(true);
        HashMap<Class, List<String>> fakeAttributes = new HashMap<Class, List<String>>();
        ArrayList<String> attrs = new ArrayList<String>();
        attrs.add("className");
        fakeAttributes.put(Object.class, attrs);
        digester.setFakeAttributes(fakeAttributes);
        digester.setClassLoader(StandardServer.class.getClassLoader());

        // Configure the actions we will be using
        digester.addObjectCreate("Server",
                                 "org.apache.catalina.core.StandardServer",
                                 "className");
        digester.addSetProperties("Server");
        digester.addSetNext("Server",
                            "setServer",
                            "org.apache.catalina.Server");

        digester.addObjectCreate("Server/GlobalNamingResources",
                                 "org.apache.catalina.deploy.NamingResources");....

猜你喜欢

转载自cwj158.iteye.com/blog/1171233