`
weigang.gao
  • 浏览: 491671 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Struts2 源码的解析(12)

 
阅读更多

首先需要建立Struts2 HelloWorld,然后再使用eclipse的debug功能查看Struts2的源码。

当一个请求到来时会经过Struts2Filter过滤(调用其中的doFilter)。

①.Struts2的request处理流程如下:


下面我们来看看struts2的部分源码:

1.StrutsPrepareAndExecuteFilter的doFilter方法

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        try {
            prepare.setEncodingAndLocale(request, response);
            prepare.createActionContext(request, response);
            prepare.assignDispatcherToThread();
			if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
				chain.doFilter(request, response);
			} else {
				request = prepare.wrapRequest(request);
				ActionMapping mapping = prepare.findActionMapping(request, response, true);
				if (mapping == null) {
					boolean handled = execute.executeStaticResourceRequest(request, response);
					if (!handled) {
						chain.doFilter(request, response);
					}
				} else {
					execute.executeAction(request, response, mapping);//调用ExecuteOperations的executeAction方法
				}
			}
        } finally {
            prepare.cleanupRequest(request);
        }
    }

 2.DefaultActionInvocation中的invoke方法

  public String invoke() throws Exception {
        String profileKey = "invoke: ";
        try {
            UtilTimerStack.push(profileKey);

            if (executed) {
                throw new IllegalStateException("Action has already executed");
            }

            if (interceptors.hasNext()) {//判断是不是还有下一个InterceptorMapping,每个InterceptorMapping里面存放着一个Interceptor
                final InterceptorMapping interceptor = interceptors.next();//获取下一个InterceprorMapping
                String interceptorMsg = "interceptor: " + interceptor.getName();//获取interceptor的名字
                UtilTimerStack.push(interceptorMsg);
                try {
                        //得到Interceptor实例,然后在调用该实例的intercept方法,DefaultActionInvocation自己作参数
                        resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
                        }
                finally {
                    UtilTimerStack.pop(interceptorMsg);
                }
            } else {//如果interceptors中没有了IntercetorMapping,说明所有的interceptor都调用完了。
                //当调用完所有的interceptor之后,再调用action,在里面使用了反射调用了action中的方法
                resultCode = invokeActionOnly();
            }

            // this is needed because the result will be executed, then control will return to the Interceptor, which will
            // return above and flow through again
            if (!executed) {
                if (preResultListeners != null) {
                    for (Object preResultListener : preResultListeners) {
                        PreResultListener listener = (PreResultListener) preResultListener;

                        String _profileKey = "preResultListener: ";
                        try {
                            UtilTimerStack.push(_profileKey);
                            listener.beforeResult(this, resultCode);
                        }
                        finally {
                            UtilTimerStack.pop(_profileKey);
                        }
                    }
                }

                // now execute the result, if we're supposed to
                if (proxy.getExecuteResult()) {
                    executeResult();
                }

                executed = true;
            }

            return resultCode;
        }
        finally {
            UtilTimerStack.pop(profileKey);
        }
    }

 3.随便找一个interceptor的,这个以ExceptionMappingInterceptor为例,查看其中的部分源码:

 public String intercept(ActionInvocation invocation) throws Exception {
        String result;

        try {
            //调用DefaultActionInvocation的invoke方法
            result = invocation.invoke();
        } catch (Exception e) {
            if (isLogEnabled()) {
                handleLogging(e);
            }
			//获取struts.xml配置文件中配置的Exception Mapping,返回的是一个List
            List<ExceptionMappingConfig> exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
			//在集合List中是否存在action抛出这个异常,如果存在,返回Exception Mapping 对应result
            String mappedResult = this.findResultFromExceptions(exceptionMappings, e);
            if (mappedResult != null) {//看result是否为null
                result = mappedResult;
                publishException(invocation, new ExceptionHolder(e));//把异常的信息放入Value Stack中
            } else {
                throw e;
            }
        }

        return result;
    }

 

②.在DefaultActionInvocation中设置一个端点,在debug视图(显示方法执行流)查看详细的调用流程图

A.设置端点的位置如下:


 B.查看debug视图:


 从上的debug视图,我们可以看到详细的方法调用过程

 

  • 大小: 11.5 KB
  • 大小: 31.3 KB
  • 大小: 27.8 KB
分享到:
评论

相关推荐

    STRUTS2源码解析

    STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析STRUTS2源码解析...

    struts2源码解析.pdf

    在"struts2源码解析.pdf"文档中,主要探讨了以下几个关键组件及其功能: 1. **ActionContext**: - `ActionContext`是Struts2的核心上下文,它存储了与当前Action执行相关的所有信息,如请求参数、session数据等。...

    Struts2源码分析

    配置相关的类位于`org.apache.struts2.config`包,这里包含读取和解析XML及properties文件的类。`org.apache.struts2.interceptor`包定义了内置的拦截器,例如身份验证、异常处理等,开发者可以根据需要自定义拦截器...

    struts2源码分析

    struts2源码详细解析51CTO下载-struts2源代码分析(个人觉得非常经典)

    Struts1源码解析

    本文将深入解析Struts1的源码,以帮助理解其内部工作原理。 首先,我们从ActionServlet的生命周期开始。ActionServlet是Struts1的核心组件,它的生命周期分为初始化、拦截请求和销毁三个阶段。在初始化阶段,`init...

    struts2 源码分析

    Struts2 源码分析 Struts2 是一个基于MVC 模式的Web 应用程序框架,它的源码分析可以帮助我们更好地理解框架的内部机制和工作流程。下面是Struts2 源码分析的相关知识点: 1. Struts2 架构图 Struts2 的架构图...

    struts2源码解析,个人感觉很不错

    ### Struts2源码解析及工作原理 #### Struts2简介 Struts2是一个流行的Java Web应用程序框架,它继承和发展了Struts1.x的一些特性,同时又采用了WebWork框架的核心技术,使得Struts2在设计理念和技术实现上都有了...

    struts2 源码解读

    总的来说,这篇“Struts2源码解读”的博文应该是对Struts2核心机制进行了详细的解析,包括Action、Interceptor、Result等关键组件的工作原理,以及整个请求处理流程。通过学习这些内容,开发者可以深化对Struts2的...

    Struts2源码阅读

    4. `ConfigurationProvider`和`Configuration`:`ConfigurationProvider`解析Struts2的配置文件,如`struts.xml`。默认实现`XmlConfigurationProvider`和`StrutsXmlConfigurationProvider`负责读取和解析这些配置。 ...

    struts2源码分析总结

    在`Dispatcher`的初始化过程中,它会读取`web.xml`或其他配置文件,解析Struts2的配置信息,如Action、结果类型、拦截器等。这些配置信息被加载到内存中的容器中,供后续请求处理时使用。`Dispatcher`还负责初始化...

    struts2源码解析

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品. 文档中对于代码进行重要部分...

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

    - `org.apache.struts2.config`: 配置处理相关的类,如StrutsConfig、PackageConfig等,用于解析和管理应用的配置信息。 - `org.apache.struts2.interceptor`: 包含各种内置拦截器,如DebuggingInterceptor、...

    struts2源码解析[归纳].pdf

    这份"struts2源码解析[归纳].pdf"文档显然深入探讨了Struts2的核心组件和工作原理。以下是对其中提到的关键概念的详细解释: 1. **ActionContext**: ActionContext是Struts2中一个非常重要的类,它封装了当前请求...

    Struts 2的源码

    通过对`org`目录下源码的分析,我们可以看到Struts 2的内部工作机制,包括Action的执行流程、拦截器链的构建、配置解析的过程等,这有助于我们更好地优化和调试基于Struts 2的应用程序。同时,对于想要为Struts 2...

    struts2深入详解源码1-5章

    本资料包包含的是《Struts2深入详解》一书的源码分析,涵盖了从第一章到第五章的内容,并附带了相关的jar包,方便读者结合理论与实践进行学习。 首先,让我们从第一章开始,Struts2的基础知识。这一章通常会介绍...

    struts2中的OGNL的源码

    通过深入学习OGNL的源码,开发者可以更好地定制和优化Struts2应用,提升性能,增强安全性,并能解决遇到的特定问题。这是一项值得投入时间和精力的任务,特别是对于那些希望在Web开发领域有深入理解的人来说。

    Struts2源代码与源码解析文档

    Struts2的源码解析文档通常会涵盖以下几个核心部分: 1. **FilterDispatcher**:这是Struts2框架的入口点,负责拦截HTTP请求并根据配置将请求转发到相应的Action。源码分析会解释其如何处理请求、如何查找Action及...

    struts2源码

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

    Struts2源码

    通过对Struts2源码的学习,我们可以更深入地理解MVC模式在实际应用中的实现,了解如何设计可扩展和可维护的框架。同时,也能帮助我们更好地调试和优化应用程序,提升开发效率。在研究struts-2.2.1.1 src这个源码包时...

    struts2部分源码分析

    本篇文章将深入探讨Struts2的运行原理,通过源码分析来揭示其内部工作机制。 首先,我们从核心组件开始。Struts2的核心组件包括Action、FilterDispatcher、Interceptor和Result。Action是业务逻辑的载体,它接收...

Global site tag (gtag.js) - Google Analytics