`
zhyiwww
  • 浏览: 90078 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Struts源码的切片学习(三)-- ActionServlet的初始化细节

阅读更多

<o:p> </o:p>

Struts 源码的切片学习(三)

—— ActionServlet 的初始化细节

<o:p>
</o:p>

<o:p> </o:p>

Author      :      zhyiwww<o:p>

E-Mail       :      zhyiwww@163.com<o:p>

Date           :      2007-1-10<o:p>

转载请注明出处 www.BlogJava.net/zhyiwww<o:p>

(copyright by @ zhangyi)<o:p>

<o:p> </o:p>

<o:p> </o:p>

ActionServlet 初始化的过程中,有一个函数 initServlet() 用来初始化此 ActionServlet, 主要是初始化其 url, 也就是到底此 ActionServlet 接收和处理那些 url <o:p> </o:p>

<o:p> </o:p>

我们先看一下代码:

protected void initServlet() throws ServletException {<o:p>

<o:p> </o:p>

        // Remember our servlet name<o:p>

        this.servletName = getServletConfig().getServletName();<o:p>

<o:p> </o:p>

        // Prepare a Digester to scan the web application deployment descriptor<o:p>

        Digester digester = new Digester();<o:p>

         digester.push(this);<o:p>

        digester.setNamespaceAware(true);<o:p>

        digester.setValidating(false);<o:p>

<o:p> </o:p>

        // Register our local copy of the DTDs that we can find<o:p>

        for (int i = 0; i < registrations.length; i += 2) {<o:p>

            URL url = this.getClass().getResource(registrations[i+1]);<o:p>

            if (url != null) {<o:p>

                digester.register(registrations[i], url.toString());<o:p>

            }<o:p>

        }<o:p>

           /********************************************<o:p>

                 上面的紫色的代码是把当前的 ActionServlet 实例放入到解析堆栈中。这一步很重要。 <o:p> </o:p>

                 正是 actionServlet 放入了堆栈,下面的调用所取得配置参数才正是 actionSerlvet 的配置参数,而不是其他的 servlet 的配置参数。 <o:p> </o:p>

           这个地方是一个难点。 <o:p> </o:p>

            ********************************************/<o:p>

                     <o:p> </o:p>

<o:p> </o:p>

        // Configure the processing rules that we need<o:p>

        digester.addCallMethod("web-app/servlet-mapping",<o:p>

                               "addServletMapping", 2);<o:p>

        digester.addCallParam("web-app/servlet-mapping/servlet-name", 0);<o:p>

        digester.addCallParam("web-app/servlet-mapping/url-pattern", 1);<o:p>

                     <o:p> </o:p>

              /************************************************************<o:p>

                     上面的代码执行的时候, digester 就会调用 actionServlet 中的 addServletMapping() 方法,并传进去两个参数。 <o:p> </o:p>

                     在这个方法里面,就初始化了 servlet url, ,也就是那种后缀的 ur 要由 actionServlet 来接收和处理。 <o:p> </o:p>

                     例如: *.do 还是 /action/*.do 等。 <o:p> </o:p>

              这个 servlet url 保存在 actionServlet servletMapping 参数里面。           <o:p> </o:p>

              ************************************************************/<o:p>

<o:p> </o:p>

        // Process the web application deployment descriptor<o:p>

        if (log.isDebugEnabled()) {<o:p>

            log.debug("Scanning web.xml for controller servlet mapping");<o:p>

        }<o:p>

<o:p> </o:p>

        InputStream input =<o:p>

            getServletContext().getResourceAsStream("/WEB-INF/web.xml");<o:p>

<o:p> </o:p>

        if (input == null) {<o:p>

            log.error(internal.getMessage("configWebXml"));<o:p>

            throw new ServletException(internal.getMessage("configWebXml"));<o:p>

        }<o:p>

<o:p> </o:p>

        try {<o:p>

            digester.parse(input);<o:p>

<o:p> </o:p>

        } catch (IOException e) {<o:p>

            log.error(internal.getMessage("configWebXml"), e);<o:p>

            throw new ServletException(e);<o:p>

<o:p> </o:p>

        } catch (SAXException e) {<o:p>

            log.error(internal.getMessage("configWebXml"), e);<o:p>

            throw new ServletException(e);<o:p>

<o:p> </o:p>

        } finally {<o:p>

            try {<o:p>

                input.close();<o:p>

            } catch (IOException e) {<o:p>

                log.error(internal.getMessage("configWebXml"), e);<o:p>

                throw new ServletException(e);<o:p>

            }<o:p>

        }<o:p>

<o:p> </o:p>

        // Record a servlet context attribute (if appropriate)<o:p>

        if (log.isDebugEnabled()) {<o:p>

            log.debug("Mapping for servlet '" + servletName + "' = '" +<o:p>

                servletMapping + "'");<o:p>

        }<o:p>

<o:p> </o:p>

        if (servletMapping != null) {<o:p>

            getServletContext().setAttribute(Globals.SERVLET_KEY, servletMapping);<o:p>

        }<o:p>

<o:p> </o:p>

}<o:p>

<o:p> </o:p>

上面的过程就是 initServlet 的初始化过程,其中的难点就是对 digester.push() 的理解。

    附:

    public void addServletMapping(String servletName, String urlPattern) {

        if (log.isDebugEnabled()) {
            log.debug("Process servletName=" + servletName +
                      ", urlPattern=" + urlPattern);
        }
        if (servletName == null) {
            return;
        }
        if (servletName.equals(this.servletName)) {
            this.servletMapping = urlPattern;
        }

    }



<o:p>



zhyiwww 2007-01-29 17:18 发表评论
分享到:
评论

相关推荐

    Struts 源码学习之ActionServlet

    ### Struts 源码学习之ActionServlet #### 一、引言 在Java Web开发领域,Struts框架因其简洁的MVC(Model-View-Controller)架构模式而备受开发者青睐。本文旨在深入剖析Struts框架的核心组件之一——`Action...

    servlet源码 servlet-api-src javax.servlet.Servlet源码

    总的来说,理解和研究`servlet-api-src`中的`javax.servlet.Servlet`源码对于任何Java Web开发者来说都是一个重要的学习步骤。它不仅可以帮助我们深入理解Servlet的工作原理,还可以提升我们在实际项目中的开发效率...

    基于java的开发源码-一个支持servlet的web服务器.zip

    基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip ...

    jakarta-servletapi-4-src.zip servlet源码

    在Servlet的生命周期中,`init()`方法在Servlet实例化后首次被调用,用于初始化Servlet;`service()`方法处理客户端请求;而`destroy()`方法在Servlet销毁前执行,用于释放资源。源码中,我们可以看到这些方法的具体...

    struts-1.2.9-all-bin

    - **web.xml**:部署描述符,配置ActionServlet以及Struts的初始化参数。 4. **开发流程** - 创建ActionForm:定义表单字段,用于接收和验证用户输入。 - 编写Action:实现业务逻辑,调用Service层方法,处理...

    struts-2.3.15.3源码

    关于删除的lib库,Struts 2依赖于一系列的第三方库,包括Apache Commons、XWork、Freemarker、Java Servlet API等。这些库提供了诸如依赖注入、AOP(面向切面编程)、I18N(国际化)、数据校验等功能。在开发环境中...

    Servlet初始化参数演示例子[源代码]

    Servlet初始化参数是在Servlet容器启动时设置的,这些参数可以在整个应用生命周期中被Servlet访问,通常用来配置Servlet的行为或应用的配置信息。本示例提供了对Servlet初始化参数的演示,帮助开发者了解如何在实际...

    struts-2.3.1.2-lib精简必须包

    - `servlet-api.jar` 或 `javax.servlet-api-*.jar`: 提供Servlet API,是所有基于Java的Web应用程序的必备,用于处理HTTP请求和响应。 3. **插件和扩展**: - `struts2-convention-plugin-2.3.1.2.jar`: 自动化...

    struts2.5.13和struts2.3.34的源码包

    5. **Dispatcher Servlet**: Struts2的前端控制器,负责接收请求、调度拦截器链和Action,并返回响应。 源码包中,开发者可以详细查看这些组件的实现细节,包括类的结构、接口的设计、方法的调用等,从而加深对...

    struts1 文件上传源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    通过分析这个源码包,开发者可以学习如何配置Struts 1框架以支持文件上传,了解ActionForm的使用,以及如何处理上传后的文件。此外,还能理解Apache Commons FileUpload库的工作原理,这对任何想要深入理解Struts 1...

    基于struts的图书管理系统 -源码.zip

    在“基于Struts的图书管理系统 - 源码.zip”这个压缩包中,我们可以学习到如何使用Struts框架来实现一个图书管理系统的具体实践。 1. **MVC设计模式**: MVC模式是软件工程中的一种设计模式,它将应用程序分为三个...

    struts源码+struts-lib

    学习和理解Struts的源码可以帮助开发者深入掌握MVC架构的原理,以及如何有效地组织和管理Web应用的各个层面。此外,对于想要从事Java Web开发的人来说,熟悉Struts这样的经典框架,有助于理解后来的Spring MVC、...

    struts-1.2.9源码

    通过对Struts 1.2.9源码的深入学习,开发者可以了解Web应用的典型开发流程,掌握如何有效地组织和管理复杂的业务逻辑,以及如何优雅地处理用户交互。虽然Struts 1已逐渐被Struts 2和Spring MVC等更新框架替代,但它...

    struts源代码struts-legacy-1.0-src.zip

    Struts 1.0是Struts框架的早期版本,它的核心组件包括ActionServlet、ActionForm、Action和Tiles等。下面将详细介绍这些关键组件以及它们在框架中的作用。 1. **ActionServlet**:这是Struts框架的核心控制器,它...

    《Java Web开发技术大全--JSP+Servlet+Struts 2+Hibernate+Spring+AJAX》.(李宁).[PDF].&ckook;

    《Java Web开发技术大全--JSP+Servlet+Struts 2+Hibernate+Spring+AJAX》.(李宁),适合java web开发者,学生,老师,或者已经工作的。内容详细全面,高清

    struts1.2源码研究

    ActionServlet的初始化过程是整个框架工作的基础,它负责加载配置、初始化模块并处理请求。通过深入理解Struts 1.2的源码,开发者可以更好地利用这个框架,解决实际项目中的问题,同时为自定义扩展和优化提供可能。

    struts源码学习.pdf

    - `ModuleConfigImpl`的初始化是在`ActionServlet`的`initModuleConfig`方法中完成的,通过`ModuleConfigFactory`工厂模式创建。 - 在初始化过程中,会调用`parseModuleConfigFile`方法来解析`struts-config.xml`...

    探讨Struts的初始化方法

    `ActionServlet`在初始化过程中主要负责配置和管理整个Struts应用的环境,包括但不限于配置文件的加载、拦截器的注册以及控制器的设置等。 #### 三、Struts的初始化流程 **1. 初始化方法init()** - `Action...

    struts-1.2.9-all-src

    2. **Action**:Action是处理业务逻辑的类,它实现了Struts中的Action接口,接收并处理由ActionServlet转发的请求。 3. **ActionForm**:用于封装用户界面提交的数据,它通常对应一个表单,负责数据验证。 4. **...

    struts2课件----传智博客张孝祥老师最新讲解PPT

    FilterDispatcher在初始化时会读取类路径下的struts.xml配置文件,完成框架的初始化。一旦读取,配置信息会被封装成JavaBean并存储在内存中,这样对每个用户的请求,Struts2都能快速响应,而不需要每次都读取XML文件...

Global site tag (gtag.js) - Google Analytics