Welcome Huihui's Code World ! !
接下来看看由辉辉所写的关于xml的相关操作吧
目录
Welcome Huihui's Code World ! !
是什么
为什么要使用xml建模
怎么使用
1.建立Java模型对象的前期准备
2.建立Java模型对象【由上述分析可以知道,我们需要建立三个实体模型】
3.运用工厂模式填充内容
辉辉小贴士:怎么样才知道自己精准掌握了呢?答案就是做个题目爽一爽
需求:对web.xml进行建模,并且通过url-pattern拿到servlet-class
- XML建模是一种用于描述和定义XML文档结构的方法
- 主要目的是为了确保XML文档的结构清晰、明确、规范
- 在XML建模中,通常采用XML Schema、DTD或RELAX NG等XML文档结构定义语言描述XML文档的结构,其中包括元素、属性、命名空间等信息
- 通过XML建模,可以准确地定义XML文档的结构,从而使得XML文档的操作和处理更为简便、高效
- XML建模广泛应用于电子商务、金融管理、政府信息化、Web服务以及数据交换等领域
通俗来理解的话:就是将XML配置文件中的元素、属性、文本信息转换成Java对象的过程
- 使用XML建模的主要原因是XML的通用性和灵活性
- 使用XML建模可以对XML文档进行结构化描述,有效地减少了文档中存在的歧义和冗余。这有助于避免在XML数据交换过程中出现错误,提高了数据交换的精度和可靠性
- XML建模工具也可以提供界面化的编辑和校验功能,帮助开发人员更加方便地创建和维XML文档
⭐⭐总之,使用XML建模可以提高XML文档的规范化程度,降低数据交换的风险,提高数据处理的效率和质量
首先看一个配置文件]>
对其进行分析
package com.wh.model; public class Demo1 { /** * 用面向对象的方式去处理xml文件【获取xml文件的内容】 * 1.用面向对象思想去形容或是说去封装模型对象(是xml文件) * 2.将xml的内容初始化到到已经描述出来的模型之中 */ // config.xml文件中的根节点是config,里面有action标签; // action标签中有两个属性(name和type),action中还有子节点forward; // forward标签中有两个属性(name,path,redirect); // 可以往config标签中添加action标签,也可以往action标签中添加forward标签 /** * 面向对象去形容xml文件 */ //config // 在configModel中能够添加actionModel,而且actionModel在configModel中是唯一的, // 那么就会有一个容器(也就是属性),能够一对一的去存储actionModel //action //因为在actionModel中能够添加forwardModel,而且forwardModel在actionModel中是唯一的, //那么在actionModel中会有一个容器(属性),可以一对一存储forwardModel //actionModel中还有两个属性:name和type //forward //forwardModel中有属性:name,path,redirect }
①ForwardModel
package com.wh.model; public class ForwardModel { // forwardModel中有属性:name,path,redirect 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 + "]"; } }
②ActionModel
package com.wh.model; import java.util.HashMap; import java.util.Map; public class ActionModel { // action // forwardModel在actionModel中是唯一的,那么在actionModel中会有一个容器(属性),可以一对一存储forwardModel // actionModel中还有两个属性:path和type private String path; private String type; private Map
forwardMap = 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; } // 在actionModel中能够添加forwardModel public void push(ForwardModel forwardModel) { forwardMap.put(forwardModel.getName(), forwardModel); } // 通过name值在action中拿到forward public ForwardModel pop(String name) { return forwardMap.get(name); } } ③ConfigModel
package com.wh.model; import java.util.HashMap; import java.util.Map; public class ConfigModel { // config // actionModel在configModel中是唯一的,那么就会有一个容器(也就是属性),能够一对一的去存储actionModel private Map
actionMap=new HashMap (); // 在configModel中能够添加actionModel public void push(ActionModel actionModel) { actionMap.put(actionModel.getPath(), actionModel); } //通过path在config里面拿到action public ActionModel pop(String path) { return actionMap.get(path); } public static void main(String[] args) throws Exception { //获取第二个action中第二个forward的path // ConfigModel configModel = new ConfigModel(); // ActionModel actionModel = configModel.pop("/loginAction"); // ForwardModel forwardModel = actionModel.pop("success"); // System.out.println(forwardModel.getPath()); //题目需求已经完成,但是我们好像忽略了一个很重要的事,我们只是将xml文件封装了而已,并没有拿到xml文件的内容 //在这里,我们需要用到设计模式中的工厂模式去获取xml中的内容 ConfigModelFactory c=new ConfigModelFactory(); ConfigModel build = ConfigModelFactory.build(); ActionModel pop = build.pop("/loginAction"); String path = pop.getType(); System.out.println(path); ForwardModel pop2 = pop.pop("success"); System.out.println(pop2); String name = pop2.getName(); System.out.println(name); } }
在这里我们需要完成一个需求:获取第二个action中第二个forward的path【在ConfigModel中我们已经做了相应的处理,可是我们还没有拿到xml文件的内容,所以我们需要用到设计模式中的工厂模式去获取xml中的内容】
ConfigModelFactory
package com.wh.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; public class ConfigModelFactory { public static ConfigModel build() throws Exception { ConfigModel configModel = new ConfigModel();//示例ConfigModel InputStream in = ConfigModelFactory.class.getResourceAsStream("/config.xml");//获取流 SAXReader sr = new SAXReader(); Document read = sr.read(in);//读流 List
actionEles = read.selectNodes("/config/action");//获取节点 //填充内容到ActionModel for (Element actionEle : actionEles) { ActionModel actionModel = new ActionModel();//实例 actionModel.setPath(actionEle.attributeValue("path"));//path actionModel.setType(actionEle.attributeValue("type"));//type //填充内容到ForwardModel List forwardEles = actionEle.selectNodes("forward"); for (Element forwardEle : forwardEles) { ForwardModel forwardModel = new ForwardModel();//实例 forwardModel.setName(forwardEle.attributeValue("name"));//name forwardModel.setPath(forwardEle.attributeValue("path"));//path //因为redirect是Boolean类型,所以与上述操作有些许不一样 forwardModel.setRedirect(!"false".equals(forwardEle.attribute("redirect"))); actionModel.push(forwardModel);//把forwardModel的内容加到actionModel中 } configModel.push(actionModel);//把actionModel的内容加到configModel中 } return configModel; } public static void main(String[] args) throws Exception { ConfigModel build = ConfigModelFactory.build(); System.out.println(build); // ActionModel actionModel = configModel.pop("/loginAction"); // ForwardModel forwardModel = actionModel.pop("success"); // System.out.println(forwardModel.getPath()); ActionModel pop = build.pop("/loginAction"); System.out.println(pop.getType()); } } 这样子的话,我们已经将题目的需求完成了,现在只需要测试一下了,可以选择在ConfigModelFactory中测试,也可以选择在ConfigModel中测试,这里博主是在ConfigModel中测试的,话不多说,让我们看看运行结果吧
以此类推,当我们熟练之后,就不需要再进行对配置文件的分析了,我们可以直接开始建立java模型对象
配置文件
jrebelServlet com.zking.xml.JrebelServlet jrebelServlet /jrebelServlet jrebelServlet2 com.zking.xml.JrebelServlet2 jrebelServlet2 /jrebelServlet2 /jrebelServlet3 建立java模型对象
WebAppModel
package com.wh.model; import java.util.ArrayList; import java.util.List; public class WebAppModel { /** * ServletModel */ private List
ServletModelList = new ArrayList (); public void push(ServletModel servletModel) { ServletModelList.add(servletModel); } public List popServletModel() { return ServletModelList; } /** * ServletMappingModel */ private List ServletMappingModelList = new ArrayList<>(); public void push(ServletMappingModel servletMappingModel) { ServletMappingModelList.add(servletMappingModel); } public List popServletMappingModel(){ return ServletMappingModelList; } } ServletModel
package com.wh.model; import java.util.ArrayList; import java.util.List; 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.wh.model; public class ServletNameModel { private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
ServletClassModel
package com.wh.model; public class ServletClassModel { private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
ServletMappingModel
package com.wh.model; import java.util.ArrayList; import java.util.List; public class ServletMappingModel { private ServletNameModel servletNameModel; public ServletNameModel getServletNameModel() { return servletNameModel; } public void setServletNameModel(ServletNameModel servletNameModel) { this.servletNameModel = servletNameModel; } private List
UrlPatternModelList = new ArrayList (); public void push(UrlPatternModel urlPatternModel) { UrlPatternModelList.add(urlPatternModel); } public List popUrlPatternModel(){ return UrlPatternModelList; } } UrlPatternModel
package com.wh.model; public class UrlPatternModel { private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
WebAppModelFactory
package com.wh.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; public class WebAppModelFactory { /** * 填充内容 * * @return webAppModel * @throws Exception */ public static WebAppModel build() throws Exception { WebAppModel webAppModel = new WebAppModel();// 实例化 InputStream in = ConfigModelFactory.class.getResourceAsStream("/web.xml");// 获取流 SAXReader sr = new SAXReader(); Document read = sr.read(in);// 读流 // 填充内容到servlet List
servletEles = read.selectNodes("/web-app/servlet"); for (Element servletEle : servletEles) { // 填充内容到servletNameModel Element servletnameEle = (Element) servletEle.selectSingleNode("servlet-name"); ServletNameModel servletNameModel = new ServletNameModel(); servletNameModel.setContent(servletnameEle.getText()); // 填充内容到servletClassModel Element servletclassEle = (Element) servletEle.selectSingleNode("servlet-class"); ServletClassModel servletClassModel = new ServletClassModel(); servletClassModel.setContent(servletclassEle.getText()); // 填充内容到servlet ServletModel servletModel = new ServletModel(); servletModel.setServletNameModel(servletNameModel); servletModel.setServletClassModel(servletClassModel); webAppModel.push(servletModel); } // 填充内容到servlet-mapping List servletmappingEles = read.selectNodes("/web-app/servlet-mapping"); for (Element servletmappingEle : servletmappingEles) { // 填充内容到servletNameModel Element servletnameEle = (Element) servletmappingEle.selectSingleNode("servlet-name"); ServletNameModel servletNameModel = new ServletNameModel(); servletNameModel.setContent(servletnameEle.getText()); // 填充内容到urlPatternModel Element urlpatternEle = (Element) servletmappingEle.selectSingleNode("url-pattern"); UrlPatternModel urlPatternModel = new UrlPatternModel(); urlPatternModel.setContent(urlpatternEle.getText()); // 填充内容到servlet-mapping ServletMappingModel servletMappingModel = new ServletMappingModel(); servletMappingModel.setServletNameModel(servletNameModel); servletMappingModel.push(urlPatternModel); webAppModel.push(servletMappingModel); } return webAppModel; } /** * 通过url-pattern拿到servlet-class * * @param url * 传递进去的url * @return servletclass * @throws Exception */ public static String obtainservletclass(String url) throws Exception { WebAppModel webAppModel = WebAppModelFactory.build();// 拿到填充数据的方法 String servletclass = " ";// 最终返回的servlet-class /** * 操作:先通过url-pattern拿到servlet-name */ String servletname = " ";// 相应的url-pattern拿到的servlet-name // 先遍历url-pattern的父节点servlet-mapping List servletMappingModels = webAppModel.popServletMappingModel(); for (ServletMappingModel servletMappingModel : servletMappingModels) { // 再拿到它的子节点url-pattern并且遍历 List popUrlPatternModel = servletMappingModel.popUrlPatternModel(); for (UrlPatternModel urlPatternModel : popUrlPatternModel) { // 如果我传进来的url与我的xml文件中的url-pattern标签中的值相等,那么我就拿到url-pattern同级的servlet-name【因为servlet中也有servlet-name这个标签】 // 实质上是因为是通过了映射,所以servlet和servlet-mapping中所写的servlet-name需要一致 if (url.equals(urlPatternModel.getContent())) { ServletNameModel servletNameModel = servletMappingModel.getServletNameModel(); servletname = servletNameModel.getContent(); } } } /** * 通过servlet-name拿到对应的servlet-class */ // 先遍历servlet-name的父节点servlet List servletModels = webAppModel.popServletModel(); for (ServletModel servletModel : servletModels) { ServletNameModel servletNameModel = servletModel.getServletNameModel(); // 如果我已经得到的servletname与servlet-name标签中的值相等,那么就拿到servlet-name同级的servlet-class if (servletname.equals(servletNameModel.getContent())) { ServletClassModel servletClassModel = servletModel.getServletClassModel(); servletclass = servletClassModel.getContent(); } } return servletclass; } public static void main(String[] args) throws Exception { String obtainservletclass = obtainservletclass("/jrebelServlet"); System.out.println(obtainservletclass); } }
好啦,今天的分享就到这了,希望能够帮到你呢!