`

struts2 处理请求流程分析(结合源码)1

阅读更多

struts2 源码版本2.0.11.1

本文是综合网上部分人的分析成果,然后再自己结合源码进行的,分析中如有错误,请指正。

   从struts2 中的web.xml的启动配置可以看出,首先分析的是FilterDispatcher 这个过滤器类。

 

1、过滤器的初始化方法 void init(FilterConfig filterConfig)

//初始化方法
public void init(FilterConfig filterConfig) throws ServletException {
    	 this.filterConfig = filterConfig;
    	//获得默认的参数,创建dispathcher 对象
        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);
    }

 

    1.1、createDispatcher(filterConfig);方法,该方法的目的是创建Dispathcher 对象

 

  protected Dispatcher createDispatcher(FilterConfig filterConfig) {
    	//读取相应过滤器的web.xml 配置
        Map<String,String> params = new HashMap<String,String>();
        for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements(); ) {
            String name = (String) e.nextElement();
            String value = filterConfig.getInitParameter(name);
            params.put(name, value);
        }
        //可以看出Dispatcher 类包装了ServletContext 和过滤器的web.xml 配置
        return new Dispatcher(filterConfig.getServletContext(), params);
    }

 

 

  1.2、dispatcher.init();方法,该方法对dispatcher进行了一系列的初始化工作,这个工作很重要也有点复杂,具体每个初始化的工作的流程怎样,待有空闲的时候再继续分析,网上也有人已经分析过了,如果有兴趣可参照:http://zddava.iteye.com/blog/211795

 

public void init() {
    	if (configurationManager == null) {
    		configurationManager = new ConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
    	}
    	//读取properties信息,默认的default.properties
    	init_DefaultProperties(); // [1]
    	//读取xml配置文件,默认的struts-default.xml,struts-plugin.xml,struts.xml
        init_TraditionalXmlConfigurations(); // [2]
      //读取用户自定义的struts.properties  
        init_LegacyStrutsProperties(); // [3]
       //读取FilterDispatcher的配置中所定义的actionPackages属性,传说中的Struts 2 零配置所谓的零配置
        init_ZeroConfiguration(); // [4]
      //自定义的configProviders 
        init_CustomConfigurationProviders(); // [5]
      //该功能全面被注释
        init_MethodConfigurationProvider();
      //载入FilterDispatcher传进来的initParams   
        init_FilterInitParameters() ; // [6]
      //将配置文件中的bean与具体的类映射 
        init_AliasStandardObjects() ; // [7]
      //构建一个用于依赖注射的Container对象   
      //在这里面会循环调用上面七个ConfigurationProvider的register方法   
      //其中的重点就是DefaultConfiguration的#reload()方法  
        Container container = init_PreloadConfiguration();
        init_CheckConfigurationReloading(container);
        init_CheckWebLogicWorkaround(container);
    }

 

   1.3、String param = filterConfig.getInitParameter("packages"); 以下的代码。这个步骤载入了packages标签下定义的静态资源。 读取web.xml中 的下面的配置路径还有org.apache.struts2.static,template,org.apache.struts2.interceptor.debugging这三个包空间下边的资源也会作为静态资源载入。

    <filter>
       <filter-name>struts2</filter-name>
       <filter-class>
           org.apache.struts2.dispatcher.FilterDispatcher
       </filter-class>
       <init-param>
           <param-name>packages</param-name>
           <param-value>cn.static.resource</param-value>
       </init-param>
    </filter>

 

    1.4、this.pathPrefixes = parse(packages);这个步骤是对packages 进行解析的。

  protected String[] parse(String packages) {
        if (packages == null) {
            return null;
        }
        List<String> pathPrefixes = new ArrayList<String>();
        StringTokenizer st = new StringTokenizer(packages, ", \n\t");
        while (st.hasMoreTokens()) {
            String pathPrefix = st.nextToken().replace('.', '/');
            if (!pathPrefix.endsWith("/")) {
                pathPrefix += "/";
            }
            pathPrefixes.add(pathPrefix);
        }
        return pathPrefixes.toArray(new String[pathPrefixes.size()]);
    }

 

 

 

分享到:
评论
1 楼 liuyuanhui0301 2012-07-20  
 

相关推荐

    Struts2源码分析

    总的来说,Struts2的源码分析可以帮助开发者深入理解其内部机制,包括请求处理流程、拦截器的运作方式以及视图组件的实现。这有助于提高应用的可维护性,优化性能,并使开发者能够更好地定制和扩展框架。对于熟悉...

    struts2框架源码

    Struts2框架是Struts1的升级版本,它结合了WebWork框架的优点,提供了更高效、更灵活的架构设计。深入理解Struts2的源码对于提升Java Web开发技能,尤其是在面试中讨论底层实现时,具有非常重要的价值。 首先,我们...

    struts2案例 struts2 struts2源码

    下面,我们将深入探讨Struts2的核心概念、源码分析以及如何利用它来创建实际的案例。 首先,Struts2的架构基于Action和Result的设计模式,Action是业务逻辑的载体,Result则是处理Action执行后展示结果的方式。这种...

    Struts2权威指南 加源码

    总的来说,《Struts2权威指南》结合源码阅读,可以帮助读者不仅掌握Struts2的基本使用,还能深入到框架底层,提高问题排查和优化能力。同时,对于Spring和Hibernate的集成部分,也能提升开发者在大型项目中的协作和...

    struts2入门学习源码

    1. **Action**:Action是Struts2的核心,它负责接收用户的请求并进行业务逻辑处理。开发者可以通过实现`com.opensymphony.xwork2.Action`接口或继承`org.struts2.interceptor.ModelDriven`、`org.struts2....

    struts2源码解析.pdf

    Struts2是一个流行的Java Web框架,它为开发者提供了一种结构化的MVC(Model-View-...通过分析源码,我们可以发现Struts2是如何优雅地处理请求、管理Action状态以及与其他Web组件交互的,从而提升我们的编程技能。

    struts2下的xwork源码

    通过分析以上关键组件的源码,我们可以理解Struts2的请求处理流程,以及如何扩展和定制自己的拦截器、Action和Result。这将有助于提高我们在实际项目中的问题定位和性能优化能力。在阅读源码时,建议结合实际应用...

    struts2源码

    1. 拦截器的实现:了解如何定义自定义拦截器,以及它们在请求处理流程中的位置。 2. Action和Result的生命周期:理解Action如何创建和销毁,Result如何将数据传递到视图。 3. OGNL的工作机制:学习OGNL如何解析和...

    struts2数据封装源码

    1. **Action类**:在Struts2中,Action类是处理用户请求的核心组件。它继承自`com.opensymphony.xwork2.ActionSupport`类或其子类,提供了执行业务逻辑的方法。每个Action方法对应一个特定的用户请求,方法的返回...

    Struts2权威指南源码(完整),不含JAR文件

    2. **请求处理流程**:跟踪一个HTTP请求从进入Struts2到返回响应的整个过程,重点关注ActionInvocation、Interceptor的执行顺序。 3. **拦截器实现**:深入研究默认拦截器的实现,如PrepareInterceptor、...

    struts2,hibernate,spring整合源码,配置文件,jar包

    Struts2、Hibernate和Spring是Java开发中三大主流框架,...同时,Struts2和Hibernate的结合使得Web请求到数据库操作的流程更加顺畅。这种整合方式在现代Java Web开发中非常常见,是提升开发效率和项目质量的有效途径。

    Struts2源码

    结合源码阅读和PPT讲解,你可以逐步掌握Struts2的核心概念,提升在实际项目中的应用能力。同时,也要关注Struts2与其他框架(如Spring、Hibernate)的整合,以及如何利用Struts2实现RESTful服务。通过深入学习,你将...

    spring3、struts2、mybatis结合的一个简单web实现

    Struts2处理请求,Spring管理业务逻辑和依赖,MyBatis处理数据持久化,而Tiles则负责视图的组装。这种架构模式在实际项目中非常常见,对于初学者来说,理解和掌握这些框架的整合是提高开发技能的关键步骤。通过分析...

    struts-1.2.9源码

    通过对Struts 1.2.9源码的深入学习,开发者可以了解Web应用的典型开发流程,掌握如何有效地组织和管理复杂的业务逻辑,以及如何优雅地处理用户交互。虽然Struts 1已逐渐被Struts 2和Spring MVC等更新框架替代,但它...

    struts2 相关教程和源码分析(集合)

    分析Struts2的源码可以帮助我们理解其内部工作流程,例如Filter Dispatcher如何分发请求,ActionInvocation如何执行Action,Interceptor链如何工作等。通过源码阅读,可以提高对框架的深度理解和定制能力。 7. **...

    struts2 权威指南 源码

    1. **Action与结果类型**:在Struts2中,Action是业务逻辑的载体,它接收请求,处理数据,并返回一个Result。Result定义了请求处理后的输出方式,可以是重定向、转发或者生成一个视图。源码中可以看到Action的实现...

    Struts2 poi动态导入导出Excel源码示例

    综上所述,这个示例项目提供了Struts2与POI结合使用来实现Excel动态导入导出的完整流程,对于学习和理解这两种技术在实际项目中的应用具有很高的参考价值。通过阅读源码和运行示例,开发者可以更好地掌握这些技术,...

    Struts2权威指南全部源码

    5. **请求处理流程**:跟随请求从Servlet容器到Struts2的流程,理解Struts2如何拦截和处理请求。 6. **异常处理**:研究Struts2如何处理异常,以及如何自定义异常处理策略。 7. **国际化与本地化**:分析Struts2...

    struts-2.1.8.1源码

    总的来说,Struts 2.1.8.1+xwork-2.1.6源码分析可以深入了解其内部工作原理,包括请求处理流程、拦截器机制、对象模型以及配置管理等,这对于优化性能、扩展功能或排查问题都非常有帮助。通过阅读和学习源码,开发者...

    博客网源码 结合struts2和JSP,hibernate

    博客网源码是一款基于Struts2和JSP技术,结合Hibernate ORM框架开发的网站系统。Struts2是一个强大的MVC框架,它提供了丰富的控制结构,用于处理用户请求并将其映射到相应的业务逻辑。JSP(JavaServer Pages)是Java...

Global site tag (gtag.js) - Google Analytics