使用SAX解析XML封装实体Bean

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:
 
新的项目需要对用户权限进行控制,经过和项目经理商量我们决定使用XML文件存储权限代码和层次关系,这样比较方便也便于维护,使用SAX读取XML文件,我发现在读取的时候可以顺便将XML文件中的内容封装为实体Bean,便于页面使用JSTL进行迭代。
  一、XML结构
我的XML结构为这样的
< root >
  < basemenu   id = ""  name = "基础信息"  url = "#" >
    < menu  id = ""  name = "仓储位设置"  url = "#" >
      < submenu  id = ""  name = "仓库设置"  url = "" >
        < button  id = ""  name = "查询"  url = "#" ></ button >
      </ submenu >
    </ menu >
  </ basemenu >
</ root >
二、实体Bean
针对这种结构我定义了几个实体Bean
看名字就能知道对应的XML标记的名字,由于所有的标记都有三个属性,我就将他们抽象出来定义了一个超类,
public   class  WMSBean {
  public  String  id ;
  public  String  name ;
  public  String  url ;
//省略set,get方法
下面依次是各个实体类的代码
public   class  RootBean {
  public  List<BaseMenuBean>  baseMenuBean ;
public   class  BaseMenuBean  extends  WMSBean {
  public  List<MenuBean>  menuBean ;
public   class  MenuBean  extends  WMSBean {
  public  List<Submenu>  submenu ;
public   class  Submenu  extends  WMSBean {
  public  List<Button>  button ;
public   class  Button  extends  WMSBean {
}
实体类内部成员变量使用了List类型,这样的话可以存放多个相同的标记(Button在最底层没有成员变量)
三、解析XML并封装
开始看我解析XML的代码了
public   class  ParseXml  extends  DefaultHandler {
  public  RootBean  rootBean ; //成员变量
  public  ParseXml() {
    super ();
    this . rootBean  =  new  RootBean(); //初始化
  }
  public   void  startElement(String namespaceURI, String localName, //此方法读取XML元素
      String name, Attributes atts) {
    WMSBean bean =  this .doInstanceBean(name); //调用 doInstanceBean 方法
    for  ( int  i = 0; i < atts.getLength(); i++) { //对实体Bean进行初始化
      if  ( "id" . equals (atts.getLocalName(i))) {
        bean.setId(atts.getValue(i));
      }
      if  ( "name" . equals (atts.getLocalName(i))) {
        bean.setName(atts.getValue(i));
      }
      if  ( "url" . equals (atts.getLocalName(i))) {
        bean.setUrl(atts.getValue(i));
      }
    }
    this .doSetBean(bean); //将实体Bean进行封装
  }
//根据名称初始化一个实体对象,并返回,这个方法充分的利用了java的多态特性
  private  WMSBean doInstanceBean(String name) {    
if  ( "basemenu" . equals (name)) {
      return   new  BaseMenuBean();
    else   if  ( "menu" . equals (name)) {
      return   new  MenuBean();
    else   if  ( "submenu" . equals (name)) {
      return   new  Submenu();
    else   if  ( "button" . equals (name)) {
      return   new  Button();
    else  {
    }
    return   null ;
  }
  private   void  doSetBean(WMSBean bean) {
    if  (bean  instanceof  BaseMenuBean) { //判断其类型
      this . rootBean .setBaseMenuBean((BaseMenuBean) bean);
    }
  else   if  (bean  instanceof  MenuBean) {
      List<BaseMenuBean> baseMenuBeanList =  this . rootBean   .getBaseMenuBean();
      baseMenuBeanList.get(baseMenuBeanList.size() - 1).setMenuBea(   (MenuBean) bean);
//获得List中最后一个对想,并add
   
else   if  (bean  instanceof  Submenu) {
      List<BaseMenuBean> baseMenuBeanList =  this . rootBean   .getBaseMenuBean();
      BaseMenuBean baseMenuBean = baseMenuBeanList.get(baseMenuBeanList
          .size() - 1);
      List<MenuBean> menuBeanList = baseMenuBean.getMenuBean();
      menuBeanList.get(menuBeanList.size() - 1) .setSubmenu((Submenu) bean);
   
else   if  (bean  instanceof  Button) { //依次重复相同操作
      List<BaseMenuBean> baseMenuBeanList =  this . rootBean   .getBaseMenuBean();
      BaseMenuBean baseMenuBean = baseMenuBeanList.get(baseMenuBeanList
          .size() - 1);
      List<MenuBean> menuBeanList = baseMenuBean.getMenuBean();
      MenuBean menuBean = menuBeanList.get(menuBeanList.size() - 1);
      List<Submenu> submenuList = menuBean.getSubmenu();
      submenuList.get(submenuList.size() - 1).setButton((Button) bean);
    else  {   }
  }
  public  RootBean getRootBean() {
    return   rootBean ;
  }
  public   void  setRootBean(RootBean rootBean) {
    this . rootBean  = rootBean;
  }
}
四、 调用、运行
public  ModelAndView menu(HttpServletRequest request, HttpServletResponse response)  throws  Exception {
    SAXParserFactory sf = SAXParserFactory. newInstance ();
    SAXParser  sp = sf.newSAXParser(); //初始化对象
    ParseXml parseXml =  new  ParseXml(); //初始化对象
    sp.parse( new  InputSource( this .getServletContext().getRealPath(
        "/WEB-INF/quanxian.xml" )), parseXml);
//通过Servlet容器获得xml文件,将我们的 parseXml 作为参数传递进去
    RootBean bean = parseXml.getRootBean(); // 获得 parseXml 内部的成员变量 RootBean
    return   new  ModelAndView().addObject( "RootBean" , bean);
//添加进request对象中并返回到页面以供迭代
  }
五、 迭代
为了代码的简练我省去了一部分html代码,只保留了迭代RootBean部分的代码,使用JSTL进行迭代,即简单又不出错。
< c:forEach  items = " ${RootBean.baseMenuBean} "   var = "base" >
  < li   id = " ${base.id} " >< href = " ${base.url} " > ${base.name} </ a >
    < ul >
    < c:forEach  items = " ${base.menuBean} "   var = "menu" >  
    < li  id = " ${menu.id} " >< href = " ${menu.url} " > ${menu.name} </ a >
        < ul >
        < c:forEach  items = " ${menu.submenu} "   var = "sub" >
        < li  id = " ${sub.id} " >< href = " ${sub.url} " > ${sub.name} </ a >
          < ul >
          < c:forEach  items = " ${sub.button} "   var = "button" >
            < li  id = " ${button.id} " >< href = " ${button.url} " > ${button.name} </ a ></ li >
          </ c:forEach >
          </ ul >        
        </ li >
        </ c:forEach >
        </ ul >
    </ li >    
    </ c:forEach >
    </ ul >
  </ li >
</ c:forEach >
总结,不是所有的应用都要按照某某方式去做,我没有使用Digester但是我封装的实体也比较灵活,至少很符合我的使用,这已经足够了。









本文转自 tony_action 51CTO博客,原文链接:http://blog.51cto.com/tonyaction/46873,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
74 6
|
4月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
4月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
4月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
107 0
|
4月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
4月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
自然语言处理 数据处理 索引
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
53 0
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多