XML建模

xml建模的由来

运用了面向对象的思想,把指定的字符串当作对象来操作的这样一个过程!

xml建模的步骤


   建模整体分两步:
   1、以面向对象的编程思想,描述xml资源文件
   2、将xml文件中内容封装进model实体对象。

xml建模的好处

  简而言之,xml建模可以提高代码的复用性,更加方便快捷!
  只需要调用指定的方法就可以完成预定的字符串获取!

xml建模核心思路

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

xml建模实例演示

这里我以我自己做的Web.xml为例!
步骤如下:
第一步先新建一个项目,并且导入需要的jar包
(一定要记得导入这两个jar包,否则里面的方法会调用不了);
在这里插入图片描述
第二步
分析你的web.xml里面的内容,分析里面每一个标签有无包含属性或者行为,就像我下面展示的这样!
在这里插入图片描述
第三步:根据图片上的标签元素新建实体类,就像下面展示的代码这样:

      根据xml建模的特点,建模需遵循从小到大,从里到外的顺序,
      并且要记得有几个标签元素就写几个实体类!

web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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>

首先是servlet-name的实体类模型
因为servlet节点和servlet-mapping的节点中都包含
servlet-name这一节点,但是因为两个servlet-name的内容是一样的,所以只需要建一个servlet-name的实体类模型就好,无需重复!

package com.wangqiuping;
/**
 * 
 * @author 小汪同学  2020年5月23日 上午8:14:54
 *
 */
public class ServletNameModel {

private  String  context;//内容

public String getContext() {
	return context;
}

public void setContext(String context) {
	this.context = context;
}	
}

注意:这里面的内容我用的是context进行表示,下面如果有看到context这一字段,表示的都是内容!

然后是servlet-class的实体类模型

/**
 * 
 * @author 小汪同学  2020年5月23日 上午8:19:22
 *
 */
public class ServletClassModel {

private   String context;

public String getContext() {
	return context;
}
public void setContext(String context) {
	this.context = context;
}
}

再是servlet-mapping的实体类模型

package com.wangqiuping;

import java.util.HashMap;
import java.util.Map;
/**
 * 
 * @author 小汪同学  2020年5月23日 上午8:49:57
 *
 */
public class ServletMappingModel {
	private  ServletNameModel servletNameModel;
	//因为url-pattern有多个值  所以用map集合进行存储   以键值对的形式存在
	private  Map<String, UrlPatternModel> urlpatternModels=new HashMap<String,UrlPatternModel>();
	public ServletNameModel getServletNameModel() {
		return servletNameModel;
	}
	public void setServletNameModel(ServletNameModel servletNameModel) {
		this.servletNameModel = servletNameModel;
	}
	public Map<String, UrlPatternModel> getUrlpatternModels() {
		return urlpatternModels;
	}
	public void setUrlpatternModels(Map<String, UrlPatternModel> urlpatternModels) {
		this.urlpatternModels = urlpatternModels;
	}
	public  UrlPatternModel  pop(String context) {
		UrlPatternModel  urlPatternModel=urlpatternModels.get(context);
		return urlPatternModel;
	}
	public void push(UrlPatternModel urlPatternModel,ServletNameModel servletNameModel) {
		urlpatternModels.put(servletNameModel.getContext(), urlPatternModel);
	}
}

url-pattern的实体类模型

package com.wangqiuping;
/**
 * 
 * @author 小汪同学  2020年5月23日 上午8:19:43
 *
 */
public class UrlPatternModel {

private  String context;

public String getContext() {
	return context;
}
public void setContext(String context) {
	this.context = context;
}	
}

web-app的实体类模型

package com.wangqiuping;

import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
 * 
 * @author 小汪同学  2020年5月23日 上午9:18:04
 * 
 */
public class WebAppFactory {

public static WebAppModel build(String path) throws Exception {
	InputStream  in=WebAppFactory.class.getResourceAsStream(path);
	SAXReader  reader=new SAXReader();
	Document document = reader.read(in);
	  
    WebAppModel   webAppModel=new WebAppModel();
    ServletModel  servletModel=null;
    ServletMappingModel  servletMappingModel=null;
    List<Element> servlets=document.selectNodes("/web-app/servlet");
    for (Element servletelement : servlets) {
		//实例化servlet,servlet-name,servlet-class标签模型
        servletModel=new ServletModel();
        ServletNameModel servletNameModel=new ServletNameModel();
        ServletClassModel servletClassModel=new ServletClassModel();
        //获取servlet-name,servlet-class模型中的值
        Element  servletNameElement=(Element)servletelement.selectSingleNode("servlet-name");
        Element  servletClassElement=(Element)servletelement.selectSingleNode("servlet-class");
        //压进去
        servletNameModel.setContext(servletNameElement.getText());
    	servletClassModel.setContext(servletClassElement.getText());
    	
        //将servlet-name,servlet-class添加到servlet中去
 	   servletModel.setServletNameModel(servletNameModel);
 	   servletModel.setServletClassModel(servletClassModel);
 	   //将servlet添加到web-app中
 	   webAppModel.pushs(servletModel);
	   }
       
       List<Element> mappingElems=document.selectNodes("/web-app/servlet-mapping");
       for (Element mappingEle : mappingElems) {
    	   //实例化servlet-mapping,servlet-name,urlPattern的模型
			servletMappingModel=new ServletMappingModel();
			ServletNameModel servletNameModel = new ServletNameModel();
			
			//获取servlet-name,url-pattern标签
			Element servletNameEle = (Element) mappingEle.selectSingleNode("servlet-name");
			//添加
			servletNameModel.setContext(servletNameEle.getText());
			servletMappingModel.setServletNameModel(servletNameModel);
			//获取url-pattern
			List<Element> urlPatternEles=mappingEle.selectNodes("url-pattern");
			//遍历数据
			for (Element urlPatternEle : urlPatternEles) {
				UrlPatternModel urlPatternModel = new UrlPatternModel();
				
				urlPatternModel.setContext(urlPatternEle.getText());
				servletMappingModel.push(urlPatternModel,servletNameModel);
			}
			//将servlet-mapping填进web-app中
			webAppModel.pushmap(servletMappingModel);
		}
		return webAppModel;
}

       public  static  WebAppModel  build() throws Exception{
		    return build("/web.xml");
       }
       
       public static void main(String[] args) throws Exception {
   		// TODO Auto-generated method stub
        //调用方法
     	WebAppModel w=WebAppFactory.build();
	     //得到jrebelServlet进行查询,去获取到servlet
	   	ServletModel servletmodel=w.pops("jrebelServlet");
	   	//获取servletMaping
	    ServletMappingModel servletMappingModel = w.popmap("jrebelServlet");
	    //获取url-pattern
	    UrlPatternModel urlPatternModel= servletMappingModel.pop(servletMappingModel.getServletNameModel().getContext());	
	   	//输出
	    System.out.println("servlet-name="+servletmodel.getServletNameModel().getContext()+"class="+servletmodel.getServletClassModel().getContext());
	   System.out.println("-------");
	   	System.out.println("servlet-mapping");
	   	System.out.println("servlet-name= "+servletMappingModel.getServletNameModel().getContext()+"\nurl-pattern="+urlPatternModel.getContext());	
	   	}
}

最后是webapp的工厂(也就想当于是一个放置整个web-app内容的一个篮子)

关于工厂模式:
工厂模式是23种设计模式的其中一种,可以用来解析并生产出指定对象!
一般会有两个以上的构建方法:
1 动态读取任意位置下框架配置文件的方法
2、 默认框架路径的模型对象方法

实现工厂类的一些核心步骤:
1、首先加载资源文件,
2、获取流对象,再加载流
3、使用selectNodes或者selectSingleNode的方法去寻找节点标签
4、根据节点去寻找数据
5、遍历并添加所需要的模型数据
6、调用方法
7、运行结果
8、查看结果是否正确

package com.wangqiuping;

import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
 * 
 * @author 小汪同学  2020年5月23日 上午9:18:04
 * 
 */
public class WebAppFactory {

public static WebAppModel build(String path) throws Exception {
	InputStream  in=WebAppFactory.class.getResourceAsStream(path);
	SAXReader  reader=new SAXReader();
	Document document = reader.read(in);
	  
    WebAppModel   webAppModel=new WebAppModel();
    ServletModel  servletModel=null;
    ServletMappingModel  servletMappingModel=null;
    List<Element> servlets=document.selectNodes("/web-app/servlet");
    for (Element servletelement : servlets) {
		//实例化servlet,servlet-name,servlet-class标签模型
        servletModel=new ServletModel();
        ServletNameModel servletNameModel=new ServletNameModel();
        ServletClassModel servletClassModel=new ServletClassModel();
        //获取servlet-name,servlet-class模型中的值
        Element  servletNameElement=(Element)servletelement.selectSingleNode("servlet-name");
        Element  servletClassElement=(Element)servletelement.selectSingleNode("servlet-class");
        //压进去
        servletNameModel.setContext(servletNameElement.getText());
    	servletClassModel.setContext(servletClassElement.getText());
    	
        //将servlet-name,servlet-class添加到servlet中去
 	   servletModel.setServletNameModel(servletNameModel);
 	   servletModel.setServletClassModel(servletClassModel);
 	   //将servlet添加到web-app中
 	   webAppModel.pushs(servletModel);
	   }
       
       List<Element> mappingElems=document.selectNodes("/web-app/servlet-mapping");
       for (Element mappingEle : mappingElems) {
    	   //实例化servlet-mapping,servlet-name,urlPattern的模型
			servletMappingModel=new ServletMappingModel();
			ServletNameModel servletNameModel = new ServletNameModel();
			
			//获取servlet-name,url-pattern标签
			Element servletNameEle = (Element) mappingEle.selectSingleNode("servlet-name");
			//添加
			servletNameModel.setContext(servletNameEle.getText());
			servletMappingModel.setServletNameModel(servletNameModel);
			//获取url-pattern
			List<Element> urlPatternEles=mappingEle.selectNodes("url-pattern");
			//遍历数据
			for (Element urlPatternEle : urlPatternEles) {
				UrlPatternModel urlPatternModel = new UrlPatternModel();
				
				urlPatternModel.setContext(urlPatternEle.getText());
				servletMappingModel.push(urlPatternModel,servletNameModel);
			}
			//将servlet-mapping填进web-app中
			webAppModel.pushmap(servletMappingModel);
		}
		return webAppModel;
}

       public  static  WebAppModel  build() throws Exception{
		    return build("/web.xml");
       }
       
       public static void main(String[] args) throws Exception {
   		// TODO Auto-generated method stub
        //调用方法
     	WebAppModel w=WebAppFactory.build();
	     //得到jrebelServlet进行查询,去获取到servlet
	   	ServletModel servletmodel=w.pops("jrebelServlet");
	   	//获取servletMaping
	    ServletMappingModel servletMappingModel = w.popmap("jrebelServlet");
	    //获取url-pattern
	    UrlPatternModel urlPatternModel= servletMappingModel.pop(servletMappingModel.getServletNameModel().getContext());	
	   	//输出
	    System.out.println("servlet-name="+servletmodel.getServletNameModel().getContext()+"class="+servletmodel.getServletClassModel().getContext());
	   System.out.println("-------");
	   	System.out.println("servlet-mapping");
	   	System.out.println("servlet-name= "+servletMappingModel.getServletNameModel().getContext()+"\nurl-pattern="+urlPatternModel.getContext());	
	   	}
}

注意要点

1、在新建好项目的时候,一定要记得导入好相关的jar包!
2、在最后写完webapp工厂的实体类之后,一定要记得去调用方法!
3、导入的web.xml文件记得放在src目录下,否则可能找不到你需要读取的路 径,以至报空指针异常!
3、在运行WebAppFactory类的时候,记得运行 java Application !
在这里插入图片描述

最终效果

在这里插入图片描述

总结

xml建模使代码不再繁琐,并且可以作为一种解决方案应用到我们的学习的框架当中,今天的博客就分享到这,有什么好的建议或者错误欢迎评论留言交流!在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值