XML建模+案例

什么是XML建模

	一句话:将XML配置文件中的元素,属性,文本信息 转换成对象的过程叫XML建模。

建模的由来

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

建模的思路

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

以config.xml为对象完成建模

<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对象->Config类
	属性:没有属性
	行为:新增Action对象的行为,通过action path属性查找Action对象的行为
	
	Action类
	属性:path,type属性
	行为:新增Forward对象的行为,通过Forward对象name属性查找到对应的Forward对象的行为
	
	Forward类
	属性:name属性,path属性,redirect属性
	行为:无
	这样就可以很清楚的知道文件种有哪些东西是我们需要的然后进行下一步

开始建模

	建模需遵循从小到大,从里到外的顺序
	首先是ForwardModel类 
package com.zhuchenxi.model;
/**
 * 从里到外
 * @author 小曦
 *
 * http://www.javaxl.com
 */
public class ForwardModel {

	//<forward name="failed" path="/reg.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;
	}
	
	
}

接下来是ActionModel类  这里要主要两个方法 一个是push把一个ForwardModel对象给压入ActionModel里面去
再简单点就是将forward标签放入action标签里面去
还有一个pop方法通过Forward对象name属性查找到对应的Forward对象的方法
package com.zhuchenxi.model;

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

public class ActionModel {

	private String path;
	private String type;
	//加载forward对象
	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></action>
	 * @param forwardmodel
	 */
	public void push(ForwardModel forwardmodel) {
		fomap.put(forwardmodel.getName(), forwardmodel);
	}
	
	public ForwardModel pop(String name) {
		return fomap.get(name);
	}
	
	 
}
	到这里成功了一半了,接下来根据config.xml文件我们还需要建一个ConfigModel类
	ConfigModel没有属性但是他的行为和前面ActionModel是相似的所有只需要C过来改一下就行
package com.zhuchenxi.model;

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

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

	最后是最重要的工厂类ConfigModelFactory
	一般工厂类一定会有一个方法,就是生产指定模型对象的方法 builed newInstance

	在工厂类中会有两个以上的构建方法:
	一个是默认框架路径的模型对象构建方法
	还有一个是动态读取任意位置下的框架配置文件
/**
	 * 通过资源文件构建对应的模型对象
	 * @param path 具体的资源文件路径
	 * @return
	 * @throws DocumentException 
	 */
	public static ConfigModel build(String path) throws  Exception {
		//path=/config.xml
		InputStream in = ConfigModelFactory.class.getResourceAsStream(path);
		SAXReader  reader = new SAXReader();
		// /config.xml里的内容
		Document doc = reader.read(in);
		
		//接下来就做一件事情-->把内容填充到configModel对象中(doc.asXML--configModel)
		ConfigModel  configModel = new ConfigModel();
		ActionModel actionModel = null;
		ForwardModel forwardModel =null;
		List<Element> actionEles =	doc.selectNodes("/config/action");
		for (Element actionEle : actionEles) {
			actionModel = new ActionModel();
			actionModel.setPath(actionEle.attributeValue("path"));
			actionModel.setType(actionEle.attributeValue("type"));
			
			//给action中放入ForwardModel对象????
			List<Element> forwardEles = actionEle.selectNodes("forward");
			for (Element forwardEle : forwardEles) {
				forwardModel = new ForwardModel();
				forwardModel.setName(forwardEle.attributeValue("name"));
				forwardModel.setPath(forwardEle.attributeValue("path"));
//				reairect属性是boolean类型的
//				需求:只有config.xml中readirect属性填谢了faalse,它才代表转发
//				获取到config中的redirect属性值,那个字符串
				forwardModel.setRedirect(!"false".equals(forwardEle.attributeValue("redirect")));
				actionModel.push(forwardModel);
				
			}
			
			configModel.push(actionModel);
		}
		
		return configModel;
	}
	
	/**
	 * 默认框架路径的模型对象构建方法
	 * @return
	 */
	public static ConfigModel build()  throws  Exception {
		return build("/config.xml");
	}
这里是运行结果

在这里插入图片描述

以Web.xml为对象完成建模
		  老样子还是先分析文件
<web-app>
  <servlet>
  	<servlet-name>jrebelServlet</servlet-name>
  	<servlet-class>com.zking.xml.JrebelServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>jrebelServlet</servlet-name>
  	<url-pattern>/jrebelServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>jrebelServlet2</servlet-name>
  	<servlet-class>com.zking.xml.JrebelServlet2</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>jrebelServlet2</servlet-name>
  	<url-pattern>/jrebelServlet2</url-pattern>
  	<url-pattern>/jrebelServlet3</url-pattern>
  </servlet-mapping>
</web-app>
根据文件可以看出
web-app
属性:无
行为:新增servlet和servlet-mapping的行为 

servlet
属性:无
行为:新增serlvet-name和servlet-class的行为

servlet-mapping
属性:无
行为:新增servlet-name和url-pattern的行为

servlet-name
属性:文本属性
行为:无

servlet-class
属性:文本属性
行为:无

url-patten
属性:文本属性
行为:无
开始建模

建模的顺序还是从里到外

servlet-name

package com.zhuchenxi.servletModel;
/**
 * 从里到外 
 * 位于Servlet里面
 * @author 小曦
 *
 * http://www.javaxl.com
 */
public class ServletNameModel {

	//<servlet-name>jrebelServlet</servlet-name>
	private String content;

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	
}

servlet-class

package com.zhuchenxi.servletModel;

/**
 * 位于Servlet里面
 * @author 小曦
 *
 * http://www.javaxl.com
 */
public class ServletClassModel {

	//<servlet-class>com.zking.xml.JrebelServlet</servlet-class>
	
	private String content;

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	
}

url-pattern

package com.zhuchenxi.servletModel;
/**
 * 位于servlet-mapping
 * @author 小曦
 *
 * http://www.javaxl.com
 */
public class UrlPatternModel {

	//<url-pattern>/jrebelServlet</url-pattern> 
	private String content;

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	
	
}

servlet  
package com.zhuchenxi.servletModel;

public class ServletModel {

	//两个类的属性
	private ServletNameModel servletNameModel;
	private ServletClassModel servletClassModel;
	
	public ServletNameModel getServletNameModel() {
		return servletNameModel;
	}
	public void setServletNameModel(ServletNameModel servletNameModel) {
		this.servletNameModel = servletNameModel;
	}
	public ServletClassModel getServletClassModel() {
		return servletClassModel;
	}
	public void setServletClassModel(ServletClassModel servletClassModel) {
		this.servletClassModel = servletClassModel;
	}
	
	
}

servlet-mapping 里面的标签有3个所以用一个map集合来存储
还要写上两个行为 push 和 pop

package com.zhuchenxi.servletModel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ServletMappingModel {

	//两个类的属性
	private ServletNameModel servletNameModel;
	private Map<String, UrlPatternModel> urlPatternModels=new HashMap<String, UrlPatternModel>();
	
	public ServletNameModel getServletNameModel() {
		return servletNameModel;
	}
	public void setServletNameModel(ServletNameModel servletNameModel) {
		this.servletNameModel = servletNameModel;
	}
	
	public UrlPatternModel pop(String value) {
		UrlPatternModel urlPatternModel = urlPatternModels.get(value);
		return urlPatternModel;
	}
	public void push(UrlPatternModel urlPatternModel,ServletNameModel servletNameModel) {
		urlPatternModels.put(servletNameModel.getContent(), urlPatternModel);
	}
}

web-app

package com.zhuchenxi.servletModel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WebAppModel {

	
	private Map<String, ServletModel> servletM=new HashMap<String, ServletModel>();
	private Map<String, ServletMappingModel> servletmappingM=new HashMap<String, ServletMappingModel>();
	
	public ServletModel pops(String name) {
		return servletM.get(name);
		
	}
	public ServletMappingModel popm(String name) {
		return servletmappingM.get(name);
	}
	
	public void pushs(ServletModel s) {
		
		servletM.put(s.getServletNameModel().getContent(), s);
	}
	public void pushm(ServletMappingModel m) {
		
		servletmappingM.put(m.getServletNameModel().getContent(), m);
	}
	

}

最后是工厂类

package com.zhuchenxi.servletModel;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

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

import com.zhuchenxi.model.ConfigModel;

public class WebAppModelFactory {

	/**
	 * 通过资源文件构建对应的对象
	 * @param path  资源文件路径
	 * @return
	 * @throws Exception 
	 */
	public static WebAppModel build(String path) throws Exception {
		//获取文件
		InputStream in = WebAppModelFactory.class.getResourceAsStream(path);
		SAXReader reder = new SAXReader();
		// /config.xml里的内容
	    Document doc = reder.read(in);
		
	    WebAppModel webappModel=new WebAppModel();
		ServletModel servletModel=null;
		ServletMappingModel servletMappingModel=null;
		List<Element> servleteles = doc.selectNodes("/web-app/servlet");
		for (Element servletele : servleteles) {
			servletModel=new ServletModel();
			ServletNameModel servletNameModel=new ServletNameModel();
			ServletClassModel servletClassModel = new ServletClassModel();
			
			Element servletNameele = (Element) servletele.selectSingleNode("servlet-name");
			Element servletClassele = (Element) servletele.selectSingleNode("servlet-class");
			//加入Content里面
			servletNameModel.setContent(servletNameele.getText()); 
			servletClassModel.setContent(servletClassele.getText()); 
			servletModel.setServletNameModel(servletNameModel);
			servletModel.setServletClassModel(servletClassModel);
			webappModel.pushs(servletModel);
		}
		List<Element> mappingEles = doc.selectNodes("/web-app/servlet-mapping");
		for (Element mappingEle : mappingEles) {
			//实例化servlet-mapping,servlet-name,urlPattern的模型
			servletMappingModel=new ServletMappingModel();
			ServletNameModel servletNameModel = new ServletNameModel();
			
			//得到servlet-name,url-pattern标签
			Element servletNameEle = (Element) mappingEle.selectSingleNode("servlet-name");
			//添加
			servletNameModel.setContent(servletNameEle.getText());
			servletMappingModel.setServletNameModel(servletNameModel);
			//得到url-pattern
			List<Element> urlPatternEles=mappingEle.selectNodes("url-pattern");
			//遍历填充
			for (Element urlPatternEle : urlPatternEles) {
				UrlPatternModel urlPatternModel = new UrlPatternModel();
				
				urlPatternModel.setContent(urlPatternEle.getText());
				servletMappingModel.push(urlPatternModel,servletNameModel);
			}
			//将servlet-mapping填进web-app中
			webappModel.pushm(servletMappingModel);
		}
		return webappModel;
	}
	
	/**
	 * 默认的路径
	 * @return
	 * @throws Exception 
	 */
	public static WebAppModel build() throws Exception {
		return build("/Web.xml");
	}
	
	public static void main(String[] args) throws Exception {
		WebAppModel webappmodel= WebAppModelFactory.build();
		ServletModel servletModel=webappmodel.pops("jrebelServlet");
		System.out.println(servletModel.getServletNameModel().getContent());
		System.out.println(servletModel.getServletClassModel().getContent());
		System.out.println("*****************************************************");
		
		ServletMappingModel servletMappingModel = webappmodel.popm("jrebelServlet");
		System.out.println("servlet-mapping");
		System.out.println("*****************************************************");
		
		UrlPatternModel urlPatternModel = servletMappingModel.pop(servletMappingModel.getServletNameModel().getContent());	
		System.out.println(servletMappingModel.getServletNameModel().getContent());
		System.out.println(urlPatternModel.getContent());
	}
}

这是第三篇文章 希望能帮助到有需要的朋友 一起加油一起努力

猜你喜欢

转载自blog.csdn.net/Lzxccas/article/details/106306173