XML建模

建模分两步:
1、以面向对象的编程思想,描述xml资源文件。

2、将xml文件中内容封装进model实体对象。

导入文件: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标签:可以包含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>

新建类:ConfigModel.java

package com.zking.model;

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

public class 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);
		
		
	}
	
}

  

新建类:Actionmodel.java

package com.zking.model;

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

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 void push(ForwardModel forwardModel) {
		fmap.put(forwardModel.getName(), forwardModel);
	}
	
	
	public ForwardModel pop(String name) {
		return fmap.get(name);
		
	}
	
	
	
	

}

  

新建类:ForwardModel.java

package com.zking.model;

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;
	}
	
	

	
}

  

新建类:ConfigModelFactory.java

package com.zking.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;

/*
 * 23设计模式之一
 * 工厂模式
 *  设计模式是一种解决方案,就是为了处理java中所遇到的特定的一些问题
 *  	解决什么问题呢?
 *  它是用来将资源文件生产指定的实体类
 *  好处:
 *  提高了代码的复用性
 */
public class ConfigModelFactory {

	
	public static ConfigModel build() throws DocumentException {
		return ConfigModel("/config.xml");
	}

	/*
	 * 生产出有类内容的实体类configmodel
	 */
	private static ConfigModel ConfigModel(String string) throws DocumentException {
		ConfigModel configModel=new ConfigModel();
		Actionmodel actionmodel=null;
		ForwardModel forwardModel=null;	
		InputStream in=	ConfigModelFactory.class.getResourceAsStream(string);
		SAXReader reader=new SAXReader();
		Document document=reader.read(in);
		List<Element> list= document.selectNodes("/config/action");
		for (Element element : list) {
			actionmodel=new Actionmodel();
		//给actionmodel对象填充xml中的action标签的内容
			actionmodel.setPath(element.attributeValue("path"));
			actionmodel.setType(element.attributeValue("type"));
			
			List<Element> list2= element.selectNodes("forward");
			for (Element element2 : list2) {
				forwardModel =new ForwardModel();	
				//给forwardmodel对象填充xml中的action标签的内容
				forwardModel.setName(element2.attributeValue("name"));
				forwardModel.setPath(element2.attributeValue("path"));
				forwardModel.setRedirect(!"false".equals(element2.attributeValue("redirect")));
				//<forward name="failed" path="/reg.jsp" redirect="false" />
				//resirect默认是true
				//只有填了false才是转发
				//element2.attributeValue("redirect")拿到的是xml中你所填的值
				//不填       重定向    	"false".equals(element2.attributeValue("redirect"))是false
//				填   true  定向		"false".equals(element2.attributeValue("redirect"))是false
				//填false  转发	false".equals(element2.attributeValue("redirect"))是true
					
				
				
//				
				
			actionmodel.push(forwardModel);
			
			}
			
			
			
			
			configModel.push(actionmodel);
		}
		
		return configModel;
	}
	
	public static void main(String[] args) throws DocumentException {
		ConfigModel  configModel=ConfigModelFactory.build();
		Actionmodel actionmodel=configModel.pop("/loginAction");
//		System.out.println(actionmodel.getType());
		
		ForwardModel forwardModel=actionmodel.pop("success");
		System.out.println(actionmodel.getType());
		System.out.println(forwardModel.getPath());
	}
	
}

  

注释:

本项目一共导用了两个jar包:dom4j-1.6.1.jar     jaxen-1.1-beta-6.jar  

原文地址:https://www.cnblogs.com/BAYOUA/p/11018516.html