`
Ivan_Pig
  • 浏览: 386884 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Struts2源码研究1

阅读更多
看struts2一周,就搞定了一个程序,郁闷。还有源码里的一个注入问题,一直得不到解决。
http://www.iteye.com/problems/2568
网上问了好久也没有满意的答案。。。。还是靠自己吧,自己研究。

首先,web.xml文件里的这一段肯定是个关键。
<filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

那么就从这里入手。
filter应该和servlet差不多,在struts2里面,当有请求发生时,就会匹配<url-pattern>/*</url-pattern>,如果匹配,则根据<filter-name>struts2</filter-name>找到<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>。
那么就到FilterDispatcher里看看。

Filter执行顺序是,init(),doFilter(),destroy()。先看init()
public void init(FilterConfig filterConfig) throws ServletException {
        
        this.filterConfig = filterConfig;
    	 
        dispatcher = createDispatcher(filterConfig);
        dispatcher.init();
        
        String param = filterConfig.getInitParameter("packages");
        String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
        if (param != null) {
            packages = param + " " + packages;
        }
        this.pathPrefixes = parse(packages);
    }


        this.filterConfig = filterConfig;
   
        dispatcher = createDispatcher(filterConfig);
        dispatcher.init();
这一段,是对struts2需要的资源的一个初始化。进到Dispatcher里面的init方法里,可以看到init了很多东西。

 public void init() {

    	if (configurationManager == null) {
    		configurationManager = new ConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
    	}

    	init_DefaultProperties(); // [1]
        init_TraditionalXmlConfigurations(); // [2]
        init_LegacyStrutsProperties(); // [3]
        init_ZeroConfiguration(); // [4]
        init_CustomConfigurationProviders(); // [5]
        init_MethodConfigurationProvider();
        init_FilterInitParameters() ; // [6]
        init_AliasStandardObjects() ; // [7]

        Container container = init_PreloadConfiguration();
        init_CheckConfigurationReloading(container);
        init_CheckWebLogicWorkaround(container);

    }

这里很好理解。
Container container = init_PreloadConfiguration();
引起了我的注意,注入需要ioc容器,这个container是不是就是我要找的那个容器呢?而且它存在的包名叫com.opensymphony.xwork2.inject,可能行更大了。不过这玩样是webwork里的东东,那就下webwork的源码吧。
下载地址:http://www.opensymphony.com/
看官网上这句话
XWork is an command-pattern framework that is used to power Struts 2 as well as other applications. XWork provides an Inversion of Control container, a powerful expression language, data type conversion, validation, and pluggable configuration.
呵呵,八九不离十了。
init_PreloadConfiguration();
从名字可以看出,这个init方法是加载需要提前加载的配置。
到里面看看代码
private Container init_PreloadConfiguration() {
        Configuration config = configurationManager.getConfiguration();
        Container container = config.getContainer();

        boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD));
        LocalizedTextUtil.setReloadBundles(reloadi18n);

        ObjectTypeDeterminer objectTypeDeterminer = container.getInstance(ObjectTypeDeterminer.class);
        ObjectTypeDeterminerFactory.setInstance(objectTypeDeterminer);

        return container;
    }


1,2两句就是获得container的,里面有什么东西,再往里看。看configurationManager.getConfiguration();
public synchronized Configuration getConfiguration() {
        if (configuration == null) {
            setConfiguration(new DefaultConfiguration(defaultFrameworkBeanName));
            try {
                configuration.reload(getConfigurationProviders());
            } catch (ConfigurationException e) {
                setConfiguration(null);
                throw e;
            }
        } else {
            conditionalReload();
        }

        return configuration;
    }


这里的getConfigurationProviders()取到的providers就是前面1-7init里面所加的provider.
configuration.reload(getConfigurationProviders());再往里看。
public synchronized void reload(List<ConfigurationProvider> providers) throws ConfigurationException {
        packageContexts.clear();
        loadedFileNames.clear();

        ContainerProperties props = new ContainerProperties();
        ContainerBuilder builder = new ContainerBuilder();
        for (ConfigurationProvider configurationProvider : providers)
        {
            configurationProvider.init(this);
            configurationProvider.register(builder, props);
        }
        props.setConstants(builder);
        
        builder.factory(Configuration.class, new Factory<Configuration>() {
            public Configuration create(Context context) throws Exception {
                return DefaultConfiguration.this;
            }
        });
        
        try {
            // Set the object factory for the purposes of factory creation
            ObjectFactory.setObjectFactory(new ObjectFactory());
            
            container = builder.create(false);
            objectFactory = container.getInstance(ObjectFactory.class);
            ObjectFactory.setObjectFactory(objectFactory);
            
            for (ConfigurationProvider configurationProvider : providers)
            {
                container.inject(configurationProvider);
                configurationProvider.loadPackages();
            }
    
            rebuildRuntimeConfiguration();
        } finally {
            ObjectFactory.setObjectFactory(null);
        }
    }

container.inject(configurationProvider);这一句不看代码也明了了。注入贝。
那么struts2里面的注入的大体流程应该就是这样的了(我的理解,不对的请拍砖。。。)
后面的细节再慢慢研究。^-^
7
1
分享到:
评论
2 楼 ivoter 2011-12-20  
能不能把后边的也给贴出来..自己看有点晕...
1 楼 liyaxi 2009-02-15  
了解真相, 真相让我们更自由! ----圣经
自己搞懂! 是不是很有成就感!

相关推荐

    struts2源码最新

    在深入研究Struts2源码时,我们可以关注以下几个关键组件: - **StrutsPrepareAndExecuteFilter**:这是Struts2的核心过滤器,负责初始化Struts2框架并处理所有的HTTP请求。 - **ActionContext**:存储了请求期间...

    struts2 项目源码

    本项目源码提供了一个基础的Struts2应用程序实例,对于初学者来说,这是一个很好的学习资源,可以深入理解Struts2的工作原理和架构。 Struts2的核心组件包括: 1. **Action类**:Action类是业务逻辑的载体,它是...

    struts 2 源码 导入eclipse工程

    导入源码后,你可以开始深入研究Struts 2的核心组件和工作流程: 1. **Action类**:在Struts 2中,Action类是处理用户请求的核心。开发者通常需要继承`org.apache.struts.action.Action`或`...

    struts2框架源码

    通过对Struts2源码的深入研究,开发者可以更好地理解其内部工作原理,从而优化应用性能,解决实际问题,以及设计出更符合框架精神的代码结构。同时,这也为面试中展示自己的技术深度和问题解决能力提供了有力的支持...

    struts2源码分析总结

    Struts2是一个流行的Java Web框架,它简化了MVC(模型-视图-控制器)架构的实现。本文将深入探讨Struts2的...通过深入研究Struts2的源码,我们可以发现其内部工作原理,这对于解决复杂问题和开发自定义插件非常有帮助。

    struts2 源码绝对完整

    在深入研究Struts2源码时,我们可以关注以下几个关键部分: 1. **org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter**:这是Struts2的核心过滤器,它初始化并调用Struts2的生命周期。 2. **...

    struts2.1.8 struts2源码 Eclipse关联这个可以

    1. **Struts2的核心概念** - **Action**: Action是业务逻辑的载体,负责处理用户请求并返回结果。在Struts2中,Action可以通过实现`com.opensymphony.xwork2.Action`接口或继承`org.struts2.interceptor栈...

    Struts 2的源码

    深入研究Struts 2的源码,我们可以学习到: - 如何实现MVC模式并进行请求处理。 - 拦截器的设计模式及其应用场景。 - 如何通过配置文件定制框架行为。 - 视图层模板语言的使用和实现原理。 - 插件系统的工作方式和...

    struts1.2源码研究

    Struts 1.2 是一款基于 Model-View-Controller(MVC)设计模式的开源Java Web框架,由Apache...通过深入理解Struts 1.2的源码,开发者可以更好地利用这个框架,解决实际项目中的问题,同时为自定义扩展和优化提供可能。

    Struts2框架源码

    此压缩包文件包含的是Struts2的源码,特别适合初学者研究和学习,其中涵盖了拦截器和验证等关键组件的实现。 首先,我们来深入了解Struts2的核心概念: 1. **Action类**:在Struts2中,业务逻辑通常由Action类执行...

    Struts2演示源码

    Struts2是一个强大的Java web开发框架,用于构建可维护、可扩展且结构良好的应用程序。它提供了MVC(Model-View-...通过深入研究这些示例,开发者可以更好地理解和掌握Struts2框架,从而更高效地开发Java web应用。

    struts2源码

    深入研究Struts2源码有助于提升对Java Web开发的理解,尤其是对于MVC框架的设计思想、AOP(面向切面编程)的应用以及依赖注入等方面有深刻认识。同时,源码学习也能帮助你更好地定位和解决问题,提高开发效率。

    struts2源码研究

    Struts2 源码分析主要涉及其在Tomcat启动过程中的初始化步骤以及请求处理流程。首先,我们来看Tomcat启动时Struts2框架如何准备和执行。 在Tomcat启动时,Struts2的Filter文件被加载,具体是`...

    struts2最新版源码文件

    这个源码包是Struts2的2.3.20版本,官方的最新版本,对于想要深入理解Struts2工作原理、优化代码或自定义行为的开发者来说,研究源码是非常有价值的。 首先,Struts2的核心组件包括Action、Interceptor、Result和...

    轻松掌握struts2 全书源码

    1. **Action类**:在Struts2中,Action类是业务逻辑的载体,它处理用户请求并返回结果。通常,每个Action类对应一个特定的页面或者业务功能。 2. **配置文件(struts.xml)**:这是Struts2的配置中心,定义了Action...

    struts2权威指南源码

    在实际开发中,理解和研究源码可以帮助解决框架使用中的问题,定制化开发,以及避免框架的潜在风险,例如著名的Struts2的安全漏洞。 总的来说,Struts2源码的学习涵盖了Java Web开发中的许多重要概念和技术,包括...

    最新Struts2开源实例代码以及Struts2源码

    深入研究源码,开发者可以了解到Struts2的请求处理流程,包括ActionInvocation、Interceptor Stack、Result执行等关键组件的工作方式。通过阅读源码,可以更好地理解如如何定义和实现自定义拦截器、如何处理异常、...

    Struts2源码

    Struts2是一个基于MVC(Model-View-...在研究struts-2.2.1.1 src这个源码包时,可以关注各个主要组件的实现,如Action、Interceptor、ValueStack等,以及配置解析和请求处理流程,这对于提高Java Web开发技能大有裨益。

    struts2部分源码分析

    通过对这些关键组件的深入理解和代码研究,开发者可以更好地掌握Struts2框架,提高应用的可维护性和扩展性。在实际项目中,合理利用Struts2提供的特性,如Interceptor,可以大大提高代码的复用性和模块化程度,从而...

    struts2-json-plugin源码

    1. **Action结果类型**:在Struts2中,Action的结果类型决定了如何处理Action的返回值。`struts2-json-plugin`添加了JSON结果类型,当Action返回此类型时,会将结果转换为JSON格式。 2. **JSONResult类**:这是实现...

Global site tag (gtag.js) - Google Analytics