XML建模分析

什么是XML建模

什么是xml建模:
XML建模主要是针对数据存储所开发,XML建模就是将指定的XML字符串当做对象操作,好处在于,只需要调用指定的方法就可以完成预定的字符串获取;

建模思路

1.分析需要被建模的文件中有哪几个对象:
如下config.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config[
	<!ELEMENT config (action*)>
	<!ELEMENT action (forward*)>
	<!ELEMENT forward EMPTY>
	<!ATTLIST action
	  path CDATA #REQUIRED
	  type CDATA #REQUIRED
	>
	<!ATTLIST forward
	  name CDATA #REQUIRED
	  path CDATA #REQUIRED
	  redirect (true|false) "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="failed" path="/login.jsp" redirect="false" />
		<forward name="success" path="/main.jsp" redirect="true" />
	</action>
</config>

从代码中可以看到有三个对象需要建模,分别是:config,action,forward

2.每个对象拥有的行为以及属性
还是上面的config.xml文件:
首先是forward对象它的行为只有获取,属性是name,path,redirect(redirect属性是boolean类型(只有xml中填写了false,它才代表转发)),然后看action对象,它的行为有新增和获取两种行为,因为action对象内部forward对象有多个forward还可以增加,action属性有path,type
3、定义对象从小到大(从里到外)

4、通过23种的设计模式中的工厂模式,解析xml生产出指定对象

XML建模

forward对象

/**
 * 
 */
package com.shegx.model;

/**
 * @author SHE
 *
 * 2020年5月22日下午7:46:00
 *  com.shegx.model
 */
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;
	}
	
	
	
}

action对象

/**
 * 
 */
package com.shegx.model;

import java.util.HashMap;
import java.util.Map;

/**
 * @author SHE
 *
 * 2020年5月22日下午7:46:35
 *  com.shegx.model
 */
public class Actionmodel {

	private String path;
	private String type;
	//用一个map集合存储forwardmodel
	private Map<String, ForwardModel> foMap=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;
	}

	//两个行为
	/**
	 * 将指定的forwardModel压入当前actionModel对象中
	 * <forward>标签放入<action>中
	 * @param forwarModel
	 */
	public void push(ForwardModel forwarModel) {
		foMap.put(forwarModel.getName(), forwarModel);
	}
	
	public ForwardModel pop(String name) {
		return foMap.get(name);
	}
	
	
	
}

config对象

/**
 * 
 */
package com.shegx.model;

import java.util.HashMap;
import java.util.Map;

/**
 * @author SHE
 *
 * 2020年5月22日下午7:47:09
 *  com.shegx.model
 */
public class ConfidModel {
private Map<String, Actionmodel> acMap=new HashMap<String, Actionmodel>();
	
	
//两个行为
	/**
	 * 将指定的Actionmodel压入当前ConfidModel对象中
	 * <action>标签放入<confid>中
	 * @param Actionmodel
	 */
	public void push(Actionmodel actionModel) {
		acMap.put(actionModel.getPath(), actionModel);
	}
	
	public Actionmodel pop(String path) {
		return acMap.get(path);
	}
	
	
}

然后创建一个工厂类:

ConfigModelFactory

/**
 * 
 */
package com.shegx.model;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * @author SHE
 *
 *工厂模式将代码封装,提高了代码的复用性
 *一般工厂类一定会有一个方法,就是生产指定模型对象方法
 *
 *在工厂类中会有两个以上的构造方法,一个是默认框架路径的模型对象构造方法,
 *还有一个是动态读取任意位置下的框架配置文件
 *
 * 2020年5月22日下午8:20:48
 *  com.shegx.model
 */
public class ConfigModelFactory {

	/**
	 * 通过资源文件构造对应的模型对象
	 * @param path  具体的资源路径
	 * @return
	 * @throws Exception 
	 */
	public static ConfidModel build(String path) throws Exception {
	//将文件转换为流
		InputStream is = ConfigModelFactory.class.getResourceAsStream(path);
		//定义一个saxreader对象
		SAXReader reader=new SAXReader();
		//将流转换为Dcumect对象
		Document doc = reader.read(is);
		//接下来把类容填充到configModel对象中(doc.asMxl--->config.xml)
		ConfidModel confidModel=new ConfidModel();
		Actionmodel actionModel=null;//定义ActionMOdel对象
		ForwardModel forwardModel=null;//定义Forwardmodel对象
		List<Element> actionEles = doc.selectNodes("/config/action");//从doc对象中取出
		for (Element action : actionEles) {//集合遍历取值
			actionModel=new Actionmodel();//实例化ActionModel对象
			//对ActionModel中的path设值
			actionModel.setPath(action.attributeValue("path"));
			//对ActionModel中的type设值
			actionModel.setType(action.attributeValue("type"));
			
			//给actionModel中放入forwardmodel对象
			//拿到forward标签类容
			List<Element> forwardEles = action.selectNodes("forward");
			for (Element forward : forwardEles) {
				forwardModel=new ForwardModel();
				forwardModel.setName(forward.attributeValue("name"));
				forwardModel.setPath(forward.attributeValue("path"));
				//redirect属性是boolean类型(只有xml中填写了false,它才代表转发)
				forwardModel.setRedirect("false".equals(forward.attributeValue("redirect")));
				//将赋值好的forwardModel对象,压到ActionModel集合
				actionModel.push(forwardModel);
			}
			//将赋值好的actionmodel对象,压到confidmodel集合
			confidModel.push(actionModel);
		}
		
		
		return confidModel;
	}
	
public static ConfidModel build() throws Exception {
		
		return build("/config.xml");
	}
	

        public static void main(String[] args) throws Exception {
			//定义一个configmodel对象,数据从ConfigModelFactory类中的build()获取数据
        	ConfidModel model = ConfigModelFactory.build();
        	//需求:获取loginAction所在属性的type
        	Actionmodel actionmodel = model.pop("/loginAction");
        	System.out.println(actionmodel.getType());
        	//需求:获取/loginAction下success结果码对应的页面/main.jsp
        	ForwardModel forward = actionmodel.pop("success");
        	System.out.println(forward.getPath());
        	
		}	
	
}

结果·:
在这里插入图片描述

总结

XML建模使XML解析变得高效,简单,提高了代码的复用性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值