XML建模
建模的由来:
就是将指定的xml字符串当作对象来操作
好处在于,只需要调用指定的方法就可以完成预定的字符串获取;
建模的一个思路:
1、分析需要被建模的文件中有那几个对象
2、每个对象拥有的行为以及属性
3、定义对象从小到大(从里到外)
4、通过23种的设计模式中的工厂模式,解析xml生产出指定对象
注:属性为String类型,子元素标签则是map的值,子元素标签的唯一标识则为map的值
建模分两步:
1、以面向对象的编程思想,描述xml资源文件
2、将xml文件中内容封装进model实体对象。
实列:
实列是通过对一个web.xml文件进行建模
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>
分析出xml文件中的属性以及行为,创建Model(模型)对象
.分析出以下所有对象
ServletNameModel (servlet-name)
package com.zking.ServletModel; public class ServletNameModel { private String context; public String getContext() { return context; } public void setContext(String context) { this.context = context; } }
ServletClassModel (servlet-class)
package com.zking.ServletModel; public class ServletClassModel { private String context; public String getContext() { return context; } public void setContext(String context) { this.context = context; } }
ServletUrlpatternModel (url-pattern)
package com.zking.ServletModel; public class ServletUrlPatternModel { private String context; public String getContext() { return context; } public void setContext(String context) { this.context = context; } }
ServletModel (servlet)
package com.zking.ServletModel; public class ServletModel { private ServletNameModel servletNameModel; private ServletClassModel servletClassModel; public ServletNameModel getServletNameModel() { return servletNameModel; } public void setServletNameModel(ServletNameModel servletNameModel) { this.servletNameModel = servletNameModel; } public ServletClassModel getServletClassModel() { return servletClassModel; } public void setServletClassModel(ServletClassModel servletClassModel) { this.servletClassModel = servletClassModel; } }
ServletMappingModel (servlet-Mapping)
package com.zking.ServletModel; import java.util.ArrayList; import java.util.List; import org.w3c.dom.ls.LSInput; public class ServletMappingModel { private ServletNameModel servletNameModel; private List<ServletUrlPatternModel> servletUrlPatternModels= new ArrayList<>(); public ServletNameModel getServletNameModel() { return servletNameModel; } public void pushUrlPatternModel(ServletUrlPatternModel urlPatternModel) { servletUrlPatternModels.add(urlPatternModel); } public void setServletNameModel(ServletNameModel servletNameModel) { this.servletNameModel = servletNameModel; } public List<ServletUrlPatternModel> getServletUrlPatternModels() { return servletUrlPatternModels; } }
ServletWebAppModel (web-app)
package com.zking.ServletModel; import java.util.ArrayList; import java.util.List; public class ServletWebAppModel { private List<ServletModel> servletModels=new ArrayList<>(); private List<ServletMappingModel> servletMappingModels = new ArrayList<>(); public List<ServletModel> getServletModels() { return servletModels; } public List<ServletMappingModel> getServletMappingModels() { return servletMappingModels; } public void pushServletModel(ServletModel servletModel) { servletModels.add(servletModel); } public void pushServletMappingModel(ServletMappingModel servletMappingModel) { servletMappingModels.add(servletMappingModel); } }
用的是23种设计模式中的工厂模式,Factory
package com.zking.ServletModel; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ServletWebFactory { public static ServletWebAppModel buildWebAppModel() { String xmlPath = "/web.xml"; return buildWebAppModel(xmlPath); } /** * 建模 * * @param xmlPath * @return */ public static ServletWebAppModel buildWebAppModel(String xmlPath) { InputStream in = ServletWebFactory.class.getResourceAsStream(xmlPath); SAXReader saxReader = new SAXReader(); ServletWebAppModel webAppModel = new ServletWebAppModel(); 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) { ServletUrlPatternModel urlPatternModel = new ServletUrlPatternModel(); 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(ServletWebAppModel webAppModel, String url) { String servletClass = ""; /* * 找到浏览器网址对应的servlet-name */ String servletName = ""; List<ServletMappingModel> servletMappingModels = webAppModel.getServletMappingModels(); for (ServletMappingModel servletMappingModel : servletMappingModels) { List<ServletUrlPatternModel> urlPatternModels = servletMappingModel.getServletUrlPatternModels(); for (ServletUrlPatternModel 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) { ServletWebAppModel webAppModel = ServletWebFactory.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); } }
运行代码得到结果: