作业:config.xml解析
1、获取所有action中的type的值
public static void main(String[] args) throws Exception { InputStream in=XmlDemo.class.getResourceAsStream("config.xml"); SAXReader sax= new SAXReader(); Document doc=sax.read(in); //获取所有action中的type的值 List<Element> stuEles= doc.selectNodes("/config/action"); for (Element stuEle : stuEles) { String type=stuEle.attributeValue("type"); System.out.println(type); }
2、获取第二个action中的type的值
List<Element> stuEles= doc.selectNodes("/config/action"); for (Element stuEle : stuEles) { if("/loginAction".equals(stuEle.attributeValue("path"))) { String type=stuEle.attributeValue("type"); System.out.println(type); } }
3、获取第二个action的所有forward的path
List<Element> stuEles= doc.selectNodes("/config/action"); for (Element stuEle : stuEles) { if("/loginAction".equals(stuEle.attributeValue("path"))) { List<Element> ford=(List<Element>) stuEle.selectNodes("forward"); for (Element element : ford) { String path=element.attributeValue("path"); System.out.println(path); } } }
4、获取第二个action的第二个forward的path
List<Element> stuEles= doc.selectNodes("/config/action"); for (Element stuEle : stuEles) { if("/loginAction".equals(stuEle.attributeValue("path"))) { List<Element> ford=(List<Element>) stuEle.selectNodes("forward"); for (Element element : ford) { if("success".equals(element.attributeValue("name"))) { String path=element.attributeValue("path"); System.out.println(path); } } } }
Xml建模
1.什么是Xml建模
将XML配置文件中的元素,属性,文本信息 转换成对象的过程叫XML建模
2.XML建模
1.根据XML配置文件元素节点创建元素,节点,实体类
ConfigModel ActionModel ForwardModel
2.利用dom4j+xpath技术实现XML建模ConfigModelFactory
2. XML建模类
ConfigModel
ActionModel
ForwardModel
ConfigModelFactory
建模的思路
1、分析需要被建模的文件中有那几个对象
2、每个对象拥有的行为以及属性
3、定义对象从小到大(从里到外)
4、通过23种的设计模式中的工厂模式,解析xml生产出指定对象
好处:
提高代码的复用性
4.利用工程模式+dom4j+xpath解析XML配置文件
Config.xml文件
<?xml version="1.0" encoding="UTF-8"?> <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>
3.使用Map集合存放子节点元素,其中Key为子节点的唯一属性,Value为整个子节点对象。
定义对象实体类
package com.zking.model; public class FowardModel { /* * 添加节点属性 */ private String name; private String path; private Boolean reairect; 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 getReairect() { return reairect; } public void setReairect(Boolean reairect) { this.reairect = reairect; } }
行为及属性
package com.zking.model; import java.util.HashMap; import java.util.Map; public class ActionModel { private String path; private String type; private Map<String, FowardModel> 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; } //存放到Map集合 public void push(FowardModel fowardModel) { fmap.put(fowardModel.getName(), fowardModel); } //获取 返回FowardModel public FowardModel pop(String name) { return fmap.get(name); } }
package com.zking.model; import java.util.HashMap; import java.util.Map; public class ConfigModel { private Map<String, ActionModel> amap=new HashMap<>(); public void push(ActionModel actionModel) { amap.put(actionModel.getPath(), actionModel); } public ActionModel pop(String path) { return amap.get(path); } }
4.利用工程模式+dom4j+xpath解析XML配置文件
导入dom4j包
package com.zking.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; /* * * 23设计模式之一:工厂模式 用来将资源文件生产指定的实体类 * 处理Java中所遇到的一些特定的一些问题 * * 好处: * 提高代码复用性 */ public class ConfigModelFactory { public static ConfigModel build() throws DocumentException { return ConfigModel("config.xml"); } /* * 生产出有类容的实体类ConfigModel */ private static ConfigModel ConfigModel(String xmlPath) throws DocumentException { // TODO Auto-generated method stub // 创建ConfigModel对象 ConfigModel configModel=new ConfigModel(); ActionModel actionModel=null; FowardModel fowardModel=null; InputStream in = ConfigModelFactory.class.getResourceAsStream(xmlPath); SAXReader saxRead=new SAXReader(); Document doc = saxRead.read(in); List<Element> actionEles = doc.selectNodes("/config/action"); for (Element actionEle : actionEles) { actionModel=new ActionModel(); //给actionModel对象填充Xml中的action标签的类容 actionModel.setPath(actionEle.attributeValue("path")); actionModel.setType(actionEle.attributeValue("type")); List<Element> fowardEles = actionEle.selectNodes("foward"); for (Element fowardEle : fowardEles) { fowardModel=new FowardModel(); //给fowardModel对象填充Xml中的foward标签的类容 fowardModel.setName(fowardEle.attributeValue("name")); fowardModel.setPath(fowardEle.attributeValue("path")); fowardModel.setReairect(!"false".equals(fowardEle.attributeValue("redirect"))); //<forward name="failed" path="/login.jsp" redirect="false" /> // redirect默认true 重定向 //只有false才是转发 //fowardEle.attributeValue("redirect")拿到是xml中你所填的值 //不填 重定向 !"false".equals(fowardEle.attributeValue("redirect")) false //填 true 重定向 !"false".equals(fowardEle.attributeValue("redirect")) false //填false 转发 !"false".equals(fowardEle.attributeValue("redirect")) true actionModel.push(fowardModel); } configModel.push(actionModel); } return configModel; } public static void main(String[] args) throws DocumentException { ConfigModel configModel=ConfigModelFactory.build(); ActionModel actionModel= configModel.pop("/loginAction"); System.out.println(actionModel.getType()); } }
控制台输入结果:
Xml建模作业
ServletClassModel
package com.zking.xml.webModel; public class ServletClassModel { private String context; public String getContext() { return context; } public void setContext(String context) { this.context = context; } }
ServletMappingModel
package com.zking.xml.webModel; import java.util.ArrayList; import java.util.List; 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; } }
ServletModel
package com.zking.xml.webModel; 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; } }
ServletNameModel
package com.zking.xml.webModel; public class ServletNameModel { private String context; public String getContext() { return context; } public void setContext(String context) { this.context = context; } }
UrlPatternModel
package com.zking.xml.webModel; public class UrlPatternModel { private String context; public String getContext() { return context; } public void setContext(String context) { this.context = context; } }
WebAppModel
package com.zking.xml.webModel; import java.util.ArrayList; import java.util.List; 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.zking.xml.webModel; 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; public class WebAppModelFactory { public static WebAppModel buildWebAppModel() { String xmlPath = "/web.xml"; return buildWebAppModel(xmlPath); } 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); List<Element> servletEles = doc.selectNodes("/web-app/servlet"); for (Element servletEle : servletEles) { ServletModel servletModel = new ServletModel(); 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); } List<Element> servletMappingEles = doc.selectNodes("/web-app/servlet-mapping"); for (Element servletMappingEle : servletMappingEles) { ServletMappingModel servletMappingModel = new ServletMappingModel(); 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; } public static String getServletClassByUrl(WebAppModel webAppModel, String url) { String servletClass = ""; 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(); } } } 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); } }
2019-06-1119:22:01