package com.coderising.litestruts.parser; import com.alibaba.fastjson.JSON; import org.apache.commons.digester.Digester; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; import java.io.File; import java.io.IOException; /** * 解析 struts.xml 文件 * @apiNote 借鉴 http://www.everycoding.com/coding/78.html; http://blog.csdn.net/caihaijiang/article/details/5944955 * Created by luoziyihao on 3/5/17. */ public class DefaultStrutsParser implements StrutsParser { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public StrutsConfig parser(String filePathInClasspath) { String path = this.getClass().getClassLoader().getResource(filePathInClasspath).getPath(); File input = new File(path); Digester digester = new Digester(); // 创建 StrutsConfig 对象 digester.addObjectCreate("struts", StrutsConfig.class); // 将 struts 节点上的attribute属性映射到 StrutsConfig 对象的属性上 digester.addSetProperties("struts"); digester.addObjectCreate("struts/action", ActionConfig.class); // 将 struts/action 节点上的attribute属性映射到 Action 对象的属性上, 并自定义属性映射 digester.addSetProperties("struts/action" , new String[]{"name", "class"}, new String[]{"name", "className"}); digester.addObjectCreate("struts/action/result", Result.class); digester.addSetProperties("struts/action/result" , new String[]{"name"}, new String[]{"name"}); // 将 struts/action/result 节点上的body属性映射到 Result 对象的属性上 digester.addCallMethod("struts/action/result", "setView", 0); // 对应struts/action/result 生成的对象添加到 Action中 digester.addSetNext("struts/action/result", "addResult"); // 对应struts/action 生成的对象添加到 Struts中 digester.addSetNext("struts/action", "addAction"); try { StrutsConfig strutsConfig = (StrutsConfig) digester.parse(input); logger.debug("strutsConfig={}", JSON.toJSONString(strutsConfig)); return strutsConfig; } catch (IOException | SAXException e) { throw new IllegalStateException(e); } } }