Action的五大元素
在大概了解了Struts2的Action后,我们来重点研究一下在Struts2的Action周围,为Action进行服务的一些重要元素,这些元素将涵盖Action的数据环境,Action的执行环境、Action的调度者、Action的层次结构和Action的执行结果。
ActionContext —— 数据环境
之前我们提到了Struts2的Action并不是一个Servlet,它是脱离了Web容器的。但是对于一个Web框架来说,所有的数据请求(Request)和数据返回(Response)都来源于Web容器,那么Action在执行的时候,如何去获取这些数据呢?
这个问题的答案就在于,我们需要为每个Action准备一个数据环境,这个数据环境被称之为:ActionContext。由于Action是应对于一个又一个的URL请求,所以ActionContext应该具备以下的特性:
1. ActionContext应成为Action与Web容器之间的桥梁
2. ActionContext中应该保存有针对某个请求的详细信息
3. ActionContext应该是一个线程安全的类对象
Interceptor —— 丰富的层次结构
简单回顾一下上面所提到的Action的职责,我们看到,需要在Action这个层面上完成的事情还不少。而完成这些职责,就需要我们对这些职责进行合理的分类和排序,将他们组织成有序的执行队列。在Struts2中,使用了一种类似责任链的设计模式对这些不同的职责进行分类并串联起来,从而使得Action层具备了丰富的层次结构。而在这个执行队列中的每个元素,就被我们称之为Interceptor,也就是拦截器.
Struts2 Reference 写道
Interceptors can execute code before and after an Action is invoked.
拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用。正如上面Struts2的Reference中讲述的,Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或者之后执行拦截器的代码。
如果仔细留意一下Action LifeCycle图中的Interceptor和Action的部分,我们可以看到,Interceptor一层一层的把Action包了起来。这是一个典型的堆栈结构,在代码执行的时候,每个Interceptor不仅需要文成它自身的逻辑,还通过递归调用负责下一个拦截器或Action的调用。
Struts2 Reference 写道
Most of the framework's core functionality is implemented as Interceptors. Features like double-submit guards, type conversion, object population, validation, file upload, page preparation, and more, are all implemented with the help of Interceptors. Each and every Interceptor is pluggable, so you can decide exactly which features an Action needs to support.
也正如Struts2的Reference所说,Struts2提供的绝大多数的功能支持,都通过Interceptor来实现,这些Interceptor可以随意进行配置,并且能够方便的插入到程序中去运行。
Result —— 执行结果
有执行就必然有执行的结果。在Struts2中,Action的执行结果被抽象成了一个层次。在这个层次中,可以定义任意类型的View层的结构。也就是说,Struts2并不强制View层的表现形式,可以是JSP、Freemarker模板、二进制流输出等等。
Struts2把执行结果抽象成一个层次,使得你可以不再关注许多视图整合上面的细节,只需要考虑视图的类型和数据的准备,这样,你也可以不必在沉浸在杂乱的构造视图的代码中。
ActionProxy —— 执行环境
有了拦截器Interceptor,有了Action本身,也有了Action的执行结果Result,我们就需要一个类似调度器的产品,将这些元素整合起来,进行调度执行。在上面的Action Lifecyle的图中,我们可以看到,Interceptor、Action和Result都处于ActionProxy中,所以ActionProxy就成为了所有这些元素的执行环境。
既然是执行环境,那么ActionProxy就需要提供Action执行的时候一切所需要的配置、参数等等,当然,也要有进行Action调用的入口
ActionInvocation —— 调度者
在上面的ActionProxy的接口定义中,我们可以看到有一个比较特殊的变量:ActionInvocation比较吸引我们的眼球。从字面上去理解,ActionInvocation就是Action的调用者。事实上也是如此,ActionInvocation在这个Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。
在之后的章节中,这个ActionInvocation类也将成为我们解读Struts2源码的一个重要入手点。这个类将告诉你,Struts2是如何通过ActionInvocation来实现对Interceptor、Action和Result的合理调度的。
分享到:
相关推荐
- **结果**:`result`元素用于定义Action执行成功后转向的目标页面,本例中为`/next.jsp`。 2. **创建对应的Action文件** - 按照传统Struts框架的做法,在项目的`webRoot`目录下创建一个名为`go.action`的空文件...
在本章"JMX IN ACTION(五)"中,我们将探讨如何使用动态MBean(Dynamic MBean)来管理那些经常变化或具有不确定接口的资源。动态MBean是针对那些管理接口需要在运行时自定义和调整的情况的理想选择。与标准MBean不同...
JavaAction可以使用`capture-output`元素将值反向传播到Oozie上下文中,这些值随后可以通过EL函数访问。这些值需要按照Java属性格式文件输出,文件名通过`JavaMainMapper.OOZIE_JAVA_MAIN_CAPTURE_OUTPUT_FILE`常量...
1. **单一Action处理多个业务**:在一个Action类中定义多个方法,每个方法对应一个业务,然后在struts-config.xml配置文件中为每个方法指定不同的`<action>`元素。请求参数可以用来区分调用哪个方法。 2. **使用...
9. **辅助方法(Assistants)**:ASP.NET MVC4提供了一系列内置的辅助方法,简化了HTML元素的生成,如`Html.BeginForm()`,`Html.TextBoxFor()`等。 10. **测试友好**:由于MVC架构的解耦特性,单元测试和集成测试变...
#### 三、Action的五大核心元素 1. **Action接口**:这是所有Action类都需要实现的接口,它定义了Action的基本行为。 2. **ActionProxy**:它是Action的代理,负责管理Action实例、配置以及执行过程中的状态。 3. *...
五、字体工具与Action 1. 字库软件:例如Adobe Typekit或Google Fonts,提供了丰富的字体资源,设计师可以根据需求选择适合表达“Action”的字体。 2. 字体制作工具:如FontStruct或Glyphr Studio,允许设计师...
1. **输入数据**:用户提交的数据可以通过Action类的方法参数接收,也可以通过表单元素获取。 2. **输出数据**:处理完数据后,可以将其保存到请求作用域中,然后通过转发或重定向的方式呈现给用户。 #### 五、...
在实际应用中,Action List可以通过XML文件或者编程的方式定义,通常会包含以下元素: - **Caption**: 显示在用户界面上的文本。 - **Category**: 对Action进行分类。 - **Checked**: 指示Action是否被选中。 - **...
这样,当用户与这些元素交互时,相应的Action Script代码会被执行。 3. 编写滚动逻辑: Action Script中,你可以创建自定义的类来管理滚动条的行为。例如,定义滑块位置的计算方法,根据内容的大小调整滚动条的...
#### 五、示例代码分析 在给定的示例代码中,首先定义了一个全局变量`form`来引用页面上的第一个表单对象。在`init()`函数中,设置了该表单的`name`、`method`和`action`属性。当用户点击“表单属性”按钮时,触发`...
知识点五:Unity的环境配置与开发工具 Unity提供了强大的编辑器,配合Visual Studio等集成开发环境(IDE)进行代码编写,使得游戏开发过程更加高效。本书会教授如何配置Unity开发环境,使用各种工具和资源来辅助游戏...
### Jquery in Action中文版知识点概述 #### 一、jQuery简介 - **定义与起源**:jQuery是一款轻量级的JavaScript库,它极大地简化了HTML文档遍历、事件处理、动画以及Ajax交互等操作。由John Resig在2006年撰写,...
这种特性极大地提高了开发效率并减少了出错的机会。 #### 七、指令系统 指令是AngularJS中最强大的特性之一,它允许开发者通过简单的HTML标签或属性来控制DOM元素的行为。通过定义自定义指令,开发者可以轻松地扩展...
通过这些预设元素,开发者可以轻易调整地形、建筑、植被等,实现高度自定义的视觉体验。 二、角色与动画 角色是RPG游戏的核心,本套工具包包含了一系列的角色模型、纹理、以及各种动作动画,如行走、奔跑、攻击、...
在JSP页面中,我们可以使用Struts2的标签库(例如`s:textfield`, `s:checkbox`, `s:select`等)来创建表单元素,并将这些元素与Action的属性绑定。对于集合类型,我们通常会在JSP中通过迭代器遍历并生成多个表单...