什么是XML建模
将XML配置文件中的元素、属性、文本信息转换成对象过程叫做XML建模
XML建模的思路
- 根据XML配置文件元素节点创建元素节点实体类
- 利用dom4j + xpath 技术实现建模
XML建模的步骤(以config.xml为例)
- 分析xml文件config.xml
- config节点下有多个子action节点,无节点属性,包含0~n个action标签
- action节点有多个forward节点,有节点属性,action标签:可以包含0~N个forward标签 path:以/开头的字符串,并且值必须唯一 非空 type:字符串,非空
- forward节点下没有子节点 ,有节点属性
- name:字符串同一action标签下的forward标签name属性值不能
- path : 以/开头的字符串
- redirect :只能false|true,允许为空,默认值为false
- 根据XML中元素节点的情况(DTD) 来定义ConfigModel、ActionModel、ForwardModel对象模型
- config 节点------->configModel对象
- 属性:无
- 行为 : 在集合中增加ActionModel对象,通过path找到对应的ActionModel对象
- action节点------->ActionModel对象
- 属性:path ,type
- 行为 : 在集合中添加ForwardModel对象,通过name找到对应的ForwardModel对象
- forward节点-------->ForwardModel对象
- 属性: name 、path、redirect
- 行为:无
- 使用Map集合存放节点元素,其中key为节点唯一属性,value为整个子节点对象
- 利用工厂模式 + dom4j + xpath解析Xml配置文件
XML建模的代码实现思路
- 获取io流
- 创建xml读取工具类SaxReader对象
- 读取config.xml文件,获取document对象
- 通过document对象中的selectNodes()方法找到action节点
- 遍历action节点,获取action节点中的path、type属性值,并设置ActionModel对象中
- 通过document找到该action节点下forward节点
- 表里forward节点、获取forward节点中的name、path、redirect属性值,并设置到ForwardModel对象中
- 将fordaerModel对象设置到ActionModel中的map集合中,以name属性值为键,属性为值
- 将actionMode对象放到ConfigModel对象中,完成建模
config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
config标签:可以包含0~N个action标签
-->
<config>
<!--
action标签:可以饱含0~N个forward标签
path:以/开头的字符串,并且值必须唯一 非空
type:字符串,非空
-->
<action path="/regAction" type="test.RegAction">
<!--
forward标签:没有子标签;
name:字符串,同一action标签下的forward标签name值不能相同 ;
path:以/开头的字符串
redirect:只能是false|true,允许空,默认值为false
-->
<forward name="failed" path="/reg.jsp" redirect="false" />
<forward name="success" path="/login.jsp" redirect="true" />
</action>
<action path="/loginAction" type="test.LoginAction">
<forward name="failed" path="/login.jsp" redirect="false" />
<forward name="success" path="/main.jsp" redirect="true" />
</action>
</config>
将有子节点并且子节点有属性 那这个有子节点的这个实体类 可加俩方法 (用来将子节点的 实体类对象放到父节点的map集合中) 如下:
forward是action的子节点 该实体类的两个方法
//静态方法
public static ConfigModel createConfiModel(String path) {
ForwardModel fm=null;
ActionModel am=null;
ConfigModel cm = new ConfigModel();
InputStream is = ConfigModelFactory.class.getResourceAsStream("/config");
//2.获取Saxreader 读取器对象
SAXReader rs=new SAXReader();
try {
//3.读取配置文件,获取document对象
Document read = rs.read(is);
//4.使用xpath解析
List<Node> actionNodes = read.selectNodes("/config/action");
//5.遍历action节点取出path、type属性值
for (Node actionNode : actionNodes) {
//没有属性值 必须转换成Element
Element actionel=(Element)actionNode;
//取属性值
String actionpath = actionel.attributeValue("path");
String actiontype = actionel.attributeValue("type");
//给ActionModel对象属性设置值
am =new ActionModel();
am.setPath(actionpath);
am.setType(actiontype);
//取action标签下的子标签forward
List<Node> forwardNodes = actionNode.selectNodes("forward");
//遍历取forward的name、path、属性值
for (Node forwardNode : forwardNodes) {
//没有属性值需要转换成Element
Element forwardel=(Element)forwardNode;
//取属性值
String forwardname = forwardel.attributeValue("name");
String forwardpath = forwardel.attributeValue("path");
String redirect = forwardel.attributeValue("redirect");
//设置forwardModel对象中的属性
fm = new ForwardModel();
fm.setName(forwardname);
fm.setPath(forwardpath);
fm.setRedirect(Boolean.parseBoolean(redirect));
// 将action下的forward对象增加到ActionModel中的map集合中
am.put(fm);
}
//将action对象增加到ConfigModel对象中的amp集合中
cm.put(am);
}
} catch (DocumentException e) {
e.printStackTrace();
}
return cm;
}