xml系列篇之xml建模

Welcome Huihui's Code World ! !

接下来看看由辉辉所写的关于xml的相关操作吧

目录

Welcome Huihui's Code World ! !

是什么

为什么要使用xml建模

怎么使用

1.建立Java模型对象的前期准备

2.建立Java模型对象【由上述分析可以知道,我们需要建立三个实体模型】 

3.运用工厂模式填充内容

辉辉小贴士:怎么样才知道自己精准掌握了呢?答案就是做个题目爽一爽

需求:对web.xml进行建模,并且通过url-pattern拿到servlet-class


是什么

  • XML建模是一种用于描述和定义XML文档结构的方法
    • 主要目的是为了确保XML文档的结构清晰、明确、规范
    • 在XML建模中,通常采用XML Schema、DTD或RELAX NG等XML文档结构定义语言描述XML文档的结构,其中包括元素、属性、命名空间等信息
    • 通过XML建模,可以准确地定义XML文档的结构,从而使得XML文档的操作和处理更为简便、高效
    • XML建模广泛应用于电子商务、金融管理、政府信息化、Web服务以及数据交换等领域

通俗来理解的话:就是将XML配置文件中的元素、属性、文本信息转换成Java对象的过程  

为什么要使用xml建模

  1. 使用XML建模的主要原因是XML的通用性和灵活性
  2. 使用XML建模可以对XML文档进行结构化描述,有效地减少了文档中存在的歧义和冗余。这有助于避免在XML数据交换过程中出现错误,提高了数据交换的精度和可靠性
  3. XML建模工具也可以提供界面化的编辑和校验功能,帮助开发人员更加方便地创建和维XML文档

⭐⭐总之,使用XML建模可以提高XML文档的规范化程度,降低数据交换的风险,提高数据处理的效率和质量

怎么使用

1.建立Java模型对象的前期准备

首先看一个配置文件


	
	
	
	
]>


	
	
		
		
	

	
		
		
	

对其进行分析

package com.wh.model;

public class Demo1 {

	
	
	/**
	 * 用面向对象的方式去处理xml文件【获取xml文件的内容】
	 * 1.用面向对象思想去形容或是说去封装模型对象(是xml文件)
	 * 2.将xml的内容初始化到到已经描述出来的模型之中
	 */
	
//	config.xml文件中的根节点是config,里面有action标签;
//	action标签中有两个属性(name和type),action中还有子节点forward;
//	forward标签中有两个属性(name,path,redirect);
//	可以往config标签中添加action标签,也可以往action标签中添加forward标签

/**
 * 面向对象去形容xml文件
 */
	//config
	// 在configModel中能够添加actionModel,而且actionModel在configModel中是唯一的,
	// 那么就会有一个容器(也就是属性),能够一对一的去存储actionModel

	//action
	//因为在actionModel中能够添加forwardModel,而且forwardModel在actionModel中是唯一的,
	//那么在actionModel中会有一个容器(属性),可以一对一存储forwardModel
	//actionModel中还有两个属性:name和type
	
	//forward
	//forwardModel中有属性:name,path,redirect
}

2.建立Java模型对象【由上述分析可以知道,我们需要建立三个实体模型】 

①ForwardModel

package com.wh.model;

public class ForwardModel {
	// forwardModel中有属性:name,path,redirect

	private String name;
	private String path;
	private boolean redirect;

	public ForwardModel() {
		// TODO Auto-generated constructor stub
	}

	public ForwardModel(String name, String path, boolean redirect) {
		super();
		this.name = name;
		this.path = path;
		this.redirect = 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;
	}

	@Override
	public String toString() {
		return "ForwardModel [name=" + name + ", path=" + path + ", redirect=" + redirect + "]";
	}

}

②ActionModel

package com.wh.model;

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

public class ActionModel {
	// action
	// forwardModel在actionModel中是唯一的,那么在actionModel中会有一个容器(属性),可以一对一存储forwardModel
	// actionModel中还有两个属性:path和type

	private String path;
	private String type;
	private Map forwardMap = new HashMap<>();

	public ActionModel() {
		// TODO Auto-generated constructor stub
	}

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

	// 在actionModel中能够添加forwardModel
	public void push(ForwardModel forwardModel) {
		forwardMap.put(forwardModel.getName(), forwardModel);
	}

	// 通过name值在action中拿到forward
	public ForwardModel pop(String name) {
		return forwardMap.get(name);
	}

}

③ConfigModel

package com.wh.model;

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

public class ConfigModel {
	// config
	// actionModel在configModel中是唯一的,那么就会有一个容器(也就是属性),能够一对一的去存储actionModel
	
	private Map actionMap=new HashMap();
	
//	在configModel中能够添加actionModel
	public void push(ActionModel actionModel) {
		actionMap.put(actionModel.getPath(), actionModel);
	}
	
	//通过path在config里面拿到action
	public  ActionModel pop(String path) {
		return actionMap.get(path);
	}
	
	public static void main(String[] args) throws Exception {
		//获取第二个action中第二个forward的path
//		ConfigModel configModel = new ConfigModel();
//		ActionModel actionModel = configModel.pop("/loginAction");
//		ForwardModel forwardModel = actionModel.pop("success");
//		System.out.println(forwardModel.getPath());
		//题目需求已经完成,但是我们好像忽略了一个很重要的事,我们只是将xml文件封装了而已,并没有拿到xml文件的内容
		//在这里,我们需要用到设计模式中的工厂模式去获取xml中的内容
		
		ConfigModelFactory c=new ConfigModelFactory();
		ConfigModel build = ConfigModelFactory.build();
		ActionModel pop = build.pop("/loginAction");
		String path = pop.getType();
		System.out.println(path);
		ForwardModel pop2 = pop.pop("success");
		System.out.println(pop2);
		String name = pop2.getName();
		System.out.println(name);
		
	}
}

3.运用工厂模式填充内容

在这里我们需要完成一个需求:获取第二个action中第二个forward的path【在ConfigModel中我们已经做了相应的处理,可是我们还没有拿到xml文件的内容,所以我们需要用到设计模式中的工厂模式去获取xml中的内容】

ConfigModelFactory

package com.wh.model;

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

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

public class ConfigModelFactory {
public static ConfigModel build() throws Exception {
	ConfigModel configModel = new ConfigModel();//示例ConfigModel
	InputStream in = ConfigModelFactory.class.getResourceAsStream("/config.xml");//获取流
	SAXReader sr = new SAXReader();
	Document read = sr.read(in);//读流
	List actionEles = read.selectNodes("/config/action");//获取节点
	//填充内容到ActionModel
	for (Element actionEle : actionEles) {
		ActionModel actionModel = new ActionModel();//实例
		actionModel.setPath(actionEle.attributeValue("path"));//path
		actionModel.setType(actionEle.attributeValue("type"));//type
		
		//填充内容到ForwardModel
		List forwardEles = actionEle.selectNodes("forward");
		for (Element forwardEle : forwardEles) {
			ForwardModel forwardModel = new ForwardModel();//实例
			forwardModel.setName(forwardEle.attributeValue("name"));//name
			forwardModel.setPath(forwardEle.attributeValue("path"));//path
			//因为redirect是Boolean类型,所以与上述操作有些许不一样
			forwardModel.setRedirect(!"false".equals(forwardEle.attribute("redirect")));
			actionModel.push(forwardModel);//把forwardModel的内容加到actionModel中
		}
		
		configModel.push(actionModel);//把actionModel的内容加到configModel中
		
	}
	return configModel; 
}

public static void main(String[] args) throws Exception {
	ConfigModel build = ConfigModelFactory.build();
	System.out.println(build);
//	ActionModel actionModel = configModel.pop("/loginAction");
//	ForwardModel forwardModel = actionModel.pop("success");
//	System.out.println(forwardModel.getPath());
	
	ActionModel pop = build.pop("/loginAction");
	System.out.println(pop.getType());
}
}

这样子的话,我们已经将题目的需求完成了,现在只需要测试一下了,可以选择在ConfigModelFactory中测试,也可以选择在ConfigModel中测试,这里博主是在ConfigModel中测试的,话不多说,让我们看看运行结果吧

xml系列篇之xml建模_第1张图片

 

以此类推,当我们熟练之后,就不需要再进行对配置文件的分析了,我们可以直接开始建立java模型对象

辉辉小贴士:怎么样才知道自己精准掌握了呢?答案就是做个题目爽一爽

需求:对web.xml进行建模,并且通过url-pattern拿到servlet-class

配置文件



  
  	jrebelServlet
  	com.zking.xml.JrebelServlet
  
   
  
  	jrebelServlet
  	/jrebelServlet
  
  
  
  	jrebelServlet2
  	com.zking.xml.JrebelServlet2
  
  
  
  	jrebelServlet2
  	/jrebelServlet2
  	/jrebelServlet3
  

 建立java模型对象

WebAppModel

package com.wh.model;

import java.util.ArrayList;
import java.util.List;

public class WebAppModel {
	/**
	 * ServletModel
	 */
private List ServletModelList = new ArrayList();
public void push(ServletModel servletModel) {
	ServletModelList.add(servletModel);
}
public List popServletModel() {
	return ServletModelList;
}

/**
 * ServletMappingModel
 */
private List ServletMappingModelList = new ArrayList<>();
public void push(ServletMappingModel servletMappingModel) {
	ServletMappingModelList.add(servletMappingModel);
}
public List popServletMappingModel(){
	return ServletMappingModelList;
}





}

ServletModel

package com.wh.model;

import java.util.ArrayList;
import java.util.List;

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


}

ServletNameModel

package com.wh.model;

public class ServletNameModel {
	private String content;

	public String getContent() {
		return content;
	}

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

ServletClassModel

package com.wh.model;

public class ServletClassModel {
	private String content;

	public String getContent() {
		return content;
	}

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

ServletMappingModel

package com.wh.model;

import java.util.ArrayList;
import java.util.List;

public class ServletMappingModel {
	
private ServletNameModel servletNameModel;
public ServletNameModel getServletNameModel() {
	return servletNameModel;
}

public void setServletNameModel(ServletNameModel servletNameModel) {
	this.servletNameModel = servletNameModel;
}



private List UrlPatternModelList = new ArrayList();
public void push(UrlPatternModel urlPatternModel) {
	UrlPatternModelList.add(urlPatternModel);
}
public List popUrlPatternModel(){
	return UrlPatternModelList;
}
}

UrlPatternModel

package com.wh.model;

public class UrlPatternModel {
	private String content;

	public String getContent() {
		return content;
	}

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

WebAppModelFactory

package com.wh.model;

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

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

public class WebAppModelFactory {
	/**
	 * 填充内容
	 * 
	 * @return webAppModel
	 * @throws Exception
	 */
	public static WebAppModel build() throws Exception {
		WebAppModel webAppModel = new WebAppModel();// 实例化
		InputStream in = ConfigModelFactory.class.getResourceAsStream("/web.xml");// 获取流
		SAXReader sr = new SAXReader();
		Document read = sr.read(in);// 读流

		// 填充内容到servlet
		List servletEles = read.selectNodes("/web-app/servlet");
		for (Element servletEle : servletEles) {
			// 填充内容到servletNameModel
			Element servletnameEle = (Element) servletEle.selectSingleNode("servlet-name");
			ServletNameModel servletNameModel = new ServletNameModel();
			servletNameModel.setContent(servletnameEle.getText());

			// 填充内容到servletClassModel
			Element servletclassEle = (Element) servletEle.selectSingleNode("servlet-class");
			ServletClassModel servletClassModel = new ServletClassModel();
			servletClassModel.setContent(servletclassEle.getText());

			// 填充内容到servlet
			ServletModel servletModel = new ServletModel();
			servletModel.setServletNameModel(servletNameModel);
			servletModel.setServletClassModel(servletClassModel);
			webAppModel.push(servletModel);
		}

		// 填充内容到servlet-mapping
		List servletmappingEles = read.selectNodes("/web-app/servlet-mapping");
		for (Element servletmappingEle : servletmappingEles) {
			// 填充内容到servletNameModel
			Element servletnameEle = (Element) servletmappingEle.selectSingleNode("servlet-name");
			ServletNameModel servletNameModel = new ServletNameModel();
			servletNameModel.setContent(servletnameEle.getText());
			// 填充内容到urlPatternModel
			Element urlpatternEle = (Element) servletmappingEle.selectSingleNode("url-pattern");
			UrlPatternModel urlPatternModel = new UrlPatternModel();
			urlPatternModel.setContent(urlpatternEle.getText());
			// 填充内容到servlet-mapping
			ServletMappingModel servletMappingModel = new ServletMappingModel();
			servletMappingModel.setServletNameModel(servletNameModel);
			servletMappingModel.push(urlPatternModel);
			webAppModel.push(servletMappingModel);
		}

		return webAppModel;

	}

	/**
	 * 通过url-pattern拿到servlet-class
	 * 
	 * @param url
	 *            传递进去的url
	 * @return servletclass
	 * @throws Exception
	 */
	public static String obtainservletclass(String url) throws Exception {
		WebAppModel webAppModel = WebAppModelFactory.build();// 拿到填充数据的方法
		String servletclass = " ";// 最终返回的servlet-class
		/**
		 * 操作:先通过url-pattern拿到servlet-name
		 */
		String servletname = " ";// 相应的url-pattern拿到的servlet-name
		// 先遍历url-pattern的父节点servlet-mapping
		List servletMappingModels = webAppModel.popServletMappingModel();
		for (ServletMappingModel servletMappingModel : servletMappingModels) {
			// 再拿到它的子节点url-pattern并且遍历
			List popUrlPatternModel = servletMappingModel.popUrlPatternModel();
			for (UrlPatternModel urlPatternModel : popUrlPatternModel) {
				// 如果我传进来的url与我的xml文件中的url-pattern标签中的值相等,那么我就拿到url-pattern同级的servlet-name【因为servlet中也有servlet-name这个标签】
				// 实质上是因为是通过了映射,所以servlet和servlet-mapping中所写的servlet-name需要一致
				if (url.equals(urlPatternModel.getContent())) {
					ServletNameModel servletNameModel = servletMappingModel.getServletNameModel();
					servletname = servletNameModel.getContent();
				}
			}
		}

		/**
		 * 通过servlet-name拿到对应的servlet-class
		 */
		// 先遍历servlet-name的父节点servlet
		List servletModels = webAppModel.popServletModel();
		for (ServletModel servletModel : servletModels) {

			ServletNameModel servletNameModel = servletModel.getServletNameModel();
			// 如果我已经得到的servletname与servlet-name标签中的值相等,那么就拿到servlet-name同级的servlet-class
			if (servletname.equals(servletNameModel.getContent())) {
				ServletClassModel servletClassModel = servletModel.getServletClassModel();
				servletclass = servletClassModel.getContent();
			}
		}
		return servletclass;
	}

	public static void main(String[] args) throws Exception {
		String obtainservletclass = obtainservletclass("/jrebelServlet");
		System.out.println(obtainservletclass);

	}
}

              好啦,今天的分享就到这了,希望能够帮到你呢!              

你可能感兴趣的:(xml,xml)