`
文鸯
  • 浏览: 305682 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts源码学习 — ActionServlet的初始化

阅读更多

Struts版本:1.2.9

ActionServlet的初始化由org.apache.struts.action.ActionServlet类的init()方法实现,代码如下:

  1. /**  
  2.  * Initialize this servlet.  Most of the processing has been factored into  
  3.  * support methods so that you can override particular functionality at a  
  4.  * fairly granular level. 
  5.  *  
  6.  * @exception ServletException if we cannot configure ourselves correctly  
  7.  */  
  8. public void init() throws ServletException {   
  9.   
  10.     // Wraps the entire initialization in a try/catch to better handle   
  11.     // unexpected exceptions and errors to provide better feedback   
  12.     // to the developer   
  13.     try {   
  14.         initInternal();   
  15.         initOther();   
  16.         initServlet();   
  17.   
  18.         getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);   
  19.         initModuleConfigFactory();   
  20.         // Initialize modules as needed   
  21.         ModuleConfig moduleConfig = initModuleConfig("", config);   
  22.         initModuleMessageResources(moduleConfig);   
  23.         initModuleDataSources(moduleConfig);   
  24.         initModulePlugIns(moduleConfig);   
  25.         moduleConfig.freeze();   
  26.   
  27.         Enumeration names = getServletConfig().getInitParameterNames();   
  28.         while (names.hasMoreElements()) {   
  29.             String name = (String) names.nextElement();   
  30.             if (!name.startsWith("config/")) {   
  31.                 continue;   
  32.             }   
  33.             String prefix = name.substring(6);   
  34.             moduleConfig = initModuleConfig   
  35.                 (prefix, getServletConfig().getInitParameter(name));   
  36.             initModuleMessageResources(moduleConfig);   
  37.             initModuleDataSources(moduleConfig);   
  38.             initModulePlugIns(moduleConfig);   
  39.             moduleConfig.freeze();   
  40.         }   
  41.   
  42.         this.initModulePrefixes(this.getServletContext());   
  43.   
  44.         this.destroyConfigDigester();   
  45.     } catch (UnavailableException ex) {   
  46.         throw ex;   
  47.     } catch (Throwable t) {   
  48.   
  49.         // The follow error message is not retrieved from internal message   
  50.         // resources as they may not have been able to have been    
  51.         // initialized   
  52.         log.error("Unable to initialize Struts ActionServlet due to an "  
  53.             + "unexpected exception or error thrown, so marking the "  
  54.             + "servlet as unavailable.  Most likely, this is due to an "  
  55.             + "incorrect or missing library dependency.", t);   
  56.         throw new UnavailableException(t.getMessage());   
  57.     }       
  58. }  

看起来代码行数不多,大部分都是对另外方法的调用,其中有些方法挖开比较简单,而有些很繁琐,为了避免这篇文章过长,对于比较繁琐的方法调用我会另开文章来说。

 

  1. initInternal();  

该方法初始化Struts的内部资源文件,该文件路径由ActionServlet的internalName字段指定,默认值是org.apache.struts.action.ActionResources,即Struts的JAR包里的org/apache/struts.action.ActionResources.properties及其国际化版本文件。该文件给出了一些应用运行时,由Struts产生的信息,包括一些异常报错信息,从这里可以看出,我们完全可以让Struts自身抛出的异常信息中文化。

 

  1. initOther();  

该方法做了3件事:

如果web.xml里ActionServlet的配置中给出了config初始化参数,将该参数的值赋给ActionServlet的config字段;

如果web.xml里ActionServlet的配置中给出了convertNull初始化参数,如果该参数值是true、yes、on、y、1中的一个,将ActionServlet的convertNull字段设为true;

如果ActionServlet的convertNull字段值为true,则覆盖Apache Commons BeanUtils中几个基本数据类型包装类的转换器的默认实现,使当转换数据类型失败时,返回null,默认的实现是抛出异常。关于Struts使用的数据类型转换器

 

  1. initServlet();  

这个方法挖开后行数不算少,但其主要作用总结就一句话:将web.xml里ActionServlet配置中的url-pattern的值赋给ActionServlet类的servletMapping字段。实现方式是用Apache Commons Digester解析web.xml,用Digester内置的CallMethodRule和CallParamRule使web.xml被解析时,自动调用ActionServlet类的addServletMapping(String servletName, String urlPattern)方法。

 

  1. getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);  

将ActionServlet实例设置为ServletContext的一个属性。

 

  1. initModuleConfigFactory();  

如果web.xml里ActionServlet配置中给出了configFactory初始化参数,将其值指定的类做为Struts的ModuleConfigFactory,该值应该是一个完全限定类名,Struts默认ModuleConfigFactory的实现是org.apache.struts.config.impl.DefaultModuleConfigFactory。

 

  1. // Initialize modules as needed   
  2. ModuleConfig moduleConfig = initModuleConfig("", config);   
  3. initModuleMessageResources(moduleConfig);   
  4. initModuleDataSources(moduleConfig);   
  5. initModulePlugIns(moduleConfig);   
  6. moduleConfig.freeze();   
  7.   
  8. Enumeration names = getServletConfig().getInitParameterNames();   
  9. while (names.hasMoreElements()) {   
  10.     String name = (String) names.nextElement();   
  11.     if (!name.startsWith("config/")) {   
  12.         continue;   
  13.     }   
  14.     String prefix = name.substring(6);   
  15.     moduleConfig = initModuleConfig   
  16.         (prefix, getServletConfig().getInitParameter(name));   
  17.     initModuleMessageResources(moduleConfig);   
  18.     initModuleDataSources(moduleConfig);   
  19.     initModulePlugIns(moduleConfig);   
  20.     moduleConfig.freeze();   
  21. }  

把这段代码放到一起说,是因为它们做的是同一件事,只是操作的对象不同。

从代码上很容易看出,while循环外和内的代码做的是同一件事,简单说就是将web.xml里给出的Struts配置文件初始化为ModuleConfig对象,将Struts配置文件里给出的MessageResource、DataSource、PlugIn也都初始化为对象,然后将这些对象都放到ServletContext里。

不同的是,while循环外操作的是web.xml里ActionServlet配置中config初始化参数指定的Struts配置文件;while循环内操作的是web.xml里ActionServlet配置中以"config/"开头的初始化参数指定的Struts配置文件。

while循环外的代码执行完后,会产生一个默认的没有前缀的ModuleConfig对象放到ServletContext里;while循环内的代码执行完后,会产生N个有前缀的ModuleConfig对象放到ServletContext里,N等于web.xml里ActionServlet配置中以"config/"开头的初始化参数的个数,它们的前缀是"config/"后的字符串。这个前缀体现在访问应用的URL中,用来区分各模块,方便团队开发。初始化ModuleConfig详解

 

  1. this.initModulePrefixes(this.getServletContext());  

将上面while循环内产生的所有前缀生成一个String数组,放到ServletContext里。

 

  1. this.destroyConfigDigester();  

将ActionServlet类的configDigester字段重置为null。

分享到:
评论
2 楼 chhj_292 2009-03-27  
分析来分析去,有没有想法自己搞一个啊?
1 楼 dvdface 2008-08-08  
奇怪 , 我和你的源代码怎么不一样? 原来你是1.2.9啊

相关推荐

    Struts 源码学习之ActionServlet

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

    struts源码学习.pdf

    通过对`struts源码学习.pdf`文件中的内容分析,我们可以深入了解Struts框架内部的工作原理,尤其是`RequestProcessor`类和`ModuleConfig`接口的关键作用。这些知识对于理解和优化基于Struts的应用程序至关重要,同时...

    关于struts和servlet同时用

    Servlet生命周期包括加载、初始化、服务、销毁等阶段,程序员可以通过重写`service()`方法来处理请求和响应。Servlet可以用来处理动态内容,如用户登录、数据处理等,但它的职责较为单一,主要关注业务逻辑的实现。 ...

    Struts1.2源码解读

    北大青鸟的这份文档是为了帮助学习者入门和精通Struts所编写的,包含了对Struts源码的详细解析。 首先,了解Struts的核心控制器ActionServlet是必要的。ActionServlet继承自javax.servlet.http.HttpServlet类,负责...

    Struts1源码解析

    ActionServlet是Struts1的核心组件,它的生命周期分为初始化、拦截请求和销毁三个阶段。在初始化阶段,`init()`方法执行了一系列关键步骤: 1. `initInternal()`方法初始化内部资源,如国际化设置。它包含了英文和...

    Manning - Struts 2 in Action源码

    1. `WEB-INF`目录:这是Web应用的核心区域,包含了`web.xml`部署描述符,定义了应用的初始化参数和Servlet映射。`classes`子目录存放编译后的Java类,而`lib`子目录则包含所有依赖的JAR文件。 2. `struts.xml`:这...

    MAX的struts2教程、struts2 API、servlet API

    3. **Servlet配置**:学习如何在web.xml中配置Servlet,包括URL映射、初始化参数等。 4. **请求与响应对象**:了解HttpServletRequest和HttpServletResponse对象,以及它们提供的各种方法,如获取请求参数、设置响应...

    手动编写struts源码及讲解

    - **Struts生命周期**:了解Struts组件的初始化、请求处理和销毁过程,有助于优化性能。 - **ActionContext**:在Struts 2中,ActionContext是Action上下文的容器,包含了请求、响应、session等信息。 - **...

    struts源码解析

    在Struts框架中,`init()`方法用于初始化ActionServlet,它会调用`initInternal()`以及其他必要的初始化操作,比如加载配置、注册事件监听器等。 5. **struts流程图方法图.vsd**: 这个文件可能是一个详细的流程图,...

    MVC框架struts1.2.9源码

    - **web.xml**:这是Servlet容器的部署描述符,其中包含了Struts的初始化参数,如ActionServlet的配置等。 **核心组件**: - **ActionServlet**:这是Struts框架的入口点,继承自Servlet,负责解析请求,执行Action...

    struts1.0x源码

    - 插件可以监听ActionServlet的生命周期事件,比如在初始化阶段进行配置加载,在销毁阶段进行资源释放。 4. **配置文件** - `struts-config.xml`:这是Struts的核心配置文件,定义了Action、ActionForm、...

    struts1.2.8源码包

    1. **ActionServlet**:这是 Struts 的核心 Servlet,它在 Web 应用启动时被加载,负责初始化框架并管理请求的生命周期。 2. **ActionForm**:封装了用户输入的数据,从视图层传递到模型层,也可以将处理结果返回到...

    Struts 1.2源码

    - RequestProcessor是处理请求的起点,它会解析请求,初始化ActionForm,调用ActionServlet进行后续处理。 通过研究Struts 1.2的源代码,我们可以了解其内部工作流程,学习如何编写符合MVC原则的代码,同时还能...

    孙卫琴:精通struts helloapp源码 第一到四章

    前者定义了Action映射、Form Bean、数据源等,后者则配置了Servlet和Filter,确保Struts能正确初始化。 4. **HelloApp示例**: HelloApp是学习Struts的入门示例,通常包括一个简单的Action类、一个Form Bean以及...

    struts1源码下载

    11. **ActionServlet的生命周期**:从初始化到服务,再到销毁,理解这一过程有助于优化应用性能。 深入研究Struts1的源码,开发者可以学习到如何优雅地处理HTTP请求、如何组织业务逻辑、如何实现视图和模型的解耦,...

    struts1.3源码

    10. **RequestProcessor**:这是Struts处理请求的第一步,它负责初始化和清理工作,以及将请求传递给ActionServlet。 深入研究Struts1.3的源码,可以让你了解其内部的工作流程,如请求的处理流程、Action的执行过程...

    Struts1.2类库核心源码

    ActionServlet负责初始化配置信息,管理ActionMapping对象,并根据请求分发到相应的Action。 2. **ActionMapping**: 此类负责映射HTTP请求到特定的Action。在struts-config.xml配置文件中定义,ActionMapping包含了...

    Struts1.x 的核心源码(研究下框架怎样构成)

    5. **RequestProcessor**:处理HTTP请求的预处理和后处理,它会初始化ActionServlet并进行一些基本的请求检查。 6. **ActionForward**:表示请求转发的实体,定义了Action执行后的页面跳转路径。 7. **.struts-...

    servlet,struts_src,源文件

    1. **ActionServlet**:这是Struts框架的主要入口点,继承自Servlet,负责接收请求并转发到相应的Action。 2. **ActionForm**:负责从请求中收集数据并封装成业务对象。 3. **Action**:执行实际的业务逻辑,并通过`...

Global site tag (gtag.js) - Google Analytics