<default-interceptor-ref name="basicStack"/>Starting Struts2-Core Components(3)
<default-interceptor-ref name="basicStack"/>
所以在配置实始拦截器和拦截器栈的时候,保证配置所有的拦截器和拦截器栈的名称唯一是非常重要的.
Implementing Interceptors
在你的应用中使用自定义的拦截器为应用提供cross-cutting特征是一个非常好的方式.只需要实现来自XWork框架的一个简单的接口.它只有3个方法:

public interface Interceptor extends Serializable
{2
void destroy();3
void init();4
String intercept(ActionInvocation invocation) throws Exception;5
}
事实上,如果实始化和清除方法不是必需的,可以替代成扩展AbstractInterceptor类.这个类为"destroy"和"init"方法提供了默认的空实现.
ActionInvocation对象提供了对运行环境的访问.它允许访问Action本身,context(对于一个WEB应用,包含请求参数,session参数等),action执行的结果和调用action的方法,并确定action是否已经被调用.
我们已经知道如何来配置拦截器了,配置自定义拦截的方式完全相同.如果你创建了你自己的拦截器,你将同样会考虑创建自定义的拦截器栈.这样你将确认你的应用保持一致,新的拦截器可以处理所有需要他的actions.
Value Stack / OGNL
这个部分包括相关紧密地的二个概念.值栈正确的说应该是栈对象.OGNL则是Object Graph Navigational Language的缩写,提供在值栈里标准的访问对象的方式.
值栈由下面罗列的对像组成:
1.Temporary Objects-在执行期间创建临时对象,并将其放入值栈;一个例子是将当前集合中迭代的值循环的放到JSP标签中
2.The Model Object-如果模型对象正在使用,那么当前模型在action之前放入值栈
3.The Action Object-正在被执行的Action
4.Named Objects-这些对象包括#application,#session,#request,#attr和#parameters还有相应的Servlet范围
访问值栈可以通过许多不同的方式完成.大多数常用的方式是通过JSP提供的标签,Velocity和Freemarker.HTML标签一般被用于访问值栈中对象的属性;控制标签(像if, elseif和iterator)用于表达式;数据标签可以操作栈本身(通过set和push).
在使用值栈的时候,不需要知道目标对象存在于哪个范围之内.如果你想取属性"name"的值,你可以向值栈查询这个属性.每个栈元素,按照提供的顺序,被询问它是否存在property.如果存在,则返回这个值.如果不存在,则下一个元素会被查询.这将继续一直到栈里的元素全被查询.这是一个非常好的特征,你不需要知道这个值是哪里的-action,model或是HTTP请求-你只需要知道如果这个值存在,它就将被返回.
这是downside.如果property是常用的(例如"id"),而且你想从特定的对象(比方说action)取值,也就是说不是值栈中第一个遇到这个property的对象,返回的值可能与你的预期值不同.想要返回一个"id"的值,但它可能来自于JSP标签,临时对象,或是来自模型对象.OGNL正好有一种访问对象的属性的方法,我们可以在这里使用对我们有利的.如果我们知道栈在action中的深度,我们可以使用"[2].id"来替换"id".
事实上,OGNL是一种非常有特色的表达式语言.使用圆点符号对对象进行导航(例如,使用表达式"person.address"来替代"getPerson().getAddress()"),OGNL支持的特征如类型转换,方法调用,集合的处理和创建,projection across ollections,表达式赋值和lambda表达式.完整的语言指南可以查看http://www.ognl.org/2.6.9/Documentation/html/LanguageGuide/index.html.
Result Types
到目前为止,我们只展示了配置Action的结果通过JSP渲染呈递给用户.这是一个方案,但却不是唯一的.事实上,Struts2支持多种类型的结果.它们可以是可视的,或是可以与环境交互.
为action执行的结果配置一个指定的类型,将使用"type"属性.如果没有应用这个属性,默认的"dispatcher"类型将被使用-这将呈递一个JSP的结果.如何配置action看起来像下面这样:
<action name="my" class="com.fdar.infoq.MyAction" >2
<result type="dispatcher">view.jsp</result>3
</action>
Configuration
结果类型配置在<package ... />标签内.这个配置与拦截器的配置相似.一个"name"属性提供了一个结果类型的唯一标识,并且"class"标签提供实现类.这还有第三个属性"default"-这允许修改默认的结果类型.如果一个WEB应用基于Velocity而不是JSP,修改默认的将比输入配置信息省时.

