`

Struts源码学习之ActionServlet (二)

阅读更多

③ 调用 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 是一个基于 DOM SAX 实现的类,它是事件触发的,可以将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);

}

分享到:
评论

相关推荐

    Struts 源码学习之ActionServlet

    可以对struts进行深入的学习.个人觉得是个很不错的文档,因积分的问题不得不出卖自己的珍藏之物

    struts1深入学习

    struts1学习资料:里面包含struts源码工程 ActionServlet DispatchAction Action LookUpDispatchAction的用法 还包含html logic bean tiles标签的详细使用方法和validate验证框架的具体案例

    Struts原理、开发及项目实施

    如下图2所示: &lt;br/&gt; 控制:通过图2大家可以看到有一个XML文件Struts-config.xml,与之相关联的是Controller,在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一...

    外文翻译 stus MVC

    The file struts-config.xml instructs ActionServlet on how to use the extended classes. There are several advantages to this approach: • The entire logical flow of the application is in a ...

    网上书店、网上银行、虚拟基金交易平台(三个项目源码)

    网上书店(使用技术为JSP+Servlet+IBatis,完成前台功能) 网上银行(使用技术为Struts+Hibernate。 JSP页面采用Tiles框架布局,表单验证没有采用Validator框架验证。 JDK:1.4以上 数据库:SQL Server2000 开发工具...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    第13章 简化企业开发瑰宝之二 第14章 程序员的伴侣 第2篇 范例演练篇 第15章 学以致用 第16章 幕后英雄的用武之地 第17章 Web开发的制胜法宝 第18章 数据分析大师 第19章 体验完美视觉盛宴 第3篇 项目实战篇 第20...

    【计算机软件毕业设计】二手车交易平台的分析、设计与实现文献综述1.doc

    行动和ActionServlet的控制器实现 ,视图层的JSP文件组成。中央控制器控制,接收到一个请求,这个请求重定向到相应的 模块控制器执行动作。随后,该模块控制器处理请求并返回结果到中央控制器使用一个 JavaBean对象...

    名为责任链或者拦截器或者过滤器的简单模拟

    以及最早学习到的java web中的javax.servlet.Filter的概念, 都是一种链式的处理流程,这一个环节处理完成,然后处理另一个环节,这样就可以在一个处理本身的之前和之后做一些事情了。 比如说,struts2中Action在...

    SSH架构北京实训项目源码+课件【精品】

    非常适合java学习的一个项目,我们的刘春阳老师创造性的把所有的java相关的技术都结合在这一个Training项目中,深入浅出的传授给我们的知识,倾心大奉献了:里面包含了jsp,servlet,struts,spring,hibernate,Ext,js,css,...

    JAVA核心技术

    JSP(TagLib)——&gt;ActionForm——&gt;Action ——&gt; Event——&gt;EJBAction——&gt;EJB ——&gt;DAO——&gt;Database JSP(TagLib) (forward) &lt;——Action &lt;——EventResponse&lt;—— ??Turbine:??主要应用方面:WEB层。??主要应用...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    该案例既提供了ide无关的、基于ant管理的项目源码,也提供了基于netbeans ide的项目源码,最大限度地满足读者的需求。 作者简介: 李刚,从事10年的Java EE应用开发。曾任LITEON公司的J2EE技术主管,负责该公司的...

Global site tag (gtag.js) - Google Analytics