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. COGS 942. [東方S3] 比那名居天子

    Problem 1 比那名居天子(tenshi.cpp/c/pas) 题目描述 在幻想乡,比那名居天子是管理着『要石』的天人.『要石』是能够引发和镇压地震的存在,当然也可以用来改变地形.因为在幻想乡引 ...

  2. JavaSE-29 Java8的Lambda表达式

    概念说明 Lambda表达式是Java8提供的新特性,支持将代码块作为方法的参数. Lambda表达式支持使用简洁的代码创建只有一个方法的接口(函数式接口). 只包含一个方法的接口也称为函数式接口. ...

  3. idea java 注释模板配置

    在网上找了好久,好多的文章都有一个共同的病点就是“@param注释当有多个参数时候,全部放在了一行里面”,非常不友好. 以下是我整理好的,完全按照eclipse的注释风格. !!!先看最后实现的效果图 ...

  4. git 超时 时长 设置?

    [Pipeline] { (Checkout) [Pipeline] checkout > git.exe rev-parse --is-inside-work-tree # timeout=1 ...

  5. 远程桌面mstsc关闭连接栏

    在进行mstsc远程桌面连接电脑或者虚拟机的时候,总是会出现一个连接栏.虽然点左边的图钉可以自动隐藏,但是每次鼠标滑到上面的时候,还是会冒出来,这个就有点烦心了. 查了下资料,解决了这个问题. 关闭步 ...

  6. <Spring Data JPA>一 JPA原生

    1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  7. 用户管理命令--useradd

    用户管理命令--useradd 作用:用于添加一个新的用户 格式:useradd [ 选项 ] 用户名 选项的常用介绍 -u: UID指定用户id,必须是唯一的,并且大于499 -c: 添加注释,可以 ...

  8. linux wget变成000权限

    今天使用wget下载文件时出现:-bash: /usr/bin/wget: 权限不够. 查看  /usr/bin/wget 的权限为: ---------- 1 root root 357400 3月 ...

  9. ssh和sshd服务

    1.1 对称加密和非对称加密 对称加密:加密和解密使用一样的算法,只要解密时提供与加密时一致的密码就可以完成解密.例如QQ登录密码,银行卡密码,只要保证密码正确就可以. 非对称加密:通过公钥(publ ...

  10. 网易技术分享:Nginx缓存引发的跨域惨案

    推荐:更多技术团队分享文章 关注:MAYOU18技术专栏 1. 前言 贵金属wap版直播间上线后,偶尔有用户反馈,在进入wap直播间的时候,出现空白页面,但是重新刷新又可以正常显示了.我们曾一度认为是 ...