一个请求在Struts2框架中的处理大概分为以下几个步骤: 
1.客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。 
2.请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher)。注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到FilterDispatcher。 
3.FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter

其代码如下:

Java代码
  1. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException ...{
  2. HttpServletRequest request = (HttpServletRequest) req;
  3. HttpServletResponse response = (HttpServletResponse) res;
  4. ServletContext servletContext = filterConfig.getServletContext();
  5. // 在这里处理了HttpServletRequest和HttpServletResponse。
  6. DispatcherUtils du = DispatcherUtils.getInstance();
  7. du.prepare(request, response);//正如这个方法名字一样进行locale、encoding以及特殊request parameters设置
  8. try ...{
  9. request = du.wrapRequest(request, servletContext);//对request进行包装
  10. } catch (IOException e) ...{
  11. String message = "Could not wrap servlet request with MultipartRequestWrapper!";
  12. LOG.error(message, e);
  13. throw new ServletException(message, e);
  14. }
  15. ActionMapperIF mapper = ActionMapperFactory.getMapper();//得到action的mapper
  16. ActionMapping mapping = mapper.getMapping(request);// 得到action 的 mapping
  17. if (mapping == null) ...{
  18. // there is no action in this request, should we look for a static resource?
  19. String resourcePath = RequestUtils.getServletPath(request);
  20. if ("".equals(resourcePath) && null != request.getPathInfo()) ...{
  21. resourcePath = request.getPathInfo();
  22. }
  23. if ("true".equals(Configuration.get(WebWorkConstants.WEBWORK_SERVE_STATIC_CONTENT))
  24. && resourcePath.startsWith("/webwork")) ...{
  25. String name = resourcePath.substring("/webwork".length());
  26. findStaticResource(name, response);
  27. } else ...{
  28. // this is a normal request, let it pass through
  29. chain.doFilter(request, response);
  30. }
  31. // WW did its job here
  32. return;
  33. }
  34. Object o = null;
  35. try ...{
  36. //setupContainer(request);
  37. o = beforeActionInvocation(request, servletContext);
  38. //整个框架最最核心的方法,下面分析
  39. du.serviceAction(request, response, servletContext, mapping);
  40. } finally ...{
  41. afterActionInvocation(request, servletContext, o);
  42. ActionContext.setContext(null);
  43. }
  44. }
  45. du.serviceAction(request, response, servletContext, mapping);
  46. //这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
  47. public void serviceAction(HttpServletRequest request, HttpServletResponse response, String namespace, String actionName, Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap) ...{
  48. HashMap extraContext = createContextMap(requestMap, parameterMap, sessionMap, applicationMap, request, response, getServletConfig());  //实例化Map请求 ,询问ActionMapper是否需要调用某个Action来处理这个(request)请求
  49. extraContext.put(SERVLET_DISPATCHER, this);
  50. OgnlValueStack stack = (OgnlValueStack) request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY);
  51. if (stack != null) ...{
  52. extraContext.put(ActionContext.VALUE_STACK,new OgnlValueStack(stack));
  53. }
  54. try ...{
  55. ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext);
  56. //这里actionName是通过两道getActionName解析出来的, FilterDispatcher把请求的处理交给ActionProxy,下面是ServletDispatcher的 TODO:
  57. request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack());
  58. proxy.execute();
  59. //通过代理模式执行ActionProxy
  60. if (stack != null)...{
  61. request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,stack);
  62. }
  63. } catch (ConfigurationException e) ...{
  64. log.error("Could not find action", e);
  65. sendError(request, response, HttpServletResponse.SC_NOT_FOUND, e);
  66. } catch (Exception e) ...{
  67. log.error("Could not execute action", e);
  68. sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
  69. }
  70. }

4.FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。 
5.ActionProxy通过ConfigurationManager(struts.xml)询问框架的配置文件,找到需要调用的Action类. 
如上文的struts.xml配置

Java代码
  1. <?xml version="1.0" encoding="GBK"?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
  3. <struts>
  4. <include file="struts-default.xml"/>
  5. <package name="struts2" extends="struts-default">
  6. <action name="add"
  7. class="edisundong.AddAction" >
  8. <result>add.jsp</result>
  9. </action>
  10. </package>
  11. </struts>

如果提交请求的是add.action,那么找到的Action类就是edisundong.AddAction。 
6.ActionProxy创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor。(Interceptor是struts2另一个核心级的概念)

下面我们来看看ActionInvocation是如何工作的:

ActionInvocation 是Xworks 中Action 调度的核心。而对Interceptor的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口,而DefaultActionInvocation 则是Webwork对ActionInvocation的默认实现。

Interceptor 的调度流程大致如下: 
1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。 
2.通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。

Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。 
那么什么是拦截器。 
拦截器就是AOP(Aspect-OrientedProgramming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。) 
拦截器的例子这里就不展开了。 
struts-default.xml文件摘取的内容:

Java代码
  1. < interceptor name ="alias" class ="com.opensymphony.xwork2.interceptor.AliasInterceptor" />
  2. < interceptor name ="autowiring" class ="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor" />
  3. < interceptor name ="chain" class ="com.opensymphony.xwork2.interceptor.ChainingInterceptor" />
  4. < interceptor name ="conversionError" class ="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor" />
  5. < interceptor name ="createSession" class ="org.apache.struts2.interceptor.CreateSessionInterceptor" />
  6. < interceptor name ="debugging" class ="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
  7. < interceptor name ="external-ref" class ="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor" />
  8. < interceptor name ="execAndWait" class ="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor" />
  9. < interceptor name ="exception" class ="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
  10. < interceptor name ="fileUpload" class ="org.apache.struts2.interceptor.FileUploadInterceptor" />
  11. < interceptor name ="i18n" class ="com.opensymphony.xwork2.interceptor.I18nInterceptor" />
  12. < interceptor name ="logger" class ="com.opensymphony.xwork2.interceptor.LoggingInterceptor" />
  13. < interceptor name ="model-driven" class ="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
  14. < interceptor name ="scoped-model-driven" class ="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor" />
  15. < interceptor name ="params" class ="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
  16. < interceptor name ="prepare" class ="com.opensymphony.xwork2.interceptor.PrepareInterceptor" />
  17. < interceptor name ="static-params" class ="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
  18. < interceptor name ="scope" class ="org.apache.struts2.interceptor.ScopeInterceptor" />
  19. < interceptor name ="servlet-config" class ="org.apache.struts2.interceptor.ServletConfigInterceptor" />
  20. < interceptor name ="sessionAutowiring" class ="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor" />
  21. < interceptor name ="timer" class ="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
  22. < interceptor name ="token" class ="org.apache.struts2.interceptor.TokenInterceptor" />
  23. < interceptor name ="token-session" class ="org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
  24. < interceptor name ="validation" class ="com.opensymphony.xwork2.validator.ValidationInterceptor" />
  25. < interceptor name ="workflow" class ="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor" />
  26. < interceptor name ="store" class ="org.apache.struts2.interceptor.MessageStoreInterceptor" />
  27. < interceptor name ="checkbox" class ="org.apache.struts2.interceptor.CheckboxInterceptor" />
  28. < interceptor name ="profiling" class ="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />

7.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。如上文中将结构返回“add.jsp”,但大部分时候都是返回另外一个action,那么流程又得走一遍………

转载于:https://www.cnblogs.com/jiangu66/archive/2013/04/22/3036027.html

[置顶] java高级工程师-----struts的内部运行机制详解相关推荐

  1. Java垃圾回收(GC)机制详解

    Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...

  2. JavaScript 运行机制详解(理解同步、异步和事件循环)

    1.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...

  3. python语言程序的特点_Python语言概述及其运行机制详解

    即日起,我们将打开一个新的编程世界的大门--Python语言.Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新 ...

  4. Python语言概述及其运行机制详解

    即日起,我们将打开一个新的编程世界的大门--Python语言.Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新 ...

  5. SSL / TLS 协议运行机制详解

    转载自  SSL / TLS 协议运行机制详解 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想 ...

  6. android系统(63)---Jobscheduler运行机制详解

    android之Jobscheduler运行机制详解 如果想在将来达到一定条件下执行某项任务时,可以在一个实现了JobService的子类的onStartJob方法中执行这项任务,使用JobInfo的 ...

  7. 我看朴灵评注阮一峰的《JavaScript 运行机制详解:再谈Event Loop》

    阮一峰和朴灵对我来说都是大牛,他们俩的书我都买过,阮老师的译作<软件随想录>和朴灵的<深入浅出node.js>.这个事情已经过了4个月了,所以我拿来讲应该也没啥问题. 这件事情 ...

  8. 【大数据day14】——MapReduce的运行机制详解(案列:Reduce 端实现 JOIN, Map端实现 JOIN,求共同好友)

    文章目录 1 .MapReduce的运行机制详解 1.1:MapTask 工作机制 详细步骤 配置 1.2 :ReduceTask 工作机制 详细步骤 1.3:Shuffle 过程 2. 案例: Re ...

  9. MapTask运行机制详解以及Map任务的并行度,ReduceTask 工作机制以及reduceTask的并行度,MapReduce总体工作机制

    MapTask运行机制详解 整个Map阶段流程大体如图所示 简单概述 inputFile通过split被逻辑切分为多个split文件, 通过Record按行读取内容给map(用户自己实现的)进行处理, ...

  10. java 深拷贝_java 深拷贝与浅拷贝机制详解

    java 深拷贝与浅拷贝机制详解 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定 ...

最新文章

  1. Linux修改主机名的方法
  2. python雷达图详解_python的matplotlib---雷达图
  3. 三个最简单公式讲完卡尔曼滤波算法
  4. ads s参数拟合_ADS S参数仿真介绍
  5. dojo 九 effects dojo/_base/fx 和 dojo/fx
  6. 服务员就结账了的p8u8
  7. 解决Macbook网络连接成功但是图标一直显示正在查找网络问题
  8. 在Mac上使用Charles抓包总是unknown
  9. educoder 数据挖掘算法原理与实践:决策树
  10. SPSS调查问卷信度分析【011-2期】
  11. linux 文件擦除,[原创]在Linux下进行文件“粉碎”/擦除
  12. 财务管理系统如何帮助企业实现财务自动化管理?
  13. Android进程管理详解
  14. 如何在D盘以管理员身份,运行cmd
  15. 周易内核与计算机原理,周易原理之我说(一)
  16. B/S模式下的MVC架构迭代(2)
  17. python切割、拼接图片
  18. composer 安装 thinkphp
  19. 微软官方工具_微软官方免费数据恢复工具Windows File Recovery帮你恢复电脑误删文件...
  20. HorizontalScrollView 自动滑动

热门文章

  1. 在苹果Mac中如何将html网页转成PDF文件?
  2. Mac如何简单的翻录3D蓝光视频
  3. Android 图片处理方法大全
  4. 模拟tomcat连接器
  5. input输入框清除样式
  6. 设置 路由模式 桥接模式
  7. Android 5.1 Gallery2 模块编译不过解决办法
  8. Linux 抄袭 Unix ?今日终有定论!
  9. Chrome 上最必不可少的29 款插件,超级提高效率
  10. 再见了SpringMVC!这个框架有点厉害,甚至干掉了Servlet!