Struts2的运行流程

1、ActionProxy是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法,上图中的StrutsActionProxy类实现类ActionProxy代理类。

2、ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。

Params拦截器

  1. <interceptor-stack name="defaultStack">
  2. <interceptor-ref name="exception"/>
  3. <interceptor-ref name="alias"/>
  4. <interceptor-ref name="servletConfig"/>
  5. <interceptor-ref name="i18n"/>
  6. <interceptor-ref name="prepare"/>
  7. <interceptor-ref name="chain"/>
  8. <interceptor-ref name="scopedModelDriven"/>
  9. <interceptor-ref name="modelDriven"/>
  10. <interceptor-ref name="fileUpload"/>
  11. <interceptor-ref name="checkbox"/>
  12. <interceptor-ref name="multiselect"/>
  13. <interceptor-ref name="staticParams"/>
  14. <interceptor-ref name="actionMappingParams"/>
  15. <interceptor-ref name="params">
  16. <param name="excludeParams">^action:.*,^method:.*</param>
  17. </interceptor-ref>
  18. <interceptor-ref name="conversionError"/>
  19. <interceptor-ref name="validation">
  20. <param name="excludeMethods">input,back,cancel,browse</param>
  21. </interceptor-ref>
  22. <interceptor-ref name="workflow">
  23. <param name="excludeMethods">input,back,cancel,browse</param>
  24. </interceptor-ref>
  25. <interceptor-ref name="debugging"/>
  26. <interceptor-ref name="deprecation"/>
  27. </interceptor-stack>

Params拦截器是struts2默认的拦截器之一,其作用如下:

Parameters 拦截器将把表单字段映射到ValueStack栈的栈顶对象的各个属性中.如果某个字段在模型里没有匹配的属性,Param拦截器将尝试ValueStack栈中的下一个对象

ModelDriven拦截器

ModelDrivenInterceptor 的interceptor()  方法:

  1. public String intercept(ActionInvocation invocation)
  2. throws Exception
  3. {
  4. //获取action对象
  5.  Object action = invocation.getAction();
  6. //检查是否实现了ModelDriven接口
  7. if ((action instanceof ModelDriven)) {
  8. ModelDriven modelDriven = (ModelDriven)action;
  9. //取值栈
  10.  ValueStack stack = invocation.getStack();
  11. //获取Action中的成员变量对象
  12.  Object model = modelDriven.getModel();
  13. if (model != null) {
  14. //压入值栈栈顶
  15. stack.push(model);
  16. }
  17. if (refreshModelBeforeResult) {
  18. invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
  19. }
  20. }
  21. //执行下一个拦截器操作
  22.  return invocation.invoke();
  23. }
1、在使用Struts作为前端的企业级应用程序时把Action和
Model 清晰地隔离开是有必要的:有些Action
类不代表任何Model对象,它们的功能仅限于提供视图服务

2、当用户触发
add 请求时,ModelDriven拦截器将调用EmployeeAction对象的getModel()方法,
并把返回的模型(Employee实例)压入到ValueStack栈.

3、接下来Parameters拦截器将把表单字段映射到ValueStack栈的栈顶对象的各个属性中.因为此时ValueStack栈的栈顶元素是刚被压入的模型(Employee)对象,所以该模型将被填充.如果某个字段在模型里没有匹配的属性,Param拦截器将尝试ValueStack栈中的下一个对象

总结:通过上述的2个拦截器,可以看出为什么Action实现ModelDriven接口之后,在Action中可以直接使用成员对象变量来接受前台提交来的属性值。

Prepare拦截器

1、Struts 2.0
中的 modelDriven拦截器负责把
Action 类以外的一个对象压入到值栈栈顶
2、而prepare拦截器负责准备为getModel()
方法准备 model

PrepareInterceptor拦截器用法

1、若 Action
实现 Preparable接口,则
Action 方法需实现
prepare() 方法

2、PrepareInterceptor拦截器将调用 prepare()
方法,prepareActionMethodName()方法【比如 prepareSave()------action中有一个方法名为save】 或
prepareDoActionMethodName ()方法 ]
3、PrepareInterceptor拦截器根据
firstCallPrepareDo 属性决定获取prepareActionMethodName、prepareDoActionMethodName的顺序。默认情况下先获取
prepareActionMethodName (),
如果没有该方法,就寻找prepareDoActionMethodName()。如果找到对应的方法就调用该方法
4、PrepareInterceptor拦截器会根据
alwaysInvokePrepare属性决定是否执行prepare()方法

paramsPrepareParamsStack拦截器栈

1、paramsPrepareParamsStack从字面上理解来说, 这个stack的拦截器调用的顺序为:首先
params,然后
prepare,接下来
modelDriven,最后再
params
2、Struts 2.0的设计上要求
modelDriven在
params之前调用,而业务中prepare要负责准备model,准备model又需要参数,这就需要在
prepare之前运行params拦截器设置相关参数,这个也就是创建paramsPrepareParamsStack的原因。
3、流程如下:
–1.params拦截器首先给action中的相关参数赋值,如id
–2.prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象
–3.modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的
–4.params拦截器再将参数赋值给model对象
–5.action的业务逻辑执行
  1. <interceptor-stack name="paramsPrepareParamsStack">
  2. <interceptor-ref name="exception"/>
  3. <interceptor-ref name="alias"/>
  4. <interceptor-ref name="i18n"/>
  5. <interceptor-ref name="checkbox"/>
  6. <interceptor-ref name="multiselect"/>
  7. <interceptor-ref name="params">
  8. <param name="excludeParams">^action:.*,^method:.*</param>
  9. </interceptor-ref>
  10. <interceptor-ref name="servletConfig"/>
  11. <interceptor-ref name="prepare"/>
  12. <interceptor-ref name="chain"/>
  13. <interceptor-ref name="modelDriven"/>
  14. <interceptor-ref name="fileUpload"/>
  15. <interceptor-ref name="staticParams"/>
  16. <interceptor-ref name="actionMappingParams"/>
  17. <interceptor-ref name="params">
  18. <param name="excludeParams">^action:.*,^method:.*</param>
  19. </interceptor-ref>
  20. <interceptor-ref name="conversionError"/>
  21. <interceptor-ref name="validation">
  22. <param name="excludeMethods">input,back,cancel,browse</param>
  23. </interceptor-ref>
  24. <interceptor-ref name="workflow">
  25. <param name="excludeMethods">input,back,cancel,browse</param>
  26. </interceptor-ref>
  27. </interceptor-stack>

Struts2的运行流程以及关键拦截器介绍的更多相关文章

  1. Struts2.0 封装请求数据和拦截器介绍

    1. Struts2 框架中使用 Servlet 的 API 来操作数据 1.1 完全解耦合的方式 Struts2 框架中提供了一个 ActionContext 类,该类中提供了一些方法: stati ...

  2. struts2.1.6教程五、拦截器

    在前面我们已经初步使用过拦截器,下面继续细细探讨. 1.概述strust2中的拦截器 拦截器是Struts2框架的核心,它主要完成解析请求参数.将请求参数赋值给Action属性.执行数据校验.文件上传 ...

  3. Struts2拦截器介绍

    一.拦截器简介 Struts拦截器和Action的关系如图: 为了在使用拦截器时制定参数值,应通过<interceptor-ref -/>元素添加<param -/>子元素来为 ...

  4. [ SSH框架 ] Struts2框架学习之四(自定义拦截器)

    一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...

  5. struts2框架学习笔记6:拦截器

    拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocati ...

  6. 【struts2】Struts2的运行流程

    1)前提条件 在讲解流程之前,假设我们已经建立了的一个名为strutsDeepen的web工程,该工程仅仅实现了简单的用户登陆与欢迎界面.具体的实现为: 在web.xml中配置了Struts2的过滤器 ...

  7. Struts2学习笔记四:深入拦截器

    一:拦截器的工作原理 拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回res ...

  8. 使用Struts2实现图片上传和拦截器

    今天来分享一个图片上传 现在很多小项目里面基本上都有要显示图片的功能,所以呢图片上传是基本要掌握的啦 一般的图片上传原理就是从本地选择一张图片然后通过io流发布到服务器上去 上传方案基本有三种: 1. ...

  9. struts2学习笔记(六)—— 拦截器

    一.拦截器概述 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作.拦截器是AOP的一种实现策略. 在We ...

随机推荐

  1. C#基础(三)

    运算符 分类 符号 解释 优先级 算数 ++,—— 加加,减减 由高到低,即执行顺序由上到下(圆括号优先级最高) * /% 乘 除 取余 + - 加 减 关系 关系和逻辑运算符永远是布尔型 >  ...

  2. Lotus Notes中编程发送邮件(二)

    在编程发送各种类似通知的邮件时,时常会需要发件人显示为某个特定的帐户,比如某个部门的名称或者管理员的名字.另一种需求是,用户收到某封邮件后,回复邮件的地址不同于发件人栏显示的地址.而正常情况下,发送邮 ...

  3. struct inode 和 struct file

    1.struct inode──字符设备驱动相关的重要结构介绍 内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符.Linux2.6.27内核中,inode结构体具体定义如下: ...

  4. ASCII码常用值

    大写字母 A~Z 65~90 小写字母a~z 97~122 数字0~9 48~ 57

  5. malloc、free的使用

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

  6. Java [Leetcode 102]Binary Tree Level Order Traversal

    题目描述: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ...

  7. DirectShow建立一个视频捕捉程序

    DirectShow 提供了用应用程序从适当的硬件中捕捉和预览音/视频的能力.数据源包括:VCR,camera,TV tuner,microphone,或其他的数据源.一个应用程序可以立刻显示捕捉的数 ...

  8. 【转】pdf 中如何把几页缩小成一页打印

    我用的是Foxit PDF Reader,可以这样设置:文件-打印-打印处理下的页面排列选择“在每张纸上放置多页”-选择每页版数即可. 如果你用的是Adobe Reader,也可以自己找一下,看是否有 ...

  9. Ant编译和部署java web项目

    1.在myeclipse中创建javaWeb项目AntDemo 2.将build.xml放到AntDemo根目录下 3.修改build.xml中的Project name,工程目录名,工程名,还有to ...

  10. link 参数

    -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possi ...