2.拓展案例
为了清晰明了,我将里面的代码进行了修改方便后期校验。
第一步:我们先对xml文件里面的节点进行分析看需要建立几个模型(实体),里面有六个模型分别是WebappModel、ServletModel、ServletnameModel、ServletclassModel、ServletMappingModel、UrlpatternModel。
第二步:分析每个Model里的属性(我们由小到大进行分析)。
UrlpatternModel:因为该标签没有自带属性只有Context文本内容所以只有属性Context。
ServletnameModel:因为该标签没有自带属性只有Context文本内容所以只有属性Context。
ServletMappingModel:因为该标签没有自带属性,也没有Context文本内容,只有两个标签,而url-pattern标签可能存在多个的情况所以用list集合保存,servlet-name标签则是用ServletnameModel实体。属性有实体类型ServletnameModel、list集合类型List<UrlpatternModel>。
ServletclassModel:因为该标签没有自带属性只有Context文本内容所以只有属性Context。
ServletModel:因为该标签没有自带属性,也没有Context文本内容,只有两个标签,所以属性有实体类型ServletnameModel、实体类型ServletclassModel。
WebappModel:因为该标签没有自带属性,也没有Context文本内容,只有两个标签,而这两个标签都有存在多个的可能性所以有属性list集合类型List<ServletModel>、List<ServletmappingModel>。
第三步:编写Model实体和set和get方法,注意set方法添加进去的是实体而不是集合,需要修改。
第四步:模拟工厂,初始化数据,因为webapp标签下有两个子标签,所以解析后需要单独对servlet和servletmapping进行遍历然后将解析内容添加到实体内。
👇👇下面我们直接看代码!!
①UrlpatternModel模型
package XW.J2EE.XML03.Work; /** * url-pattern标签实体 * @author 索隆 * */ public class UrlpatternModel { private String Context; public String getContext() { return Context; } public void setContext(String context) { Context = context; } @Override public String toString() { return "UrlpatternModel [Context=" + Context + "]"; } }
②ServletnameModel模型
package XW.J2EE.XML03.Work; /** * servlet-name标签实体 * * @author 索隆 * */ public class ServletnameModel { private String Context; public String getContext() { return Context; } public void setContext(String context) { Context = context; } @Override public String toString() { return "ServletnameModel [Context=" + Context + "]"; } }
③ServletMappingModel模型
package XW.J2EE.XML03.Work; import java.util.ArrayList; import java.util.List; /** * servlet-mapping标签实体 * * @author 索隆 * */ public class ServletmappingModel { private ServletnameModel servletnameList; private List<UrlpatternModel> urlpatternList = new ArrayList<UrlpatternModel>(); public ServletnameModel getServletnameList() { return servletnameList; } public void setServletnameList(ServletnameModel servletnameList) { this.servletnameList = servletnameList; } public List<UrlpatternModel> getUrlpatternList() { return urlpatternList; } public void setUrlpatternList(UrlpatternModel urlpattern) { urlpatternList.add(urlpattern); } }
④ServletclassModel模型
package XW.J2EE.XML03.Work; /**servlet-class标签实体 * @author 索隆 * */ public class ServletclassModel { private String Cotext; public String getCotext() { return Cotext; } public void setCotext(String cotext) { Cotext = cotext; } }
⑤ServletModel模型
package XW.J2EE.XML03.Work; /**servlet标签实体 * @author 索隆 * */ public class ServletModel { private ServletnameModel sssname; private ServletclassModel sssclass; public ServletnameModel getSname() { return sssname; } public void setSname(ServletnameModel sname) { this.sssname = sname; } public ServletclassModel getSclass() { return sssclass; } public void setSclass(ServletclassModel sclass) { this.sssclass = sclass; } }
⑥WebappModel模型
package XW.J2EE.XML03.Work; import java.util.ArrayList; import java.util.List; public class WebappModel { private List<ServletModel> servletList = new ArrayList<>(); private List<ServletmappingModel> servletmappingList = new ArrayList<>(); public List<ServletModel> getServletList() { return servletList; } public void setServletList(ServletModel servlet) { servletList.add(servlet); } public List<ServletmappingModel> getServletmappingList() { return servletmappingList; } public void setServletmappingList(ServletmappingModel servletmapping) { servletmappingList .add(servletmapping); } @Override public String toString() { return "WebappModel [servletList=" + servletList + ", servletmappingList=" + servletmappingList + "]"; } }
模拟工厂
⑦WebXmlFactory
package XW.J2EE.XML03.Work; 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; /** * web.xml工厂,初始化数据 * * @author 索隆 * */ public class WebXmlFactory { public static WebappModel build(String xmlpath) throws Exception { // WebappModel实体 WebappModel WebappModel = new WebappModel(); // 获取配置文件并转换成流对象 InputStream ins = WebXmlFactory.class.getResourceAsStream(xmlpath); // 实例化dom4j SAXReader sa = new SAXReader(); // dom4j读取流 Document read = sa.read(ins); // 获取web-app标签下的所有<servlet>标签 // ServletModel实体 ServletModel servletModel = new ServletModel(); List<Element> servletNodes = read.selectNodes("/web-app/servlet"); for (Element servletNode : servletNodes) { // servlet标签下所有servlet-name标签并将cotext内容添加Servletname实体 List<Element> servletnameNodes = servletNode.selectNodes("servlet-name"); for (Element servletnameNode : servletnameNodes) { // Servletname实体 ServletnameModel Servletname = new ServletnameModel(); // System.out.println(servletnameNode.getText()); Servletname.setContext(servletnameNode.getText()); // ServletModel添加属性 servletModel.setSname(Servletname); } // servlet标签下所有servlet-class标签并将cotext内容添加Servletclass实体 List<Element> servletclassNodes = servletNode.selectNodes("servlet-class"); for (Element servletclassNode : servletclassNodes) { // Servletclass实体 ServletclassModel Servletclass = new ServletclassModel(); // System.out.println(servletclassNode.getText()); Servletclass.setCotext(servletclassNode.getText()); // ServletModel添加属性 servletModel.setSclass(Servletclass); } } // 添加到WebappModel实体 WebappModel.setServletList(servletModel); // -------------------------------------------------------- // servletmappingModel实体 ServletmappingModel servletmappingModel = new ServletmappingModel(); // 获取web-app标签下的所有<servlet-mapping>标签 List<Element> servletmappingNodes = read.selectNodes("/web-app/servlet-mapping"); for (Element servletmappingNode : servletmappingNodes) { // servlet-mapping标签下所有servlet-name标签并将cotext内容添加Servletname实体 List<Element> servletnameNodes = servletmappingNode.selectNodes("servlet-name"); for (Element servletnameNode : servletnameNodes) { // Servletname实体 ServletnameModel Servletname = new ServletnameModel(); // System.out.println(servletnameNode.getText()); Servletname.setContext(servletnameNode.getText()); // 将Servletname实体加入servletmappingModel实体 servletmappingModel.setServletnameList(Servletname); } // servlet-mapping标签下所有url-pattern标签并将cotext内容添加Urlpattern实体 List<Element> urlpatternNodes = servletmappingNode.selectNodes("url-pattern"); for (Element urlpatternNode : urlpatternNodes) { // Urlpattern实体 UrlpatternModel Urlpattern = new UrlpatternModel(); // System.out.println(urlpatternNode.getText()); Urlpattern.setContext(urlpatternNode.getText()); // 将Urlpattern实体加入servletmappingModel实体 servletmappingModel.setUrlpatternList(Urlpattern); } } // 添加到WebappModel实体 WebappModel.setServletmappingList(servletmappingModel); return WebappModel; } }
最后我们来测试一下
需求:通过url-pattern读取到servlet-class
package XW.J2EE.XML03.Work; import java.util.List; public class Test01 { public static void main(String[] args) throws Exception { //通过url-pattern读取到servlet-class String url="林俊杰的url2"; System.out.println("传递进来的url________"+url); //定义一个servlet-name保存从servlet-mapping找到的servlet-name String servletname=""; WebappModel build = WebXmlFactory.build("web.xml"); List<ServletmappingModel> servletmappingList = build.getServletmappingList(); for (ServletmappingModel servletmappingModel : servletmappingList) { //通过servletmappingModel拿到UrlpatternModel List<UrlpatternModel> urlpatternList = servletmappingModel.getUrlpatternList(); for (UrlpatternModel urlpatternModel : urlpatternList) { //查询指定的url路径找到servlet-name //System.out.println(urlpatternModel.getContext()); if(urlpatternModel.getContext().equals(url)) { //找到了输出servlet-name的值 ServletnameModel servletnameList = servletmappingModel.getServletnameList(); //添加到定义的变量内 servletname=servletnameList.getContext(); System.out.println("servlet-mapping找到的servlet-name________"+servletname); } } } //遍历所有的ServletModel List<ServletModel> servletList = build.getServletList(); for (ServletModel servletModel : servletList) { //拿到ServletModel下所有ServletnameModel ServletnameModel sname = servletModel.getSname(); //判断servlet-mapping中name和servlet是否一致 if(sname.getContext().equals(servletname)) { ServletclassModel sclass = servletModel.getSclass(); System.out.println("servlet-class的值________"+sclass.getCotext()); } } } }
打印结果
到此我的分享就结束啦!!