今天我给大家分享关于XML建模的基础。
目录
今天我给大家分享关于XML建模的基础。
一.什么是XML建模?
就是将XML配置文件以模型的方式,进行输出操作。
二.如何将XML建模?
步骤:①实例对象模型
1、ForwardModel
2、ActionModel
3.ConfigModel
23种设计模式之工厂模式
4.ConfigModelFactory
三.XML(servlet案例)
ServletClassModel
ServletMappingModel
WebAppModel
WebAppModelFactory
四。建模要用的方法
五。总结
一.什么是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内容的。。
今天的分享就到这啦~我们下期再见~~~