我们都知道xml有两个功能:数据交互和做配置,而xml建模就是针对于第二个功能的,xml文件做配置的时候我们读取资源文件的时候每次都需要写解析的代码然后得到数据,那我们下一次再需要这个资源文件中的其他数据的时候就还需要解析这个文件,酱紫会很麻烦,xml建模就是为了提高代码的复用性,我们会将配置文件中的标签、元素视为模型对象进行封装,然后写一个工厂类,里面一定会有生产指定模型对象的方法。
分析下面的xml文件,我认为这个web.xml文件中有web-app标签,其中包含着servlet标签和servlet-mapping标签,可以新增servlet标签和servlet-mapping标签,也可以通过servlet-name寻找到servlet和servlet-mapping,而servlet中有servlet-name和servlet-class属,servlet-mapping中有servlet-name和url-pattern属性:
<?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>
Servlet中有servlet-name和servlet-class属性:
package com.zengjing;
public class ServletModel {
private String servletName;
private String servletClass;
public String getServletName() {
return servletName;
}
public void setServletName(String servletName) {
this.servletName = servletName;
}
public String getServletClass() {
return servletClass;
}
public void setServletClass(String servletClass) {
this.servletClass = servletClass;
}
@Override
public String toString() {
return "ServletModel [servletName=" + servletName + ", servletClass=" + servletClass + "]";
}
public ServletModel(String servletName, String servletClass) {
this.servletName = servletName;
this.servletClass = servletClass;
}
public ServletModel() {}
}
ServletMapping中包含servlet-name和url-pattern,由于web.xml文件中第二个servle-mapping中url-pattern有两个,将其视为属性的我把他用集合装起来了:
package com.zengjing;
import java.util.List;
public class ServletMappingModel {
private String servletName;
private List<String> urlPattern;
public String getServletName() {
return servletName;
}
public void setServletName(String servletName) {
this.servletName = servletName;
}
public List<String> getUrlPattern() {
return urlPattern;
}
public void setUrlPattern(List<String> urlPattern) {
this.urlPattern = urlPattern;
}
@Override
public String toString() {
return "ServletMappingModel [servletName=" + servletName + ", urlPattern=" + urlPattern + "]";
}
public ServletMappingModel(String servletName, List<String> urlPattern) {
this.servletName = servletName;
this.urlPattern = urlPattern;
}
public ServletMappingModel() {}
}
web-app标签中包含着servlet和servlet-mapping,分别以两个map集合来保存,我也试图用过一个map集合来存储,值的类型设为object,但是那样子的话,servlet和对应的servlet-mapping的servlet-name值是一致的,我是以其作为key,就会导致值覆盖的问题,如果想把object换成ServletModel类型或者ServletMappingModel类型还会出现转换类型错误。
然后两个集合都有两个方对应的法,就是将值压入(push)到集合中和从集合中取(pop)出来,将值压入到集合中,以ServletName为key,存储值,也以name取出值:
package com.zengjing;
import java.util.HashMap;
import java.util.Map;
public class WebAppModel {
private Map<String, ServletModel> servletMap=new HashMap<String, ServletModel>();
private Map<String, ServletMappingModel> servletMapingMap=new HashMap<String, ServletMappingModel>();
/**
* 将指定的servlet对象压入到servletMap集合中
* @param servletModel
*/
public void ServletPush(ServletModel servletModel) {
servletMap.put(servletModel.getServletName(), servletModel);
}
/**
* 将指定的servletMapping对象压入到servletMapingMap集合中
* @param servletMappingModel
*/
public void ServletMappingPush(ServletMappingModel servletMappingModel) {
servletMapingMap.put(servletMappingModel.getServletName(), servletMappingModel);
}
public ServletModel Servletpop(String name) {
return servletMap.get(name);
}
public ServletMappingModel ServletMappingpop(String name) {
return servletMapingMap.get(name);
}
@Override
public String toString() {
return "WebAppModel [servletMap=" + servletMap + ", servletMapingMap=" + servletMapingMap + "]";
}
}
工厂类一般一定会有一个或多个生产指定对象模型的方法,解析xml文件将servlet和servlet-mapping的值读取出来并赋给webAppModel中的两个map集合,并将webAppModel返回;
package com.zengjing;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
* 一般工厂一定会有一个方法 生产指定模型对象的方法
* @author jiang
*
* date 下午9:07:13
*/
public class WebAppModelFactory {
public WebAppModel build(String path) throws Exception {
//path指的是资源文件
InputStream in = WebAppModelFactory.class.getResourceAsStream(path);
SAXReader reader=new SAXReader();
//资源文件中的内容
Document doc = reader.read(in);
ServletModel servletModel=null;
ServletMappingModel servletMappingModel=null;
List<Element> servletele=doc.selectNodes("/web-app/servlet");
WebAppModel webAppModel=new WebAppModel();
for (Element ele : servletele) {
servletModel=new ServletModel();
servletModel.setServletName(ele.selectSingleNode("servlet-name").getText());
servletModel.setServletClass(ele.selectSingleNode("servlet-class").getText());
webAppModel.ServletPush(servletModel);
}
List<Element> servletMappingele = doc.selectNodes("/web-app/servlet-mapping");
for (Element ele1 : servletMappingele) {
servletMappingModel= new ServletMappingModel();
servletMappingModel.setServletName(ele1.selectSingleNode("servlet-name").getText());
List<Element> urleles = ele1.selectNodes("url-pattern");
List<String> str=new ArrayList<String>();
for (Element urlele : urleles) {
str.add(urlele.getText());
}
servletMappingModel.setUrlPattern(str);
webAppModel.ServletMappingPush(servletMappingModel);
}
return webAppModel;
}
public WebAppModel build() throws Exception {
return build("/web.xml");
}
}
通过servlet-name获得servlet:
通过servlet-name获得servlet-mapping中的url-pattern:
平平无奇的代码机器今日分享到此结束啦,有问题欢迎指教哦 ~ 也希望江的博客能够帮助到你们嘻嘻嘻