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

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 发表评论
分享到:
评论

相关推荐

    struts2-core-2.0.11源码

    8. **请求处理(Request Handling)**:`org.apache.struts2.dispatcher.ng.filter`包中的`StrutsPrepareAndExecuteFilter`是Struts2与Servlet容器交互的关键,它负责准备请求并执行Action。 9. **类型转换(Type ...

    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 ...

    Struts 源码学习之ActionServlet

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

    struts-2.3.30-all所有jar包

    tiles-request-servlet-wildcard-1.0.1.jar, tiles-request-velocity-1.0.1.jar, tiles-servlet-2.2.2.jar, tiles-template-2.2.2.jar, tiles-velocity-3.0.1.jar, velocity-1.6.4.jar, velocity-tools-1.3.jar, ...

    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源码+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框架的核心控制器,它...

    struts源码struts源码struts源码

    当用户发送请求时,ActionServlet会根据配置文件(struts-config.xml)解析并路由到相应的Action。 2. **ActionMapping**:这个类负责将请求映射到特定的Action。在struts-config.xml中定义,每个ActionMapping包含...

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

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

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

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

    struts1.2源码研究

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

    struts-1.2.9-all-src

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

    Struts图书馆管理系统-ASP源码-办公管理

    通过以上分析,我们可以看出这个"Struts图书馆管理系统-ASP源码-办公管理"项目是一个综合性的学习资源,涵盖了Struts框架的核心概念、MVC设计模式的应用以及图书馆管理和办公自动化的一些常见功能。对于想要提升Java...

Global site tag (gtag.js) - Google Analytics