`
ichannel
  • 浏览: 2716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

struts 的digester类解析xml文件

阅读更多
学习struts 的digester类解析xml文件 digester的简介

    digester是struts的一个工具,用来解析struts的配置文件struts-config.xml,将xml的元素转换成java的对象。Digester是通过调用预定义的规则来操作xml元素,将xml的元素转换为java对象。

   Digester底层采用SAX解析xml文件。首先识别出特定xml元素(实际细分为begin,body,end,finish四个步骤)后,执行特定的动作。digester通过匹配模式(matching pattern)识别特定的元素,而相关的操作由rule来执行。

2、degister的创建过程。

xml文档如下:

<web-app>

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
    <servlet-name>ajax</servlet-name>
    <url-pattern>/ajax</url-pattern>
</servlet-mapping>

</web-app>


(1)创建一个digester的实例,一个解析(digester.parse())请求完了以后,digster还可以被后面的解析请求服用。

         Digester digester = new Digester();

   (2)设置一些配置属性(configuration properties),用于设置解析操作。

        digester.setNamespaceAware(true);
        digester.setValidating(false);

   (3)将一个或几个对象塞入Digester对象栈顶,便于解析调用。

        digester.push(this);//this是actionservlet对象。

   (4)注册xml的匹配模板(matching pattern),当一个匹配模板被输入的xml文档中识别出来,其相应的规则就被激活。当识别出该模板后,这些规则依序依次执行。

//    protected String registrations[] = {
        "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN",
        "/org/apache/struts/resources/struts-config_1_0.dtd",
        "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN",
        "/org/apache/struts/resources/struts-config_1_1.dtd",
        "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN",
        "/org/apache/struts/resources/web-app_2_2.dtd",
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
        "/org/apache/struts/resources/web-app_2_3.dtd"
    };

//前面已经设置了registrations的值

        for (int i = 0; i < registrations.length; i += 2) {
            URL url = this.getClass().getResource(registrations[i+1]);
            if (url != null) {
                digester.register(registrations[i], url.toString());
            }
        }

(5)digeter先制定相应的rule规则,这些rule保存在digester对象里面,只有等到解析的时候,才会真正去执行。

        digester.addCallMethod("web-app/servlet-mapping",
                               "addServletMapping", 2);

        //表示xml文档碰到web-app元素下的servlet-mapping,就调用当前栈顶的对象(即actionservlet)的addServletMapping方法,并传递两个参数给该方法。当此处只是声明一个new CallMethodRule(addServletMapping, 2)的对象。

        digester.addCallParam("web-app/servlet-mapping/servlet-name", 0);

      //表示xml文档碰到web-app/servlet-mapping的servlet-name元素,就将servlet-name设的值作为addServletMapping方法的第一个参数。当此处只是声明一个new CallParamRule(0)的对象。

        digester.addCallParam("web-app/servlet-mapping/url-pattern", 1);

      //表示xml文档碰到web-app/servlet-mapping的url-pattern元素,就将url-pattern设的值作为addServletMapping方法的第二个参数

其中解析的时候会去调用begin(Attributes attributes),end(String namespace, String name)等方法,其中attributes中保存的是配置文件的内容,该类里面有个data变量是string[] 数组,存放配置的属性和配置的属性值。[, path, path, CDATA, /logon, , name, name, CDATA, logonForm, , input, input, CDATA, /WEB-INF/jsp/bas/logon.jsp, , scope, scope, (request|session), request, , type, type, CDATA, com.longtop.bas.web.LogonAction, , validate, validate, (true|false|yes|no), false]

   (6)解析xml文件,当必须传给parse()一个参数(文件引用)。

        InputStream input =
            getServletContext().getResourceAsStream("/WEB-INF/web.xml");//xml文档的引用

        try {
            digester.parse(input);//传递xml文档的引用,并且一定要捕捉并处理IOException和SAXException

        } catch (IOException e) {
            log.error(internal.getMessage("configWebXml"), e);
            throw new ServletException(e);
           
        } catch (SAXException e) {
            log.error(internal.getMessage("configWebXml"), e);
            throw new ServletException(e);

   调用parse(input)的时候,digester才真正解析xml文档,规则和相关的操作才被执行(即actionservlet的addServletMapping()才真正被执行)。如上xml文档所示的有两个action-mapping的节点,所以actionservlet类的addServletMapping方法会被调用两次。




    3、对象栈的理解

     当识别出xml元素的开始,就将该元素对应的对象压入栈顶。当识别出该元素的子节点,则又生成一个对象压入栈顶,并将该元素对应的对象作为一个参数,传递给子节点对应的对象。这样就可以建立1:1或1:N的父子关系。当解析器遇到一个xml元素的“开始”,就将该元素对应的对象压入栈顶,当解析完该元素的所有子元素,解析器遇到该元素的“结束”,就弹出该对象,并进行相关的处理。

4、digester的所有操作(规则)

   (1)首先引用一个比较完整的xml文档

<struts-config><!-- 配置数据源 -->
<data-sources >
    <data-source key="mysql" className="org.apache.struts.config.DataSourceConfig2">
      <set-property property="driverClass" value="org.gjt.mm.mysql.Driver" />
      <set-property property="url" value="jdbc:mysql://localhost:3306/manage" />
      <set-property property="user" value="root" />
      <set-property property="password" value="root" />
      <set-property property="minCount" value="5" />
      <set-property property="maxCount" value="10" />     
      <set-property property="description" value="" />     
      <set-property property="readOnly" value="false" />
      <set-property property="autoCommit" value="false" />
      <set-property property="loginTimeout" value="" />
    </data-source>   
</data-sources>

<!-- 配置ActionForm -->
<form-beans >
    <form-bean name="loginForm" type="com.wind.struts.form.LoginForm" />
</form-beans>

<!-- 配置全局异常处理 -->
<global-exceptions>
<exception type="" key=""/>
</global-exceptions>

<!-- 配置全局跳转 -->
<global-forwards>
     <forward name="professor" path="/professor.jsp" />
</global-forwards>


<!-- 配置映射关系 -->
<action-mappings >
    <action
      attribute="loginForm"
      input="/form/login.jsp"
      name="loginForm"
      path="/login"
      scope="request"
   validate="true"
      type="com.wind.struts.action.LoginAction" >
     
      <!-- 配置局部异常处理 -->
      <exception type="" key=""/>
     
      <!-- 配置局部跳转 -->
      <forward name="student" path="/student.jsp" />
      <forward name="teacher" path="/teacher.jsp" />     
     
    </action>
</action-mappings>

<!-- 配置RequestProcessor插件 -->
<controller processorClass="com.wind.MyRequestProcessor"></controller>

<!-- 配置国际化资源文件 -->  
<message-resources parameter="com.wind.struts.ApplicationResources" />

<!-- 配置Plugin插件 -->
<plug-in className="com.wind.MyPlugin">
<!-- 配置validate验证文件 -->
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in></struts-config>

(2)ConfigRuleSet类addRuleInstances()方法设置中对xml解析的操作(规则)

public void addRuleInstances(Digester digester) {

        digester.addObjectCreate
            ("struts-config/data-sources/data-source",
             "org.apache.struts.config.DataSourceConfig",
             "className");

      //表示遇到data-source节点的“开始”,就可以缺省创建一个org.apache.struts.config.DataSourceConfig的实例。如果xml文件设置了className的属性,就生成一个className指定类(org.apache.struts.config.DataSourceConfig2)的实例,而不是org.apache.struts.config.DataSourceConfig的实例。并将该对象压入栈顶。详细的看ObjectCreatRule类。

        digester.addSetProperties
            ("struts-config/data-sources/data-source");

   //遇到struts-config/data-sources/data-source的attributevs的“开始”,根据web-xml的根据属性列表中(attributes)的属性值对 ,<form-bean name="basMapForm" type="com.longtop.bas.web.BasMapForm"/>,则从栈顶取回该对象Object top = digester.peek();,并设置object的name=basMapForm,type="com.longtop.bas.web.BasMapForm"。该节点被解析时,SetPropertiesRule的begin()方法会被调用,并且name="basMapForm" type="com.longtop.bas.web.BasMapForm"会被封装到Attributes attributes的对象里。详细的看SetPropertiesRule类。

/***解析时相当运行的代码***/

HashMap values = new HashMap();

String name = attributes.getLocalName(0);name="name"

String value = attributes.getValue(0);value=="basMapForm"

String name = attributes.getLocalName(0);name="type"

String value = attributes.getValue(0);value=="com.longtop.bas.web.BasMapForm"

values.put(name, value);

Object top = digester.peek();//top是org.apache.struts.action.ActionFormBean的实例。

BeanUtils.populate(top, values);//是指org.apache.struts.action.ActionFormBean的实例的name和type属性值。

/***解析时相当运行的代码***/

        digester.addSetProperty
            ("struts-config/data-sources/data-source/set-property",
             "property", "value");

//遇到struts-config/data-sources/data-source/set-property的“开始”,根据web-xml的根据属性中(property)的属性值对 ,      <set-property property="user" value="root" />
      <set-property property="password" value="root" />,则从栈顶取回该对象Object top = digester.peek();,并设置object的password=root,user=root。详细的看SetPropertyRule类。


        digester.addSetNext
            ("struts-config/form-beans/form-bean",
             "addFormBeanConfig",
             "org.apache.struts.config.FormBeanConfig");

   //表示调用栈顶org.apache.struts.config.DataSourceConfig的父节点(org.apache.struts.config.ModuleConfig)相对应的对象的addDataSourceConfig的方法将该对象(DataSourceConfig,当前的栈顶对象)加入到父节点对象(ModuleConfig)。详细的看SetNextRule类。

<form-bean name="basMapForm" type="com.longtop.bas.web.BasMapForm"/>

        Object child = digester.peek(0);子节点FormBeanConfig
        Object parent = digester.peek(1);父节点org.apache.struts.config.impl.ModuleConfig

        if (paramType != null) {
            paramTypes[0] =
                    digester.getClassLoader().loadClass(paramType);//paramType是实例化rule时,已经设置成“FormBeanConfig”,加载FormBeanConfig的类。
        } else {
            paramTypes[0] = child.getClass();


分享到:
评论

相关推荐

    Digester解析XML的小例子(对象嵌套)

    在Java开发中,Struts框架提供了一个强大的工具——Digester,用于解析XML文件并自动创建、配置Java对象。本文将详细介绍如何使用Digester处理具有嵌套结构的XML文档,并通过一个具体的实例——"DigesterXmlTest"来...

    Digester读取XML学习

    Apache Commons Digester是一个强大的工具,它允许开发者将XML文件解析为Java对象,通过匹配XML元素规则来调用对象的方法或设置属性。本篇文章将深入探讨如何使用Digester进行XML解析,并提供相关的学习资源。 ...

    commons-digester-1.8-src 下载 struts源码 digester

    这个开源库是Java开发人员常用的一个工具,它允许程序通过定义规则来解析XML文档,并根据这些规则进行对象的创建和属性设置。这在构建基于XML配置的系统,如Struts框架时特别有用。 Apache Commons Digester是一个...

    Java_XML解析之Digester的使用

    以下是一个简单的示例,展示了如何使用Digester解析XML: ```java package mypackage; public class Foo { // ... (Foo类的属性和方法) } public class Bar { // ... (Bar类的属性和方法) } // XML文档片段: ...

    Digester

    7. **性能与灵活性**:尽管Digester提供了一种灵活的方式来解析XML,但它并不总是最高效的解决方案。对于大型、复杂的XML文档,可能需要更强大的库如JAXB或DOM。然而,对于小型或中型的配置文件,Digester的简单性和...

    关于XML文档的解析方法

    Digester最初设计用于处理Struts的配置文件,但其通用性使其成为处理各种XML文档的有效工具。 在使用Digester时,开发者可以定义一系列规则,这些规则描述了XML元素如何映射到Java对象的方法调用。例如,一个XML...

    浅析Digester

    2. **解析XML**:然后,Digester会读取XML文档,每当遇到与已配置规则匹配的元素时,就会执行相应的动作,如创建对象、设置属性等。 3. **堆栈管理**:在解析过程中,Digester维护了一个对象堆栈。当遇到嵌套元素时...

    digester-rules

    2. **XML解析**: Digester基于DOM(Document Object Model)模型来解析XML文件。DOM允许开发者以树形结构访问和修改XML内容。 3. **Rule API**: Digester的核心在于其规则API,如`Rule`、`RuleSet`等。开发者可以...

    java_xml_api.rar_xml文档分析

    SAX是一种事件驱动的解析器,适用于处理大型XML文件,它不会一次性加载整个文件,而是按需读取;StAX则是基于流的API,允许程序按需读取或写入XML,提供了更高的性能和灵活性。 在实际开发中,为了方便和高效地操作...

    struts1jar包

    在Struts1框架中,Digester用于解析struts-config.xml配置文件,将XML结构转换为相应的Java对象,初始化并配置Action、Form Beans等组件。 除了这些核心库,Struts1还需要其他JAR文件,如`struts-core.jar`(包含...

    digester学习笔记

    4. **解析XML**:最后,使用`digester.parse()`方法解析XML文档,完成后,栈顶的对象通常是解析结果的根节点。 在提供的示例中,有两个JavaBean,Foo和Bar。Foo有一个名为addBar的方法,用于添加Bar对象,而Bar包含...

    commons-digester-2.0.jar.zip

    Apache Commons Digester是一个强大的Java库,主要功能是解析XML文档,并根据预定义的规则将其转换为Java对象。在标题"commons-digester-2.0.jar.zip"中,我们看到的是这个库的一个特定版本——2.0,它被压缩成一个...

    struts框架需要的所有jar包汇总

    在Struts中,Digester用于解析struts-config.xml文件,创建和初始化对象,设置属性值,实现配置文件到程序对象的映射。 5. **commons-validator.jar**:Apache Commons Validator是用于验证用户输入数据的库,提供...

    struts1的jar包 lib文件

    6. **commons-digester.jar**:用于解析XML配置文件,生成Java对象,常用于解析Struts的配置文件。 7. **commons-fileupload.jar**:处理HTTP请求中的文件上传功能。 8. **commons-collections.jar**:包含一些...

    commons-digester.jar下载

    1. **配置文件解析**: Commons-Digester常用于解析XML配置文件,如Spring框架中的bean配置或Struts框架的配置。 2. **XML数据绑定**: 将XML数据映射到Java对象,简化数据处理。 3. **Web应用程序**: 在构建MVC...

    搭建struts1.x的jar包

    `commons-digester.jar`是Apache Commons Digester库,用于解析XML配置文件并创建对象结构。在Struts中,它主要用于读取Struts配置文件(struts-config.xml),生成和初始化应用程序中的对象。 `commons-validator....

    开发自己一套struts框架

    此项目是为了更深入的理解MVC模式以及Struts的工作流程而开发的,运用了第三方commons组件, commons-digester来解析xml文件,把配置信息全部封装成类,然后运用MVC的思想去做相应的操作.

    struts用法总结

    - commons-digester.jar:解析XML文件。 - commons-fileupload.jar:支持文件上传功能。 - commons-logging.jar:日志输出,如Log4j。 - commons-validator.jar:进行表单数据验证。 - servlet.jar:Servlet ...

    struts1.2.9的jar包

    - **commons-digester.jar**:用于解析XML配置文件的库。 - **commons-fileupload.jar**:处理文件上传功能的库。 - **jsp-api.jar/servlet-api.jar**:Java Servlet和JSP API的类库,是开发Web应用的基础。 使用...

Global site tag (gtag.js) - Google Analytics