XML建模的含义
- 建模是一项经过检验并被广为接受的工程技术。我们建立的房屋和大厦的建筑模型能帮助用户得到实际建筑物的印像。为了分析大风或地震对建筑物造成的影响,我们甚至可以建立数学模型。
基本含义就是:模型提供了系统的蓝图。模型既可以包括详细的计划,也可以包括从很高的层次考虑系统的总体计划。一个好的模型包括那些有广泛影响的主要元素,而忽略那些 与给定的抽象水平不相关的次要元素。每个系统都可以从不同的方面用不同的模型来描述,因而每个模型都是一个在语义上闭合的系统抽象。模型可以是结构性的, 强调系统的组织;它也可以是行为性的,强调系统的动态方面。
建模的由来
- 就是将指定的xml字符串当作对象来操作
如果说当对一个指定的xml格式字符串完成了建模操作,好处在于,只需要调用指定的方法就可以完成预定的字符串获取;
我们为什么要建模?一个基本理由是:
- 我们建模是为了能够更好地理解我们正在开发的系统。
- 模型帮助我们按照实际情况或按照我们所需要的样式对系统进行可视化。
- 模型允许我们详细说明系统的结构或行为。
- 模型给出了一个指导我们构造系统的模板。
- 模型对我们作出的决策进行文档化。
建模的思路
1、分析需要被建模的文件中有那几个对象
2、每个对象拥有的行为以及属性
3、定义对象从小到大(从里到外)
4、通过23种的设计模式中的工厂模式,解析xml生产出指定对象
5、好处:提高代码的复用性
案例
建模分两步:
1、以面向对象的编程思想,描述xml资源文件
2、将xml文件中标签内容由内到外的封装进model实体对象。
这是一个xml的资源文件:config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- config标签:可以包含0~N个action标签 -->
<!-- action标签:可以饱含0~N个forward标签 path:以/开头的字符串,并且值必须唯一 非空 type:字符串,非空 -->
<!-- forward标签:没有子标签; name:字符串,同一action标签下的forward标签name值不能相同 ; path:以/开头的字符串
redirect:只能是false|true,允许空,默认值为false -->
<config>
<action path="/regAction" type="test.RegAction">
<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="a" path="/login.jsp" redirect="false" />
<forward name="b" path="/main.jsp" redirect="true" />
</action>
</config>
-
再是从他们的标签,由内而外的建立实体对象
分别是:ForwardModel
public class ForwardModel {
private String name;
private String path;
private boolean redirect;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean isRedirect() {
return redirect;
}
public void setRedirect(boolean redirect) {
this.redirect = redirect;
}
}
ActionModel
public class ActionModel {
private String path;
private String type;
private Map<String, ForwardModel> fMap =new HashMap<>();
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void push(ForwardModel forwardModel) {
fMap.put(forwardModel.getName(), forwardModel);
}
public ForwardModel pop(String name) {
return fMap.get(name);
}
}
ConfigModel
public class ConfigModel {
private Map<String, ActionModel> acMap =new HashMap<>();
public void push(ActionModel actionModel) {
acMap.put(actionModel.getPath(), actionModel);
}
public ActionModel pop (String path) {
return acMap.get(path);
}
}
注:属性为String类型,子元素标签则是map的值,子元素标签的唯一标识则为map的值
- 在是建立一个自己所需要的模型。
ConfigModelFactory
public class ConfigModelFactory {
public static ConfigModel build() throws Exception {
return build("config.xml");
}
public static ConfigModel build(String xmlPath) throws Exception {
ConfigModel configModel =new ConfigModel();
InputStream in = ConfigModelFactory.class.getResourceAsStream(xmlPath);
SAXReader saxReader =new SAXReader();
Document doc = saxReader.read(in);
ActionModel actionModel =null;
ForwardModel forwardModel =null;
List <Element> aElements = doc.selectNodes("/config/action");
for (Element actione : aElements) {
actionModel =new ActionModel();
//接下来需要往actionModel中填充内容
actionModel.setPath(actione.attributeValue("path"));
actionModel.setType(actione.attributeValue("type"));
List <Element> foList = actione.selectNodes("forward");
for (Element fols : foList) {
forwardModel =new ForwardModel();
//接下来需要往forwardMode
forwardModel.setName(fols.attributeValue("name"));
forwardModel.setPath(fols.attributeValue("path"));
forwardModel.setRedirect(!"false".equals(fols.attributeValue("redirect")));
actionModel.push(forwardModel);
}
configModel.push(actionModel);
}
return configModel;
}
public static void main(String[] args) throws Exception {
ConfigModel configModel = ConfigModelFactory.build();
ActionModel actionModel = configModel.pop("/loginAction");
System.out.println(actionModel.getPath()+" "+actionModel.getType() +" "+actionModel.equals(configModel) );//获取它的path值 和type值
ForwardModel forwardModel =actionModel.pop("b");
System.out.println(forwardModel.getName()+" "+forwardModel.getPath() +" "+ forwardModel.isRedirect()); // 获取他的name值 和path值
}
}
- 我们最后就是通过name键来获取其他的值,允许的结果为: