`

Struts源码学习之ActionServlet (三)

阅读更多

④ 调用 initChain(); 读取web.xml 中命令链文件初始值chainConfig

protected String chainConfig = "org/apache/struts/chain/chain-config.xml" ;

// initChain();

 

// 如没有chainConfig 参数,则使用默认 "org/apache/struts/chain/chain-config.xml"

String value;

value = getServletConfig().getInitParameter("chainConfig");

if (value != null) {

    chainConfig = value;

}

 

ConfigParser parser = new ConfigParser();

List urls = splitAndResolvePaths(chainConfig);

URL resource;

 

// chainConfig 替换了原来传统的在 RequestProcessor 类中执行的 HTTP 请求处理

for (Iterator i = urls.iterator(); i.hasNext();) {

     resource = (URL) i.next();

     log.info("Loading chain catalog from " + resource);

     parser.parse(resource);

}

 

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

// org.apache.struts.action. RequestProcessor .java process 方法中,一些方法如

processLocale (request, response);

processContent (request, response);

processNoCache (request, response);

.......

"org/apache/struts/chain/chain-config.xml" 中下列配置所取代

<command

          className="org.apache.struts.chain.commands.servlet.SelectLocale"/>

<command

          className="org.apache.struts.chain.commands.servlet.SetContentType"/>

<command

          className="org.apache.struts.chain.commands.servlet.RequestNoCache"/>

.......

好处是充分降低了代码内部方法与方法之间的耦合度

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

 

 

/ 之间

// servlet 对象存储到servletContext 中,属性名为Globals.ACTION_SERVLET_KEY

" org.apache.struts.action.ACTION_SERVLET "

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

 

 

⑤ 调用 initModuleConfigFactory(); initModuleConfig("", config); 创建 ModuleConfig 对象。Struts 中的MessageResourcePlugIn 、数据源等,都是通过ModuleConfig 来实现的。

// 初始化ModuleConfig 配置工厂

initModuleConfigFactory(); //

// 由配置工厂实例化一个ModuleConfig 的对象

ModuleConfig moduleConfig = initModuleConfig ("", config); //

 

initModuleConfigFactory(); 所做的工作:

// 得到web.xml"configFactory" 参数,如果找不到,则使用 默认工厂

String configFactory = getServletConfig().getInitParameter("configFactory ");

if (configFactory != null) {

     ModuleConfigFactory.setFactoryClass (configFactory);

}

<servlet>

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

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

        <init-param>

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

      <param-value>com.lively.base.webapp.UserModuleConfigFactory</param-value>

        </init-param>

        .......

    </servlet>

 

ModuleConfigFactory.java 中的setFactoryClass 方法,

public static void setFactoryClass(String factoryClass) {

        ModuleConfigFactory.factoryClass = factoryClass;

        ModuleConfigFactory.clazz = null;

}

其中

protected static Class clazz = null;

protected static String factoryClass =

        "org.apache.struts.config.impl.DefaultModuleConfigFactory " ;

 

initModuleConfig ("", config); 所做的工作:

// Parse the configuration for this module

ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory (); //

ModuleConfig config = factoryObject.createModuleConfig (prefix); //

 

ModuleConfigFactory.createFactory (); 方法中:

protected static Class clazz = null;

protected static String factoryClass =

        "org.apache.struts.config.impl.DefaultModuleConfigFactory " ;

if (clazz == null) {

     clazz = RequestUtils.applicationClass (factoryClass);

}

factory = (ModuleConfigFactory) clazz.newInstance();

 

RequestUtils.applicationClass 通过classLoader 加载一个

org.apache.struts.config.impl.DefaultModuleConfigFactory

 

ModuleConfig config = factoryObject.createModuleConfig (prefix); 方法中:

// 通过new ModuleConfigImpl(prefix); 设置一些变量的初始值,在 initModuleConfig ("", config); 方法的最后会 ModuleConfig 对象放置到servletContext 中 (参见

protected String prefix = null;

protected HashMap actionConfigs = null;

protected List actionConfigList = null;

protected String actionFormBeanClass = "org.apache.struts.action.ActionFormBean";

protected String actionMappingClass = "org.apache.struts.action.ActionMapping";

protected String actionForwardClass = "org.apache.struts.action.ActionForward";

protected boolean configured = false;

protected ControllerConfig controllerConfig = null;

protected HashMap exceptions = null;

protected HashMap formBeans = null;

protected HashMap forwards = null;

protected HashMap messageResources = null;

protected ArrayList plugIns = null;

public ModuleConfigImpl(String prefix) {

        super();

        this.prefix = prefix;

        this.actionConfigs = new HashMap();

        this.actionConfigList = new ArrayList();

        this.actionFormBeanClass = "org.apache.struts.action.ActionFormBean";

        this.actionMappingClass = "org.apache.struts.action.ActionMapping";

        this.actionForwardClass = "org.apache.struts.action.ActionForward";

        this.configured = false;

        this.controllerConfig = null;

        this.exceptions = new HashMap();

        this.formBeans = new HashMap();

        this.forwards = new HashMap();

         this.messageResources = new HashMap();

        this.plugIns = new ArrayList();

}

 

protected String config = "/WEB-INF/struts-config.xml"; // initOther(); initModuleConfig ();

protected Digester configDigester = null; // initModuleConfig ();

 

// 初始化Digester

Digester digester = initConfigDigester();

 

initConfigDigester(); 所做的工作:

// Create a new Digester instance with standard capabilities

configDigester = new Digester();

configDigester.setNamespaceAware(true);

configDigester.setValidating(this.isValidating());

configDigester.setUseContextClassLoader(true);

// 解析struts 配置文件之前,首先添加默认的解析规则

configDigester.addRuleSet(new ConfigRuleSet());

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

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

    if (url != null) {

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

    }

}

// 通过getServletConfig().getInitParameter("rulesets");web.xml 中读取用户自定义的解析规则(用"," 分开的org.apache.commons.digester.RuleSet 列表)

this.addRuleSets();

/* 循环struts 配置文件(用"," 分开的多个struts 配置文件)并解析, parseModuleConfigFile 执行之后可以 struts-config.xml 等配置文件中得到 actionConfigs/actionConfigList exceptions formBeansforwardsmessageResourcesplugIns 等的配置,并把得到的所有值封装到对象 ModuleConfig 对象(config) */

List urls = splitAndResolvePaths(paths);

URL url;

for (Iterator i = urls.iterator(); i.hasNext();) {

    url = (URL) i.next();

    digester.push(config);

    this.parseModuleConfigFile (digester, url);

}

 

// config 存储到servletContext ,属性名为Globals.MODULE_KEY

" org.apache.struts.action.MODULE "

getServletContext().setAttribute(Globals.MODULE_KEY

            + config.getPrefix(), config);

 

 

⑥ 用户资源文件的初始化 initModuleMessageResources(moduleConfig);

在上面第 步的 中我们已经创建了ModuleConfig 对象 并在struts-config.xml 等配置文件中得到 得到一些配置且封装到ModuleConfig 对象 中,所以在下面可以直接使用initModuleMessageResources(moduleConfig);

 

initModuleMessageResources(moduleConfig); 所做的工作:

/* moduleConfig 中读取所有的资源文件(包括 ① 内部资源文件 利用Digester 读取的struts 配置文件指定的用户资源文件) */

MessageResourcesConfig[] mrcs = config.findMessageResourcesConfigs();

注: 此时moduleConfig 中默认只含有① 内部资源文件 ActionResources.properties

 

// resources (包括 ① 内部资源文件 ⑥ 用户资源文件 )存储到servletContext // 属性名为mrcs[i].getKey() + config.getPrefix()

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

            if ((mrcs[i].getFactory() == null)

                || (mrcs[i].getParameter() == null)) {

                continue;

            }

 

            if (log.isDebugEnabled()) {

                log.debug("Initializing module path '" + config.getPrefix()

                    + "' message resources from '" + mrcs[i].getParameter()

                    + "'");

            }

 

            String factory = mrcs[i].getFactory();

 

            MessageResourcesFactory.setFactoryClass(factory);

 

            MessageResourcesFactory factoryObject =

                MessageResourcesFactory.createFactory();

 

            factoryObject.setConfig(mrcs[i]);

 

            MessageResources resources =

                factoryObject.createResources(mrcs[i].getParameter());

 

            resources.setReturnNull(mrcs[i].getNull());

            resources.setEscape(mrcs[i].isEscape());

            getServletContext().setAttribute(mrcs[i].getKey()

                + config.getPrefix(), resources);

        }

 

 

分享到:
评论

相关推荐

    Struts 源码学习之ActionServlet

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

    struts源码学习.pdf

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

    servlet+struts源码

    总的来说,深入学习Servlet和Struts的源码,不仅能够帮助开发者理解这两个组件的工作原理,还能提升他们的问题排查能力,以及进行更高效、更灵活的Java Web应用开发。通过实践和理解这些源码,你将能够更好地适应...

    struts-1.2.9源码

    ActionServlet解析请求,查找与之对应的ActionMapping。 3. 根据ActionMapping,创建ActionForm实例,填充请求参数。 4. 调用Action的execute方法,执行业务逻辑。 5. Action返回一个ActionForward对象,指示...

    Struts JSTL 源码学习

    在Struts框架中,核心组件包括Action、ActionForm、ActionServlet、配置文件(struts-config.xml)以及各种拦截器。Action是业务逻辑的载体,ActionForm用于收集用户输入,ActionServlet作为Struts的核心控制器,...

    关于struts和servlet同时用

    Struts通过Action类实现了对Servlet请求的分发,ActionForm负责收集和验证表单数据,而Model代表业务对象,View则负责展示数据。这种分离使得代码更易于维护和测试。Struts还提供了强大的国际化、异常处理、数据校验...

    struts-1.3.9 源码

    `Action`类是业务逻辑的入口点,`ActionForm`用于收集和验证用户输入,`ActionServlet`是Struts的控制器,负责调度请求。 2. **org.apache.struts.config**:配置相关的类,如`ModuleConfig`和`ActionConfig`,它们...

    Struts1源码解析

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

    struts源码+struts-lib

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

    Manning - Struts 2 in Action源码

    学习Struts 2源码,你将能了解到以下知识点: - MVC设计模式的实现。 - Struts 2的拦截器机制,如何自定义拦截器以实现权限控制、日志记录等功能。 - 动作和结果的配置,以及如何使用OGNL表达式进行数据绑定。 - ...

    struts-1.2.9-src源码类库

    Struts框架的核心组件包括Action、ActionForm、ActionServlet、Config、Tiles等。Action是处理用户请求的中心,它接收表单数据并调用业务逻辑;ActionForm用于封装表单数据,提供验证功能;ActionServlet作为控制器...

    struts源码

    学习Struts源码有助于开发者深入理解其内部工作机制,例如: - 如何解析struts-config.xml并构建ActionMapping和ActionForm实例。 - 请求是如何被ActionServlet接收并分发到对应的Action的。 - Action是如何处理...

    手动编写struts源码及讲解

    3. **ActionServlet**:Struts的入口点,它是一个Servlet,负责处理HTTP请求,调用相应的Action类执行业务逻辑。 4. **配置文件**:主要包括struts-config.xml,定义了Action、ActionMapping、FormBean等配置,是...

    Struts1.2源码解读

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

    struts1.2源码

    总的来说,Struts 1.2源码的学习将帮助你理解Web应用程序的生命周期,MVC模式的实现细节,以及如何通过配置文件和代码协作来构建可扩展的Web应用。深入研究源码,不仅可以提升你的编程技能,也能让你更好地应对实际...

    struts1源码(完整版)

    学习Struts1源码有助于开发者更好地理解Web应用的架构设计,以及MVC模式的实现细节,对于提升Java Web开发技能和解决问题具有很大帮助。同时,虽然Struts1已逐渐被更新的框架如Struts2和Spring MVC取代,但其设计...

    Struts jar包和源码包(含3个版本)

    4. **ActionServlet**:作为Servlet实现,是整个框架的核心,负责调度请求。 5. **配置文件**:`struts-config.xml`用于配置Action、ActionForm、-forward等,定义了请求的处理流程。 ### Struts 2.3.37 Struts 2是...

    struts2框架源码

    通过分析提供的源码,可以更好地了解Struts2的工作流程,学习如何组织Action、Interceptor、配置文件等,从而提升开发能力。在实践中不断探索,可以逐步熟练运用Struts2进行高效、稳定的Web应用开发。

    Struts源码及帮助

    1. **ActionServlet**:这是Struts的核心控制器,它是Servlet的一个子类,负责接收HTTP请求,并根据配置文件(struts-config.xml)将请求转发到相应的Action。 2. **ActionForm**:ActionForm对象用于封装来自视...

    MVC框架struts1.2.9源码

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

Global site tag (gtag.js) - Google Analytics