XML建模

导读:本篇文章讲解 XML建模,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

学习目标看一下

XML建模

 

1  xml建模

首先,拿一个config.xml文件来为大家讲解一下

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>

首先给大家讲解一下建模的思路,建模是从内到外的方式,这点注意

所以我们从xml文件中可知,内层第一个元素为forward标签,我们给它建一个实体类,说明其中的属性

我们要给每一个节点建立实体类

ForwardModel:

package com.lsy.model;
/**
 * 建模方式由内到外
 * @author zjjt
 *
 */
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:

因为要取到ForwardModel里面的值,所以里面要放一个map集合进行取值

package com.lsy.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:

package com.lsy.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);
	}
	public static void main(String[] args) throws Exception {
		//此时ConfigModel对象里面没有xml内容
//		ConfigModel configModel=new ConfigModel();
		ConfigModel configModel=ConfigModelFactory.build();
		ActionModel actionModel = configModel.pop("/loginAction");
		System.out.println(actionModel.getType());
		ForwardModel forwardModel=actionModel.pop("success");
		System.out.println(forwardModel.getPath());
	}
}

ConfigModelFactory:

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

/**
 * 工厂类
 * @author zjjt
 *	建模的思路:
 *	1.将原有的config.xml进行解析
 *	2.对应标签的内容,将其封装赋值给相对应的对象
 *		forward标签值 赋值给ForwardModel对象
 *		Action标签值 赋值给ActionModel对象
 *		config标签值 赋值给ConfigModel对象
 */
public class ConfigModelFactory {
	public static ConfigModel build() throws Exception {
		return build("config.xml");
	}

	private static ConfigModel build(String resourcepath) throws Exception {
		InputStream in = ConfigModelFactory.class.getResourceAsStream(resourcepath);
		SAXReader sr=new SAXReader();
		Document doc = sr.read(in);
		ConfigModel configModel=new ConfigModel();
        //获取config下面action节点的值
		List<Element> actioneles=doc.selectNodes("/config/action");
		for (Element actionEle : actioneles) {
			ActionModel actionModel=new ActionModel();
			//将xml文件解析得来的path值赋值给actionModel对象中的path属性
			actionModel.setPath(actionEle.attributeValue("path"));
			actionModel.setType((actionEle.attributeValue("path")));
			List<Element> forwardEles=actionEle.selectNodes("forward");
			for (Element forwardEle : forwardEles) {
				ForwardModel forwardModel=new ForwardModel();
				forwardModel.setName(forwardEle.attributeValue("name"));
				forwardModel.setPath(forwardEle.attributeValue("path"));
				//redirect只有在配置文件中赋值false的时候,代表转发,其他为重定向
				forwardModel.setRedirect(!"false".equals(forwardEle.attribute("redirect")));
				actionModel.push(forwardModel);
			}
			configModel.push(actionModel);
		}
		return configModel;
	}
	
}

二   例题

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

这个是web.xml文件

每个类对应一个标签

子节点用list集合表示

XML建模

package com.lsy.model.work;

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

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

import com.lsy.model.ConfigModel;

public class WebAppModelFactory {
	public static Web_AppModel build() throws Exception {
		return build("web.xml");
	}
	private static Web_AppModel build(String xmlPath) throws Exception {
		InputStream in = Web_AppModel.class.getResourceAsStream(xmlPath);
		SAXReader sax=new SAXReader();
		Web_AppModel webAppModel=new Web_AppModel();
		Document doc=sax.read(in);
		//将servlet标签内容填进webapp
		List<Element> servletEles=doc.selectNodes("/web-app/servlet");
		for (Element servletEle : servletEles) {
			ServletModel servletModel=new ServletModel();
			//找到servlet节点下的servlet-name节点
			Element servletNameEle=(Element)servletEle.selectSingleNode("servlet-name");
			//找到servlet节点下的servlet-class节点
			Element servletClassEle=(Element)servletEle.selectSingleNode("servlet-class");
			Servlet_NameModel servletNameModel=new Servlet_NameModel();
			Servlet_ClassModel servletClassModel=new Servlet_ClassModel();
			servletNameModel.setContext(servletNameEle.getText());
			servletClassModel.setContext(servletClassEle.getText());
			//设置值
			servletModel.setServletnameModel(servletNameModel);
			servletModel.setServletclassModel(servletClassModel);
			webAppModel.push(servletModel);
		}
		//将servlet-mapping的标签内容填充进webapp
		List<Element> servletMappingEles=doc.selectNodes("/web-app/servlet-mapping");
		for (Element servletMappingEle : servletMappingEles) {
			Servlet_MappingModel servletMappingModel=new Servlet_MappingModel();
			//找到servlet-mapping节点下的servlet-name节点
			Element servletNameEle=(Element)servletMappingEle.selectSingleNode("servlet-name");
			Servlet_NameModel servletNameModel=new Servlet_NameModel();
			servletNameModel.setContext(servletNameEle.getText());
			servletMappingModel.setServletnameModel(servletNameModel);
			//找到servlet-mapping节点下的url-pattern节点
			List<Element> urlPatternEles=servletMappingEle.selectNodes("url-pattern");
			for (Element urlPatternEle : urlPatternEles) {
				Url_PatternModel urlPatternModel=new Url_PatternModel();
				urlPatternModel.setContext(urlPatternEle.getText());
				servletMappingModel.push(urlPatternModel);
			}
			webAppModel.pushMappingModel(servletMappingModel);
		}
	
		return webAppModel;
	}
}

总结:建模要理清思路,建模有23种,工厂模式只是其中一种,先进行解析再进行建模

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/12258.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!