Struts源码学习之ActionServlet (二)

本文详细介绍了Struts框架启动过程中的关键步骤,包括从web.xml加载ActionServlet的初始化参数、处理DTD文件、解析web.xml配置文件等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

③ 调用 initServlet(); web.xml 中加载ActionServlet 的初始化参数如servlet-name ,加载DTD 文件并把其放入HashMap 缓存,读取并解析web.xml 的内容

// Remember our servlet name

getServletConfig().getServletName ();

<servlet>

        <servlet-name >action</servlet-name>

        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

        <init-param>

            <param-name>config</param-name>   <!-- 得到"config" 参数-->

            <param-value>/WEB-INF/struts-config.xml</param-value>

        </init-param>

        <init-param>

            <param-name>convertNull</param-name>    <!-- 得到"convertNull" 参数-->

            <param-value>true</param-value>

        </init-param>

        .......

    </servlet>

 

// Prepare a Digester to scan the web application deployment descriptor

Digester digester = new Digester();

// 把当前的 ActionServlet 对象放入到解析堆栈中

digester.push(this);

// 指明要考虑命名空间

digester.setNamespaceAware(true);

// 缺省值[false] ,解析器只是检查XML 是否格式良好(well formed)

digester.setValidating(false);

 

// Register our local copy of the DTDs that we can find

// struts 可使用 struts-core-1.3.5.jar 包 中的DTD 中来处理struts 配置文件,这样可适用于那些没有连接到internet 的应用环境

        for (int i = 0; i < registrations.length; i += 2) {

            URL url = this.getClass().getResource(registrations[i + 1]);

 

            if (url != null) {

                // 读取DTD 文件并把其放入 HashMap 缓存

                digester.register(registrations[i], url.toString());

            }

        }

 

/************************************************************

// 一些文档类型定义,用来验证相应的配置文件如struts-config.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 ",

            "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN",

            "/org/apache/struts/resources/struts-config_1_2.dtd ",

            "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN",

            "/org/apache/struts/resources/struts-config_1_3.dtd ",

            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",

            "/org/apache/struts/resources/web-app_2_3.dtd "

        }; // initServlet();

************************************************************/

 

// Configure the processing rules that we need

// 运行时,digester 就会调用 ActionServlet 中的 addServletMapping () 方法,并传入两个参数

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

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

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

得到

<servlet-mapping>

    <servlet-name >action</servlet-name>

    <url-pattern >*.do</url-pattern>

</servlet-mapping>

 

/************************************************************

// 来判断当前 servlet 名称是否为正在运行的 servlet 名称,如是,就把 url-pattern 作为 servletMapping

public void addServletMapping (String servletName, String urlPattern) {

        if (servletName == null) {

            return;

        }

        if (servletName.equals(this.servletName)) {

            if (log.isDebugEnabled()) {

                log.debug("Process servletName=" + servletName

                    + ", urlPattern=" + urlPattern);

            }

            this.servletMapping = urlPattern;

        }

}

************************************************************/

 

// 读取配置文件web.xml 的内容

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/web.xml");

// 如找不到/WEB-INF/web.xml 文件,则报错

if (input == null) {

    log.error(internal.getMessage("configWebXml"));

    throw new ServletException(internal.getMessage("configWebXml"));

}

/************************************************************

// 报错信息定义在org\apache\struts\action\ActionResources.properties

configWebXml=The /WEB-INF/web.xml was not found.

************************************************************/

 

// 解析input 流文件,每读到一个节点元素就触发一个事件

digester.parse(input);

 

注: Digester 是一个基于 DOMSAX 实现的类,它是事件触发的,可以将XML 文件转换为任意的Java 对象,支持规则的对任意XML 文档的处理。原先是struts 项目的一部分,后因其通用性而划归Commons 子项目。

 

// servletMapping 存储到servletContext 中,属性名为Globals.SERVLET_KEY " org.apache.struts.action.SERVLET_MAPPING "

if (servletMapping != null) {

    getServletContext().setAttribute(Globals.SERVLET_KEY,servletMapping);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值