`
hain
  • 浏览: 455543 次
  • 来自: ...
社区版块
存档分类
最新评论

struts2配置文件加载流程分析

阅读更多
首先org.apache.struts2.dispatcher. FilterDispatcher.java 中的init()方法,
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        String param = filterConfig.getInitParameter("packages");//由此可以看出可以增加参数packages
        String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
        if (param != null) {
            packages = param + " " + packages;
        }
        this.pathPrefixes = parse(packages);
        dispatcher = new Dispatcher(filterConfig.getServletContext());
}

org.apache.struts2.dispatcher. Dispatcher.java
首先执行静态代码块:
    static {
        ObjectFactory.setObjectFactory(new StrutsObjectFactory());
        ActionProxyFactory.setFactory(new StrutsActionProxyFactory());
}
执行构造方法
    public Dispatcher(ServletContext servletContext) {
        init(servletContext);
}
然后执行init()方法:

boolean reloadi18n = Boolean.valueOf(
(String) Settings.get(StrutsConstants.STRUTS_I18N_RELOAD)).booleanValue();
上面的语句读取了properties文件。


读取properties文件的流程:
首先执行Org.apache.struts2.dispatcher.Dispatcher.java 类的方法init()中的语句
        boolean reloadi18n = Boolean.valueOf((String)
Settings.get(StrutsConstants.STRUTS_I18N_RELOAD)).booleanValue();

然后执行了org.apacher.struts2.config.Setting.java类中的方法
    public static String get(String name) throws IllegalArgumentException {
        String val = getInstance().getImpl(name);
        return val;
    }
然后执行了
    public static Settings getInstance() {
        return (settingsImpl == null) ? getDefaultInstance() : settingsImpl;
}
然后执行了
    private static Settings getDefaultInstance() {
        if (defaultImpl == null) {
            // Create bootstrap implementation
            defaultImpl = new DefaultSettings(); //产生了一个DefaultSettings对象

            // Create default implementation
            try {
                String className = get(StrutsConstants.STRUTS_CONFIGURATION);

                if (!className.equals(defaultImpl.getClass().getName())) {
                    try {
                        // singleton instances shouldn't be built accessing request or session-specific context data
                        defaultImpl = (Settings) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null);
                    } catch (Exception e) {
                        LOG.error("Could not instantiate settings", e);
                    }
                }
            } catch (IllegalArgumentException ex) {
                // ignore
            }
        }

        return defaultImpl;
}

然后首先执行了语句defaultImpl = new DefaultSettings();
    public DefaultSettings() {
        // Create default implementations
        // Use default properties and struts.properties
        ArrayList list = new ArrayList();

        try {
           list.add(new PropertiesSettings("struts"));//从这里加载struts.properties文件
        } catch (Exception e) {
            log.warn("Could not find or error in struts.properties", e);
        }

        try {
        list.add(new PropertiesSettings("org/apache/struts2/default")); //加载默认的defualt.properties文件
        } catch (Exception e) {
            log.error("Could not find org/apache/struts2/default.properties", e);
        }

        Settings[] configList = new Settings[list.size()];//定义了Settings对象数组
        config = new DelegatingSettings((Settings[]) list.toArray(configList));

        // Add list of additional properties settingss
        try {
            StringTokenizer configFiles = new StringTokenizer((String) config.getImpl(StrutsConstants.STRUTS_CUSTOM_PROPERTIES), ",");
加载了用户自己定义的properties文件。
            while (configFiles.hasMoreTokens()) {
                String name = configFiles.nextToken();

                try {
                    list.add(new PropertiesSettings(name));
                } catch (Exception e) {
                    log.error("Could not find " + name + ".properties. Skipping");
                }
            }

            configList = new Settings[list.size()];
            config = new DelegatingSettings((Settings[]) list.toArray(configList));
        } catch (IllegalArgumentException e) {
            // thrown when Settings is unable to find a certain property
            // eg. struts.custom.properties in default.properties which is commented
            // out
        }

        // Add additional list of i18n global resource bundles
        try {

            LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages");
            StringTokenizer bundleFiles = new StringTokenizer((String) config.getImpl(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES), ", ");

            while (bundleFiles.hasMoreTokens()) {
                String name = bundleFiles.nextToken();
                try {
                    log.info("Loading global messages from " + name);
                    LocalizedTextUtil.addDefaultResourceBundle(name);
                } catch (Exception e) {
                    log.error("Could not find " + name + ".properties. Skipping");
                }
            }
        } catch (IllegalArgumentException e) {
            // struts.custom.i18n.resources wasn't provided
        }
}
看看org.apache.struts2.config.DelegatingSettings.java下面的方法。
/**
     * Gets the specified property - calls getImpl(String) method on config objects in config list
     * until successful.
     *
     * @see #get(String)
     */
    public String getImpl(String name) throws IllegalArgumentException {
        // Delegate to the other settings
        IllegalArgumentException e = null;

        for (int i = 0; i < configList.length; i++) {
            try {
                return configList[i].getImpl(name);
            } catch (IllegalArgumentException ex) {
                e = ex;

                // Try next config
            }
        }

        throw e;
    }
分享到:
评论
1 楼 allenBen 2007-09-29  
怎么你写的一些代码我没看到啊难道源码还会不同?2.0.9

相关推荐

    Struts2的工作流程及配置文件

    ### Struts2的工作流程及配置文件详解 #### 一、Struts2简介 Struts2是基于MVC设计模式的Java Web开发框架之一,它继承了Struts1的优点,并在此基础上进行了大量的改进和扩展。Struts2框架的核心是拦截器...

    struts2配置文件介绍

    Struts2是一个强大的MVC框架,其配置文件是实现应用程序逻辑和控制流程的关键部分。本文将详细介绍Struts2的核心配置文件及其元素。 首先,我们来看一下Struts2的主要配置文件: 1. **web.xml**: 这是Web应用程序...

    Struts2配置文件

    `struts.xml`是Struts2的核心配置文件,它定义了动作(Actions)、结果(Results)、拦截器(Interceptors)等,控制着请求的流程。以下是其主要内容: 1. **package**: 包的概念是Struts2配置的组织方式,每个包...

    struts2主要配置文件总结

    Struts2是一个强大的MVC框架,其配置文件对于理解和配置应用程序的行为至关重要。本文将深入探讨Struts2的主要配置文件,以及它们各自的功能和用途。 首先,我们来看一下核心的配置文件: 1. **web.xml**: 这是Web...

    struts2流程与流程图

     ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。例如,用户注册示例将找到UserReg类。  ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过...

    struts核心jar包及xml配置文件

    - **struts-plugin.xml**: 插件配置文件,用于加载特定插件,扩展Struts2的功能。 - **struts.xml**或**struts-config.xml**: 应用程序的主配置文件,可以在这里定义Action类、结果、拦截器等。 - **package.xml**...

    struts 预加载数据demo

    - `src/main/resources`:可能包含配置文件,如Struts2的配置文件`struts.xml`。 - `src/main/webapp`:Web应用的根目录,包括静态资源(如HTML、CSS、JavaScript)、Web-INF目录(含有web.xml配置文件)等。 - `...

    struts1多模块多配置文件

    ### Struts1多模块多配置文件的开发流程详解 #### 一、引言 在大型项目的开发过程中,为了更好地组织代码结构,提高系统的可维护性和扩展性,通常会采用多模块的设计模式。对于使用Struts1框架进行开发的项目而言,...

    struts2源代码分析

    配置相关的内容位于`org.apache.struts2.config`包中,Struts2使用WebWork的解析器来处理XML和properties文件,实现配置文件的读取和解析。`org.apache.struts2.dispatcher`包包含了Struts2的核心类,如Dispatcher,...

    struts2 零配置

    "Struts2 零配置"是Struts2的一种特性,允许开发者在不编写大量XML配置文件的情况下,快速搭建和运行应用程序。这主要得益于Struts2的插件机制和注解支持。 首先,Struts2的零配置主要依赖于以下两个核心概念: 1....

    Struts2快速学习步骤

    本章学习目标  struts2 的概念和作用  struts2 的HelloWorld ... struts2 配置文件加载  struts.xml 配置文件详解  struts2 常量文件修改  Action 动作类的三种写法  Action 动作类的三种访问方式

    Struts2零配置

    3. **插件集成**:安装Convention插件非常简单,只需将相应的JAR包复制到项目的`WEB-INF/lib`目录下,Struts2框架会在启动时自动加载并识别这些插件。 #### 三、Convention插件的安装与使用 1. **插件安装**: - ...

    struts2源码分析总结

    `Dispatcher`是Struts2的核心,负责处理请求、解析XML配置文件以及创建Action和ActionConfig。 5. `PrepareOperations`类被实例化,它的主要职责是在每个请求开始时创建`ActionContext`,并在请求结束时清除`...

    struts各种配置

    - **配置文件**:在`WEB-INF/`目录下编写`web.xml`文件,用以拦截所有用户的请求并加载Struts的配置文件`struts-config.xml`。 **2. web.xml 配置** 在`web.xml`中,需要配置以下内容: - **拦截器**:通过`...

    Struts配置文件详解.pdf

    ### Struts配置文件详解 #### 一、Struts配置文件的重要性与作用 Struts框架作为Java Web开发领域中的一种流行MVC(Model-View-Controller)框架,它提供了一种结构化的方式来构建Web应用程序。在Struts框架中,`...

    struts2开发流程简图

    - **struts-default.xml**:这是Struts2的默认配置文件,提供了许多预定义的配置,比如默认的拦截器栈。将其复制到`src`目录并重命名为`struts.xml`,根据项目需求进行自定义配置。 - **default.properties**:这...

    struts2面试题

    - **Struts2的默认配置文件**:Struts2默认会加载一个名为`struts-default.xml`的配置文件,这个文件包含了Struts2的核心配置信息。开发者可以通过自定义的配置文件来覆盖或扩展这些默认配置。 #### Struts2的请求...

Global site tag (gtag.js) - Google Analytics