1.建模的由来

就是将指定的xml字符串当作对象来操作
如果说当对一个指定的xml格式字符串完成了建模操作,
好处在于,只需要调用指定的方法就可以完成预定的字符串获取;

2.建模的思路
1、分析需要被建模的文件中有那几个对象
2、每个对象拥有的行为以及属性
3、定义对象从小到大(从里到外)
4、通过23种的设计模式中的工厂模式,解析xml生产出指定对象

好处:
提高代码的复用性

分析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>

定义XML模型对象

1.ForwardModel

public class ForwardModel {
// <forward name="failed" path="/login.jsp" redirect="false" />
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;
}

  

2.ActionModel

public class ActionModel {
// <action path="/loginAction" type="test.LoginAction">
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 Map<String, ForwardModel> getFmap() {
return fmap;
} public void setFmap(Map<String, ForwardModel> fmap) {
this.fmap = fmap;
} //添加
public void push(ForwardModel forwardModel) {
fmap.put(forwardModel.getName(), forwardModel);
}
//通过name获取对象
public ForwardModel pop(String name) {
return fmap.get(name);
}
}

  

ConfigModel

 private Map<String, ActionModel> amap=new HashMap();

   public void push(ActionModel actionModel) {
amap.put(actionModel.getPath(), actionModel);
} public ActionModel pop(String path) {
return amap.get(path);
}

ConfigModelFactory(工厂模式用来将资源文件生产指定的实体类)

public class ConfigModelFactory {

	public static ConfigModel  build() throws Exception {
return configModel("config.xml");
} /**
* 生产出有内容的实体类configModel
* @param xmlPath
* @return
* @throws Exception
*/
public static ConfigModel configModel(String xmlPath) throws Exception {
ConfigModel configModel=new ConfigModel();
ActionModel actionModel=null;
ForwardModel forwardModel=null;
InputStream in=ConfigModelFactory.class.getResourceAsStream(xmlPath);
SAXReader sax=new SAXReader();
Document doc=sax.read(in);
List<Element> actionEles= doc.selectNodes("/config/action");
for (Element actionEle : actionEles) {
actionModel=new ActionModel();
//给actionModel对象填充xml中的action标签的内容
actionModel.setPath(actionEle.attributeValue("path"));
actionModel.setType(actionEle.attributeValue("type")); List<Element> forwardEles=actionEle.selectNodes("forward");
for (Element forwardEle : forwardEles) {
forwardModel=new ForwardModel();
//给forwardModel对象填充xml中的forward标签的内容
forwardModel.setName(forwardEle.attributeValue("name"));
forwardModel.setPath(forwardEle.attributeValue("path"));
forwardModel.setRedirect(!"false".equals(forwardEle.attributeValue(("redirect"))));
// <forward name="failed" path="/reg.jsp" redirect="false" />
// redirect默认是true 重定向 只有填了false才是转发
//forwardEle.attributeValue(("redirect"))拿到的是xml中你所填的值
// 不填 重定向 "false".equals(forwardEle.attributeValue(("redirect")))是false
// 填 true 重定向 "false".equals(forwardEle.attributeValue(("redirect")))是false
// 填flase 转发 "false".equals(forwardEle.attributeValue(("redirect")))true;
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");
ForwardModel forwardModel=actionModel.pop("success");
System.out.println( actionModel.getType());
System.out.println(forwardModel.getPath()); }
}

  对web.xml进行建模,链接https://i.cnblogs.com/Files.aspx

xml建模的更多相关文章

  1. Xml解析作业与Xml建模andXml建模作业

    作业:config.xml解析 1.获取所有action中的type的值 public static void main(String[] args) throws Exception { Input ...

  2. XML建模实列

    XML建模 建模的由来: 就是将指定的xml字符串当作对象来操作           好处在于,只需要调用指定的方法就可以完成预定的字符串获取: 建模的一个思路: 1.分析需要被建模的文件中有那几个对 ...

  3. xml的建模

    xml建模的思路 1.分析需要被建模的文件中有那几个对象 2.每个对象拥有的行为以及属性 3.定义对象从小到大(从里到外) 4.通过23种的设计模式中的工厂模式,解析xml生产出指定对象 建模的好处 ...

  4. W3C XML Schema 教程

    转自:http://www.blogjava.net/sham2k/articles/179825.html W3C XML Schema 教程 XML SCHEMA教程 本教程是笔者学习W3C的&l ...

  5. UVM中的regmodel建模(一)

    UVM中的regmodel继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器模型进行XML建模,再通过Synopsys 家的工具ralgen来直接生成regmo ...

  6. javacv 340使用 人脸检测例子【转载】

    Java下使用opencv进行人脸检测 工作需要,研究下人脸识别,发现opencv比较常用,尽管能检测人脸,但识别率不高,多数是用来获取摄像头的视频流的,提取里面的视频帧,实现人脸识别时通常会和其他框 ...

  7. hive 下篇

    由于spark on hive 问题,导致无法插入数据,暂时使用spark进行hive操作 向分区表插入数据 hive> show partitions customers;OKpartitio ...

  8. uvm_reg_model——寄存器模型(一)

    对于一个复杂设计,寄存器模型要能够模拟任意数量的寄存器域操作.UVM提供标准的基类库,UVM的寄存器模型来自于继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器 ...

  9. 自定义简单算法MVC框架

    什么是MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,   它是一种软件设计典范,用一种业务逻辑.数据 ...

随机推荐

  1. javascript innerHTML 大数据量加载 导致IE 内存溢出 的解决办法

    在做 ajax 滚动加载的时候,越到后面 数据量越大,使用obj.innerHTML+=row添加到页面的时候,出现ie内存不足的情况,此时使用createDocumentFragment,创建一个文 ...

  2. 洛谷 P1454 圣诞夜的极光 == codevs 1293 送给圣诞夜的极光

    题目背景 圣诞夜系列~~ 题目描述 圣诞老人回到了北极圣诞区,已经快到12点了.也就是说极光表演要开始了.这里的极光不是极地特有的自然极光景象.而是圣诞老人主持的人造极光. 轰隆隆……烟花响起(来自中 ...

  3. Elasticsearch 插入地理索引文档一直为空

    今天在获取插入索引数据的时候,一直提示插入不成功,尝试了很多方法,原来是因为在插入的时候应该先 插入Latitude后插入longitude修改后的代码如下 public boolean insert ...

  4. SQLite -创建表

    SQLite -创建表 SQLite CREATE TABLE语句用于创建一个新表在任何给定的数据库.创建一个基本表包括表命名和定义其列,每列的数据类型 语法: CREATE TABLE语句的基本语法 ...

  5. 11gR2集群件任务角色分离(Job Role Separation)简介

       从11gR2版本开始,Oracle推荐使用不同的操作系统用户安装GI和数据库软件,例如:使用grid用户安装GI,使用Oracle用户安装数据库软件.当然,用户还是可以使用Oracle用户安装G ...

  6. html归纳

      onload的用法 表格属性 定时器(测试能否让for循环暂停5秒) 实现表格的滚动条效果 ① table中th的样式:  white-space: nowrap;  单元格内容不换行:② 设置装 ...

  7. dircolors - 设置‘ls'显示结果的颜色

    SYNOPSIS[总览] dircolors [-b] [--sh] [--bourne-shell] [-c] [--csh] [--c-shell] [-p] [--print-database] ...

  8. 朴素贝叶斯法(naive Bayes)

    <统计学习方法>(第二版)第4章 4 朴素贝叶斯法 生成模型 4.1 学习与分类 基于特征条件独立假设学习输入输出的联合概率分布 基于联合概率分布,利用贝叶斯定理求出后验概率最大的输出 条 ...

  9. iview modal 点击打开窗口,打开前先销毁里面的内容再打开

    <Modal v-model="addSubOrgModal" @on-cancel="addSubOrgCancel" @on-visible-chan ...

  10. 基础数据类型(set集合)

    认识集合 由一个或多个确定的元素所构成的整体叫做集合. 集合中的元素有三个特征: 1.确定性(集合中的元素必须是确定的) 2.互异性(集合中的元素互不相同.例如:集合A={1,a},则a不能等于1) ...