xml建模的由来
运用了面向对象的思想,把指定的字符串当作对象来操作的这样一个过程!
xml建模的步骤
建模整体分两步:
1、以面向对象的编程思想,描述xml资源文件
2、将xml文件中内容封装进model实体对象。
xml建模的好处
简而言之,xml建模可以提高代码的复用性,更加方便快捷!
只需要调用指定的方法就可以完成预定的字符串获取!
xml建模核心思路
1、分析需要被建模的文件中有那几个对象(有几个标签就有几个对象!)
2、每个对象拥有的行为以及属性!
3、注意定义对象的时候从小到大 从里到外!
4、通过23种的设计模式中的工厂模式,解析xml生产出指定对象!
(工厂就是用来生产你需要的东西)
xml建模实例演示
这里我以我自己做的Web.xml为例!
步骤如下:
第一步:先新建一个项目,并且导入需要的jar包:
(一定要记得导入这两个jar包,否则里面的方法会调用不了);
第二步:
分析你的web.xml里面的内容,分析里面每一个标签有无包含属性或者行为,就像我下面展示的这样!
第三步:根据图片上的标签元素新建实体类,就像下面展示的代码这样:
根据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>
首先是servlet-name的实体类模型
因为servlet节点和servlet-mapping的节点中都包含
servlet-name这一节点,但是因为两个servlet-name的内容是一样的,所以只需要建一个servlet-name的实体类模型就好,无需重复!
package com.wangqiuping;
/**
*
* @author 小汪同学 2020年5月23日 上午8:14:54
*
*/
public class ServletNameModel {
private String context;//内容
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
注意:这里面的内容我用的是context进行表示,下面如果有看到context这一字段,表示的都是内容!
然后是servlet-class的实体类模型
/**
*
* @author 小汪同学 2020年5月23日 上午8:19:22
*
*/
public class ServletClassModel {
private String context;
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
再是servlet-mapping的实体类模型
package com.wangqiuping;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author 小汪同学 2020年5月23日 上午8:49:57
*
*/
public class ServletMappingModel {
private ServletNameModel servletNameModel;
//因为url-pattern有多个值 所以用map集合进行存储 以键值对的形式存在
private Map<String, UrlPatternModel> urlpatternModels=new HashMap<String,UrlPatternModel>();
public ServletNameModel getServletNameModel() {
return servletNameModel;
}
public void setServletNameModel(ServletNameModel servletNameModel) {
this.servletNameModel = servletNameModel;
}
public Map<String, UrlPatternModel> getUrlpatternModels() {
return urlpatternModels;
}
public void setUrlpatternModels(Map<String, UrlPatternModel> urlpatternModels) {
this.urlpatternModels = urlpatternModels;
}
public UrlPatternModel pop(String context) {
UrlPatternModel urlPatternModel=urlpatternModels.get(context);
return urlPatternModel;
}
public void push(UrlPatternModel urlPatternModel,ServletNameModel servletNameModel) {
urlpatternModels.put(servletNameModel.getContext(), urlPatternModel);
}
}
url-pattern的实体类模型
package com.wangqiuping;
/**
*
* @author 小汪同学 2020年5月23日 上午8:19:43
*
*/
public class UrlPatternModel {
private String context;
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
web-app的实体类模型
package com.wangqiuping;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
*
* @author 小汪同学 2020年5月23日 上午9:18:04
*
*/
public class WebAppFactory {
public static WebAppModel build(String path) throws Exception {
InputStream in=WebAppFactory.class.getResourceAsStream(path);
SAXReader reader=new SAXReader();
Document document = reader.read(in);
WebAppModel webAppModel=new WebAppModel();
ServletModel servletModel=null;
ServletMappingModel servletMappingModel=null;
List<Element> servlets=document.selectNodes("/web-app/servlet");
for (Element servletelement : servlets) {
//实例化servlet,servlet-name,servlet-class标签模型
servletModel=new ServletModel();
ServletNameModel servletNameModel=new ServletNameModel();
ServletClassModel servletClassModel=new ServletClassModel();
//获取servlet-name,servlet-class模型中的值
Element servletNameElement=(Element)servletelement.selectSingleNode("servlet-name");
Element servletClassElement=(Element)servletelement.selectSingleNode("servlet-class");
//压进去
servletNameModel.setContext(servletNameElement.getText());
servletClassModel.setContext(servletClassElement.getText());
//将servlet-name,servlet-class添加到servlet中去
servletModel.setServletNameModel(servletNameModel);
servletModel.setServletClassModel(servletClassModel);
//将servlet添加到web-app中
webAppModel.pushs(servletModel);
}
List<Element> mappingElems=document.selectNodes("/web-app/servlet-mapping");
for (Element mappingEle : mappingElems) {
//实例化servlet-mapping,servlet-name,urlPattern的模型
servletMappingModel=new ServletMappingModel();
ServletNameModel servletNameModel = new ServletNameModel();
//获取servlet-name,url-pattern标签
Element servletNameEle = (Element) mappingEle.selectSingleNode("servlet-name");
//添加
servletNameModel.setContext(servletNameEle.getText());
servletMappingModel.setServletNameModel(servletNameModel);
//获取url-pattern
List<Element> urlPatternEles=mappingEle.selectNodes("url-pattern");
//遍历数据
for (Element urlPatternEle : urlPatternEles) {
UrlPatternModel urlPatternModel = new UrlPatternModel();
urlPatternModel.setContext(urlPatternEle.getText());
servletMappingModel.push(urlPatternModel,servletNameModel);
}
//将servlet-mapping填进web-app中
webAppModel.pushmap(servletMappingModel);
}
return webAppModel;
}
public static WebAppModel build() throws Exception{
return build("/web.xml");
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//调用方法
WebAppModel w=WebAppFactory.build();
//得到jrebelServlet进行查询,去获取到servlet
ServletModel servletmodel=w.pops("jrebelServlet");
//获取servletMaping
ServletMappingModel servletMappingModel = w.popmap("jrebelServlet");
//获取url-pattern
UrlPatternModel urlPatternModel= servletMappingModel.pop(servletMappingModel.getServletNameModel().getContext());
//输出
System.out.println("servlet-name="+servletmodel.getServletNameModel().getContext()+"class="+servletmodel.getServletClassModel().getContext());
System.out.println("-------");
System.out.println("servlet-mapping");
System.out.println("servlet-name= "+servletMappingModel.getServletNameModel().getContext()+"\nurl-pattern="+urlPatternModel.getContext());
}
}
最后是webapp的工厂(也就想当于是一个放置整个web-app内容的一个篮子)
关于工厂模式:
工厂模式是23种设计模式的其中一种,可以用来解析并生产出指定对象!
一般会有两个以上的构建方法:
1 动态读取任意位置下框架配置文件的方法
2、 默认框架路径的模型对象方法
实现工厂类的一些核心步骤:
1、首先加载资源文件,
2、获取流对象,再加载流
3、使用selectNodes或者selectSingleNode的方法去寻找节点标签
4、根据节点去寻找数据
5、遍历并添加所需要的模型数据
6、调用方法
7、运行结果
8、查看结果是否正确
package com.wangqiuping;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
*
* @author 小汪同学 2020年5月23日 上午9:18:04
*
*/
public class WebAppFactory {
public static WebAppModel build(String path) throws Exception {
InputStream in=WebAppFactory.class.getResourceAsStream(path);
SAXReader reader=new SAXReader();
Document document = reader.read(in);
WebAppModel webAppModel=new WebAppModel();
ServletModel servletModel=null;
ServletMappingModel servletMappingModel=null;
List<Element> servlets=document.selectNodes("/web-app/servlet");
for (Element servletelement : servlets) {
//实例化servlet,servlet-name,servlet-class标签模型
servletModel=new ServletModel();
ServletNameModel servletNameModel=new ServletNameModel();
ServletClassModel servletClassModel=new ServletClassModel();
//获取servlet-name,servlet-class模型中的值
Element servletNameElement=(Element)servletelement.selectSingleNode("servlet-name");
Element servletClassElement=(Element)servletelement.selectSingleNode("servlet-class");
//压进去
servletNameModel.setContext(servletNameElement.getText());
servletClassModel.setContext(servletClassElement.getText());
//将servlet-name,servlet-class添加到servlet中去
servletModel.setServletNameModel(servletNameModel);
servletModel.setServletClassModel(servletClassModel);
//将servlet添加到web-app中
webAppModel.pushs(servletModel);
}
List<Element> mappingElems=document.selectNodes("/web-app/servlet-mapping");
for (Element mappingEle : mappingElems) {
//实例化servlet-mapping,servlet-name,urlPattern的模型
servletMappingModel=new ServletMappingModel();
ServletNameModel servletNameModel = new ServletNameModel();
//获取servlet-name,url-pattern标签
Element servletNameEle = (Element) mappingEle.selectSingleNode("servlet-name");
//添加
servletNameModel.setContext(servletNameEle.getText());
servletMappingModel.setServletNameModel(servletNameModel);
//获取url-pattern
List<Element> urlPatternEles=mappingEle.selectNodes("url-pattern");
//遍历数据
for (Element urlPatternEle : urlPatternEles) {
UrlPatternModel urlPatternModel = new UrlPatternModel();
urlPatternModel.setContext(urlPatternEle.getText());
servletMappingModel.push(urlPatternModel,servletNameModel);
}
//将servlet-mapping填进web-app中
webAppModel.pushmap(servletMappingModel);
}
return webAppModel;
}
public static WebAppModel build() throws Exception{
return build("/web.xml");
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//调用方法
WebAppModel w=WebAppFactory.build();
//得到jrebelServlet进行查询,去获取到servlet
ServletModel servletmodel=w.pops("jrebelServlet");
//获取servletMaping
ServletMappingModel servletMappingModel = w.popmap("jrebelServlet");
//获取url-pattern
UrlPatternModel urlPatternModel= servletMappingModel.pop(servletMappingModel.getServletNameModel().getContext());
//输出
System.out.println("servlet-name="+servletmodel.getServletNameModel().getContext()+"class="+servletmodel.getServletClassModel().getContext());
System.out.println("-------");
System.out.println("servlet-mapping");
System.out.println("servlet-name= "+servletMappingModel.getServletNameModel().getContext()+"\nurl-pattern="+urlPatternModel.getContext());
}
}
注意要点
1、在新建好项目的时候,一定要记得导入好相关的jar包!
2、在最后写完webapp工厂的实体类之后,一定要记得去调用方法!
3、导入的web.xml文件记得放在src目录下,否则可能找不到你需要读取的路 径,以至报空指针异常!
3、在运行WebAppFactory类的时候,记得运行 java Application !
最终效果
总结
xml建模使代码不再繁琐,并且可以作为一种解决方案应用到我们的学习的框架当中,今天的博客就分享到这,有什么好的建议或者错误欢迎评论留言交流!