XML基础入门:关于XML建模

简介: XML基础入门:关于XML建模

一.什么是XML建模?

就是将XML配置文件以模型的方式,进行输出操作。

这是config.xml的关系图

二.如何将XML建模?

步骤:①实例对象模型

               ForwardModel节点模型

               ActionModel节点模型

               ConfigModel节点模型

理解:一个xml的对象就是一个实体。

1、ForwardModel

代码如下:

package model;
/**
 * ForwardModel节点模型
 * @author 李永安
 *
 */
public class ForwardModel {
  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 + "]";
  }
}

2、ActionModel

代码如下:

package model;
import java.util.HashMap;
import java.util.Map;
/**
 * ActionModel节点模型
 * @author 李永安
 *
 */
public class ActionModel {
  private String path;
  private String type;
  private Map<String, ForwardModel> map = 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;
  }
  public Map<String, ForwardModel> getMap() {
    return map;
  }
  public void setMap(Map<String, ForwardModel> map) {
    this.map = map;
  }
  @Override
  public String toString() {
    return "ActionModel [path=" + path + ", type=" + type + ", map=" + map + "]";
  }
  //将forwardmodel放到actionmodel中(压栈)
  public void push(ForwardModel ForwardModel) {
    map.put(ForwardModel.getName(), ForwardModel);
  }
  //从action中通过name取出forward (堆栈)
  public ForwardModel pop(String name) {
    return map.get(name);
  }
}

3.ConfigModel

代码如下:

package model;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ActionMap;
import org.dom4j.DocumentException;
/**
 * ConfigModel节点模型
 * @author 李永安
 *
 */
public class ConfigModel {
  private Map<String, ActionModel> map = new HashMap<>();
  public ConfigModel() {
    // TODO Auto-generated constructor stub
  }
  public Map<String, ActionModel> getMap() {
    return map;
  }
  public void setMap(Map<String, ActionModel> map) {
    this.map = map;
  }
  @Override
  public String toString() {
    return "ConfigModel [map=" + map + "]";
  }
  public void push(ActionModel ActionModel) {
    map.put(ActionModel.getPath(), ActionModel);
  }
  //通过path获取到action的内容
  public ActionModel pop(String path) {
    return map.get(path);
  }
  public static void main(String[] args) throws DocumentException {
    //题:获取到第二个action的第二个forword的path
    //1.实例configModel的对象
    ConfigModel cm = ConfigModelFactory.build();
    //2.调用pop方法获取到actionmodel的内容 
    ActionModel pop = cm.pop("/loginAction");
    ForwardModel fw = new ForwardModel();
    System.out.println(fw.getPath());
  }
}

23种设计模式之工厂模式

4.ConfigModelFactory

ConfigModelFactory就是用来生产configmodel内容的

代码如下:

package 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;
/**
 * 工厂类
 * @author 李永安
 *
 */
public class ConfigModelFactory {
  public static ConfigModel bulid() throws Exception {
    //1.实例化解析对象
    InputStream is = ConfigModelFactory.class.getResourceAsStream("/config.xml");
    //2.解析xml文件
    SAXReader sr = new SAXReader();
    //3.读取
    Document read = sr.read(is);//得到解析的内容
    ConfigModel ConfigModel = new ConfigModel();
    //4.给configmodel添加内容,就得给actionmodel添加内容
    List<Element> selectNodes = read.selectNodes("/config/action");
    for (Element element : selectNodes) {
      //获取action内容   element
      //给actionmodel添加内容
      ActionModel amd = new ActionModel();
      amd.setPath(element.attributeValue("path"));
      amd.setType(element.attributeValue("type"));
      //给forward添加内容
      List<Element> ForwardNodes = element.selectNodes("forward");
      for (Element element2 : ForwardNodes) {
        //System.out.println(element2.asXML());
        ForwardModel fm = new ForwardModel();
        fm.setName(element2.attributeValue("name"));
        fm.setPath(element2.attributeValue("path"));
        //写false才写
        fm.setRedirect(!"false".equals(element2.attributeValue("redirect")));
        amd.push(fm);
      }
      ConfigModel.push(amd);
    }
    return ConfigModel;
  }
public static void main(String[] args) throws Exception {
   ConfigModelFactory.bulid();
}
}

三.XML(servlet案例)

获取servlet的class值

ServletClassModel

代码:

package com.lya.model;
/**
 * @author 李永安
 *
 */
public class ServletClassModel {
  private String context;
  public String getContext() {
    return context;
  }
  public void setContext(String context) {
    this.context = context;
  }
}

ServletMappingModel

代码:

package com.lya.model;
import java.util.ArrayList;
import java.util.List;
/**
 * @author 李永安
 *
 */
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;
  }
}

WebAppModel

代码:

package com.lya.model;
import java.util.ArrayList;
import java.util.List;
/**
 * @author 李永安
 *
 */
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.lya.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;
/**
 * @author 李永安
 *
 */
public class WebAppModelFactory {
  public static WebAppModel buildWebAppModel() {
    String xmlPath = "/web.xml";
    return buildWebAppModel(xmlPath);
  }
  /**
   * 建模
   * 
   * @param xmlPath
   * @return
   */
  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);
      /*
       * 将servlet的标签内容填充进WebApp
       */
      List<Element> servletEles = doc.selectNodes("/web-app/servlet");
      for (Element servletEle : servletEles) {
        ServletModel servletModel = new ServletModel();
        /*
         * 给ServletModel填充xml的内容
         */
        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);
      }
      /*
       * 将servlet-mapping的标签内容填充进WebApp
       */
      List<Element> servletMappingEles = doc.selectNodes("/web-app/servlet-mapping");
      for (Element servletMappingEle : servletMappingEles) {
        ServletMappingModel servletMappingModel = new ServletMappingModel();
        /*
         * 给ServletMappingModel填充xml的内容
         */
        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;
  }
  /**
   * 通过浏览器输入的网址自动找到对应的后台处理类
   * @param webAppModel 建模后的实体类
   * @param url 浏览器访问的网址
   * @return
   */
  public static String getServletClassByUrl(WebAppModel webAppModel, String url) {
    String servletClass = "";
    /*
     * 找到浏览器网址对应的servlet-name
     */
    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();
        }
      }
    }
    /*
     * 找到servlet-name对应的后台处理类
     */
    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);
  }
}

四。建模要用的方法

23种模式→工厂模式

五。总结

XML建模就是将XML的格式转成对象进行操作。

工厂模式就是用来生产configmodel内容的。。

今天的分享就到这啦~我们下期再见~~~

目录
相关文章
|
XML 设计模式 开发框架
J2EE(xml建模)
J2EE(xml建模)
103 0
|
XML 存储 开发框架
J2EE之XML建模
J2EE之XML建模
82 0
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
XML Java 数据库连接
MyBatis入门——MyBatis XML配置文件(3)
MyBatis入门——MyBatis XML配置文件(3)
601 6
|
XML 前端开发 Java
XML基本概念入门学习指南
XML(eXtensible Markup Language)是一种可扩展的标记语言,和HTML语言语法类似,同属于标记语言。
412 14
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
XML 安全 Java
从零手写实现 apache Tomcat-02-web.xml 入门详细介绍
`web.xml`是Java Web应用的核心配置文件,描述应用工作方式。它包含Servlet、Filter和Listener的定义。例如,示例展示了如何配置名为`my`的Servlet处理`/my`请求,`LoggingFilter`拦截所有请求,以及`MyServletContextAttrListener`监听应用事件。`web.xml`是服务器理解应用结构与行为的指南。迷你版Tomcat实现——mini-cat(开源:https://github.com/houbb/minicat)。
|
XML 存储 Java
XML建模
XML建模
118 1

相关课程

更多