今天我给大家分享关于XML建模的基础。
目录
一.什么是XML建模?
就是将XML配置文件以模型的方式,进行输出操作。
这是config.xml的关系图
二.如何将XML建模?
步骤:①实例对象模型
ForwardModel节点模型
ActionModel节点模型
ConfigModel节点模型
理解:一个xml的对象就是一个实体。
1、ForwardModel
代码如下:
package model; /** * ForwardModel节点模型 * @author 李永安 * */ public class ForwardModel { 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 + "]"; } }
2、ActionModel
代码如下:
package model; import java.util.HashMap; import java.util.Map; /** * ActionModel节点模型 * @author 李永安 * */ public class ActionModel { private String path; private String type; private Map<String, ForwardModel> map = 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; } public Map<String, ForwardModel> getMap() { return map; } public void setMap(Map<String, ForwardModel> map) { this.map = map; } @Override public String toString() { return "ActionModel [path=" + path + ", type=" + type + ", map=" + map + "]"; } //将forwardmodel放到actionmodel中(压栈) public void push(ForwardModel ForwardModel) { map.put(ForwardModel.getName(), ForwardModel); } //从action中通过name取出forward (堆栈) public ForwardModel pop(String name) { return map.get(name); } }
3.ConfigModel
代码如下:
package model; import java.util.HashMap; import java.util.Map; import javax.swing.ActionMap; import org.dom4j.DocumentException; /** * ConfigModel节点模型 * @author 李永安 * */ public class ConfigModel { private Map<String, ActionModel> map = new HashMap<>(); public ConfigModel() { // TODO Auto-generated constructor stub } public Map<String, ActionModel> getMap() { return map; } public void setMap(Map<String, ActionModel> map) { this.map = map; } @Override public String toString() { return "ConfigModel [map=" + map + "]"; } public void push(ActionModel ActionModel) { map.put(ActionModel.getPath(), ActionModel); } //通过path获取到action的内容 public ActionModel pop(String path) { return map.get(path); } public static void main(String[] args) throws DocumentException { //题:获取到第二个action的第二个forword的path //1.实例configModel的对象 ConfigModel cm = ConfigModelFactory.build(); //2.调用pop方法获取到actionmodel的内容 ActionModel pop = cm.pop("/loginAction"); ForwardModel fw = new ForwardModel(); System.out.println(fw.getPath()); } }
23种设计模式之工厂模式
4.ConfigModelFactory
ConfigModelFactory就是用来生产configmodel内容的
代码如下:
package 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 李永安 * */ public class ConfigModelFactory { public static ConfigModel bulid() throws Exception { //1.实例化解析对象 InputStream is = ConfigModelFactory.class.getResourceAsStream("/config.xml"); //2.解析xml文件 SAXReader sr = new SAXReader(); //3.读取 Document read = sr.read(is);//得到解析的内容 ConfigModel ConfigModel = new ConfigModel(); //4.给configmodel添加内容,就得给actionmodel添加内容 List<Element> selectNodes = read.selectNodes("/config/action"); for (Element element : selectNodes) { //获取action内容 element //给actionmodel添加内容 ActionModel amd = new ActionModel(); amd.setPath(element.attributeValue("path")); amd.setType(element.attributeValue("type")); //给forward添加内容 List<Element> ForwardNodes = element.selectNodes("forward"); for (Element element2 : ForwardNodes) { //System.out.println(element2.asXML()); ForwardModel fm = new ForwardModel(); fm.setName(element2.attributeValue("name")); fm.setPath(element2.attributeValue("path")); //写false才写 fm.setRedirect(!"false".equals(element2.attributeValue("redirect"))); amd.push(fm); } ConfigModel.push(amd); } return ConfigModel; } public static void main(String[] args) throws Exception { ConfigModelFactory.bulid(); } }
三.XML(servlet案例)
获取servlet的class值
ServletClassModel
代码:
package com.lya.model;
/**
* @author 李永安
*
*/
public class ServletClassModel {
private String context;
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
ServletMappingModel
代码:
package com.lya.model;
import java.util.ArrayList;
import java.util.List;
/**
* @author 李永安
*
*/
public class ServletMappingModel {
private ServletNameModel servletNameModel;
private List<UrlPatternModel> urlPatternModels = new ArrayList<>();
public ServletNameModel getServletNameModel() {
return servletNameModel;
}
public void setServletNameModel(ServletNameModel servletNameModel) {
this.servletNameModel = servletNameModel;
}
public void pushUrlPatternModel(UrlPatternModel urlPatternModel) {
urlPatternModels.add(urlPatternModel);
}
public List<UrlPatternModel> getUrlPatternModels() {
return urlPatternModels;
}
}
WebAppModel
代码:
package com.lya.model;
import java.util.ArrayList;
import java.util.List;
/**
* @author 李永安
*
*/
public class WebAppModel {
private List<ServletModel> servletModels = new ArrayList<>();
private List<ServletMappingModel> servletMappingModels = new ArrayList<>();
public void pushServletModel(ServletModel servletModel) {
servletModels.add(servletModel);
}
public List<ServletModel> getServletModels() {
return servletModels;
}
public void pushServletMappingModel(ServletMappingModel servletMappingModel) {
servletMappingModels.add(servletMappingModel);
}
public List<ServletMappingModel> getServletMappingModels() {
return servletMappingModels;
}
}
WebAppModelFactory
package com.lya.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;
/**
* @author 李永安
*
*/
public class WebAppModelFactory {
public static WebAppModel buildWebAppModel() {
String xmlPath = "/web.xml";
return buildWebAppModel(xmlPath);
}
/**
* 建模
*
* @param xmlPath
* @return
*/
public static WebAppModel buildWebAppModel(String xmlPath) {
InputStream in = WebAppModelFactory.class.getResourceAsStream(xmlPath);
SAXReader saxReader = new SAXReader();
WebAppModel webAppModel = new WebAppModel();
try {
Document doc = saxReader.read(in);
/*
* 将servlet的标签内容填充进WebApp
*/
List<Element> servletEles = doc.selectNodes("/web-app/servlet");
for (Element servletEle : servletEles) {
ServletModel servletModel = new ServletModel();
/*
* 给ServletModel填充xml的内容
*/
Element servletNameEle = (Element) servletEle.selectSingleNode("servlet-name");
Element servletClassEle = (Element) servletEle.selectSingleNode("servlet-class");
ServletNameModel servletNameModel = new ServletNameModel();
ServletClassModel servletClassModel = new ServletClassModel();
servletNameModel.setContext(servletNameEle.getText());
servletClassModel.setContext(servletClassEle.getText());
servletModel.setServletNameModel(servletNameModel);
servletModel.setServletClassModel(servletClassModel);
webAppModel.pushServletModel(servletModel);
}
/*
* 将servlet-mapping的标签内容填充进WebApp
*/
List<Element> servletMappingEles = doc.selectNodes("/web-app/servlet-mapping");
for (Element servletMappingEle : servletMappingEles) {
ServletMappingModel servletMappingModel = new ServletMappingModel();
/*
* 给ServletMappingModel填充xml的内容
*/
Element servletNameEle = (Element) servletMappingEle.selectSingleNode("servlet-name");
ServletNameModel servletNameModel = new ServletNameModel();
servletNameModel.setContext(servletNameEle.getText());
servletMappingModel.setServletNameModel(servletNameModel);
List<Element> urlPatternEles = servletMappingEle.selectNodes("url-pattern");
for (Element urlPatternEle : urlPatternEles) {
UrlPatternModel urlPatternModel = new UrlPatternModel();
urlPatternModel.setContext(urlPatternEle.getText());
servletMappingModel.pushUrlPatternModel(urlPatternModel);
}
webAppModel.pushServletMappingModel(servletMappingModel);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return webAppModel;
}
/**
* 通过浏览器输入的网址自动找到对应的后台处理类
* @param webAppModel 建模后的实体类
* @param url 浏览器访问的网址
* @return
*/
public static String getServletClassByUrl(WebAppModel webAppModel, String url) {
String servletClass = "";
/*
* 找到浏览器网址对应的servlet-name
*/
String servletName = "";
List<ServletMappingModel> servletMappingModels = webAppModel.getServletMappingModels();
for (ServletMappingModel servletMappingModel : servletMappingModels) {
List<UrlPatternModel> urlPatternModels = servletMappingModel.getUrlPatternModels();
for (UrlPatternModel urlPatternModel : urlPatternModels) {
if(url.equals(urlPatternModel.getContext())) {
ServletNameModel servletNameModel = servletMappingModel.getServletNameModel();
servletName = servletNameModel.getContext();
}
}
}
/*
* 找到servlet-name对应的后台处理类
*/
List<ServletModel> servletModels = webAppModel.getServletModels();
for (ServletModel servletModel : servletModels) {
ServletNameModel servletNameModel = servletModel.getServletNameModel();
if(servletName.equals(servletNameModel.getContext())) {
ServletClassModel servletClassModel = servletModel.getServletClassModel();
servletClass = servletClassModel.getContext();
}
}
return servletClass;
}
public static void main(String[] args) {
WebAppModel webAppModel = WebAppModelFactory.buildWebAppModel();
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);
}
}
四。建模要用的方法
23种模式→工厂模式
五。总结
XML建模就是将XML的格式转成对象进行操作。
工厂模式就是用来生产configmodel内容的。。
今天的分享就到这啦~我们下期再见~~~