IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> XML建模 -> 正文阅读

[Java知识库]XML建模

~~~~~

一、XML建模

1、什么叫XML建模

? ? ? 将XML配置文件中的元素、属性、文本信息转换成对象的过程叫做XML建模;

2、建模的思路

(1)、分析需要被建模的文件中有那几个对象;

(2)、每个对象拥有的行为以及属性;

(3)、定义对象从小到大(从里到外);

(4)、利用工厂模式+dom4j+xpath解析Xml配置文件;

3、建模的好处

? ? ? 提高代码的复用性

4、建模

(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>

思路:

首先我们来分析它的属性和对象,最大的对象是config,然后它里面有action,action属性有path、type;action里面还有forward,forward属性有name、path、redirect;所以得出我们要建三个,最后我们再用config来建一个工厂,来达到解析所有对象的属性.。

记住是从里到外(ForwardModel——ActionModel——ConfigModel—ConfigModelFactory)

①、ForwardModel

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

②、ActionModel

package com.mwy.model;
import java.util.HashMap;
import java.util.Map;
public class ActionModel {
	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);
	}	
}

③、ConfigModel

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

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

/**
 * 建模的思路:
 * 1、将原有的config.xml进行解析
 * 2、对应标签的内容,将其封装赋值给相对应的对象
 *   forWord标签值,赋值给ForwordModel对象
 *   action标签值,赋值给ActionModel对象
 *   config标签值,赋值给ConfigModel对象 
 */
public class ConfigModelFactory {
	public static ConfigModel build() throws DocumentException {
		return build("config.xml");
	}
	public static ConfigModel build(String string) throws DocumentException {
		InputStream in = ConfigModelFactory.class.getResourceAsStream(string);
		SAXReader sax=new SAXReader();
		Document doc = sax.read(in);
		ConfigModel config=new ConfigModel();
		//ActionModel
		List<Element> actionEles = doc.selectNodes("/config/action");
		for (Element actionEl : actionEles) {
			ActionModel action=new ActionModel();
			//将xml文件解析得来的pash值赋值给actionModel对象中的path属性
			action.setPath(actionEl.attributeValue("path"));
			action.setType(actionEl.attributeValue("type"));
			//ForwordModel
			List<Element> forwardEles = actionEl.selectNodes("forward");
			for (Element forwardEl : forwardEles) {
				ForwardModel forward=new ForwardModel();
				forward.setName(forwardEl.attributeValue("name"));
				forward.setPath(forwardEl.attributeValue("path"));
				//Redirect只有在配置文件中赋值false的时候,代表转发,其他代表重定向
				forward.setRedirect(!"false".equals(forwardEl.attributeValue("redirect")));
				action.push(forward);
			}
			config.push(action);
		}
		return config;
	}		
}

问题:获得第二个action中的type的值;

public static void main(String[] args) throws Exception {
		//此时ConfigModel对象里面没有xml内容
		//ConfigModel configModel=new ConfigModel();
		ConfigModel config=ConfigModelFactory.build();
		//2、获得第二个action中的type的值
		ActionModel action=config.pop("/loginAction");
		System.out.println(action.getType());
	}

结果

三、问题:

1、对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_classModel、Servlet_nameModel、Url_patternModel:内容是一样的

private String value;
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}

②、ServletModel?

package com.mwy.model.zy;
public class ServletModel {
	private Servlet_nameModel sname;
	private Servlet_classModel sclass;
	public Servlet_nameModel getSname() {
		return sname;
	}
	public void setSname(Servlet_nameModel sname) {
		this.sname = sname;
	}
	public Servlet_classModel getSclass() {
		return sclass;
	}
	public void setSclass(Servlet_classModel sclass) {
		this.sclass = sclass;
	}
}

③、Servlet_mappingModel?

public class Servlet_mappingModel {
	private Servlet_nameModel sname;
    private List<Url_patternModel> upattern=new ArrayList<Url_patternModel>();
	public Servlet_nameModel getSname() {
		return sname;
	}
	public void setSname(Servlet_nameModel sname) {
		this.sname = sname;
	}
	public void push(Url_patternModel url_pattern) {
		upattern.add(url_pattern);
	}
	public List<Url_patternModel> pop() {
		return upattern;
	}	
}

④、Web_appModel?

public class Web_appModel {
	private List<ServletModel> servletm=new ArrayList<>();
	private List<Servlet_mappingModel> mappingm=new ArrayList<>();
	public void push(ServletModel servletModel) {
		servletm.add(servletModel);
	}
	public void push1(Servlet_mappingModel servlet_mappingModel) {
		mappingm.add(servlet_mappingModel);
	}
	public List<ServletModel> pops() {
		return servletm;	
	}
	public List<Servlet_mappingModel> popm() {
		return mappingm;
	}
}

⑤、Web_appModelFactory工厂类

public class Web_appModelFactory {
	public static Web_appModel build() throws DocumentException {
		return build("web.xml");
	}
	private static Web_appModel build(String string) throws DocumentException {
		InputStream in = Web_appModel.class.getResourceAsStream(string);
		SAXReader sax=new SAXReader();
		Document doc = sax.read(in);
		//将servlet的标签内容填充进web-app
		Web_appModel app=new Web_appModel();
		//SelectModel
		List<Element> servletEles = doc.selectNodes("/web-app/servlet");
		for (Element servletEl : servletEles) {
			ServletModel servlet=new ServletModel();
			//selectSingleNode获得对应节点对象,返回单个元素对象
			//获取到servlet-name,servlet-class模型
			Element servletName = (Element)servletEl.selectSingleNode("servlet-name");
			Element servletClass = (Element)servletEl.selectSingleNode("servlet-class");
			//Servlet_nameModel
			Servlet_nameModel sname=new Servlet_nameModel();
			sname.setValue(servletName.getText());
			//Servlet_classModel
			Servlet_classModel sclass=new Servlet_classModel();
			sclass.setValue(servletClass.getText());
			//将servlet-name,servlet-class填进servlet中
			servlet.setSname(sname);
			servlet.setSclass(sclass);
			//将servlet填进web-app
			app.push(servlet);
		}
		//将servlet-mapping的标签内容填充进web-app
		List<Element> servletmappEles = doc.selectNodes("/web-app/servlet-mapping");
		for (Element servletmappEl : servletmappEles) {
			Servlet_mappingModel Servlet_mapping=new Servlet_mappingModel();
			//得到servlet-name,url-pattern标签
			//selectSingleNode获得对应节点对象,返回单个元素对象
			Element servletName = (Element)servletmappEl.selectSingleNode("servlet-name");
			Servlet_nameModel sname=new Servlet_nameModel();
			sname.setValue(servletName.getText());
			Servlet_mapping.setSname(sname);
			//Url_patternModel
			List<Element> upatternEles = servletmappEl.selectNodes("url-pattern");
			//遍历
			for (Element upatternEl : upatternEles) {
				Url_patternModel pattern=new Url_patternModel();
				pattern.setValue(upatternEl.getText());
				Servlet_mapping.push(pattern);
			}
			//将servlet-mapping填进web-app中
			app.push1(Servlet_mapping);
		}
		return app;
	}
}

?2、通过url-pattern读取到servlet-class的值

/**
	 * 通过浏览器输入的网址自动找到对应的后台处理类
	 * @param webAppModel	建模后的实体类
	 * @param url	浏览器访问的网址
	 * @return
	 */
	public static String getServletClassByUrl(Web_appModel app, String url) {
		String servletClass = "";
		 // 找到浏览器网址对应的servlet-name
		String servletName = "";
		List<Servlet_mappingModel> mapping = app.popm();
		for (Servlet_mappingModel servletMappingModel : mapping) {
			List<Url_patternModel> upatternp = servletMappingModel.pop();
			for (Url_patternModel upm : upatternp) {
				if(url.equals(upm.getValue())) {
					Servlet_nameModel sname = servletMappingModel.getSname();
					servletName = sname.getValue();
				}
			}
		}
		 // 找到servlet-name对应的后台处理类
		List<ServletModel> servletM = app.getServletModels();
		for (ServletModel servletModel : servletM) {
			Servlet_nameModel sname = servletModel.getSname();
			if(servletName.equals(sname.getValue())) {
				Servlet_classModel sclass = servletModel.getSclass();
				servletClass = sclass.getValue();
			}
		}
		return servletClass;
	}
	
	public static void main(String[] args) throws DocumentException {
		Web_appModel webAppModel = Web_appModelFactory.build();
		String res = getServletClassByUrl(webAppModel, "/jrebelServlet");
		String res2 = getServletClassByUrl(webAppModel, "/jrebelServlet2");
		String res3 = getServletClassByUrl(webAppModel, "/jrebelServlet3");
		System.out.println(res);
		System.out.println(res2);
		System.out.println(res3);
		
	}

结果为:

再见!!!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:29:19  更:2021-07-31 16:31:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 16:28:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码