一.什么是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内容的。。
今天的分享就到这啦~我们下期再见~~~
