Struts2 官方教程:介绍拦截器

介绍

到目前,教程还未探究Struts2 框架的内部工作。但本篇教程会介绍Struts2框架进行大部分工作所要依赖的关键类集合,无论一个动作何时被执行。本篇教程的示例项目有一个注册链接,映射在Struts XML peizhi wenjian (struts.xml)来执行Register类的execute方法。在execute方法被调用前,很多工作由struts2框架在幕后被完成了。例如:
1.处理任何生成的异常
2.将字符串请求参数转化为Register类名字与值对应的实例域
3.调用validate方法,同时/或者调用外部的XML验证。
在execute方法完成后,更多的工作要进行:
1.处理任何生成的异常
2.将Register类的实例域转化为字符串值用于在页面中显示
3.依赖于被execute方法返回的结果字符串,推送正确的页面。
以上任务列表并不完整——一些另外的任务在动作执行之前或之后被进行。
使用Struts2的好处是,这些所有工作都自动地搞定了。读者可以专注于控制器(Struts2 ActionSupport 类)的逻辑,业务层,数据访问层,读者的域模型等等。

拦截器

被Struts2框架在动作执行之前和之后被完成的任务,具体是由Struts2的拦截器搞定的。拦截器是包含在struts2的core jar包中标准的Java类,以特定顺序执行。
在这里的示例应用中,struts.xml有一个package结点。package结点有一个extends属性,取值为“struts-default”。取值“struts-default”指示框架:对于在这个package中的动作,特定的拦截器栈会在动作执行前后被执行。
如果读者希望学习更多关于拦截器的内部工作机制,请访问搞懂拦截器
有时候,Struts2的默认拦截器栈并不是读者对于某个特定动作所需要的。读者可能希望使用并非Struts2默认拦截器栈的拦截器。对于单个动作或者对于所有包中的动作,读者可以指定一个不同的拦截器栈,让动作或整个包使用。下面是如何指定让register动作在使用默认栈提供的拦截器之外,还要使用logger和timer拦截器。

为一个动作指定特定的拦截器组

<action name="register" class="org.apache.struts.register.action.Register" methed="execute">
    <interceptor-ref name="timer" />
    <interceptor-ref name="logger" />
    <interceptor-ref name="defaultStack" >
        <param name="exception.logEnabled">true</param>
        <param name="exception.logLevel">ERROR</param>
    </interceptor-ref>
    <result name="success">thankyou.jsp</result>
    <result name="input">register.jsp</result>
</action>

logger拦截器记录了动作执行的开始和结束。timer拦截器记录了动作执行的持续时间(单位为毫秒)。这两个拦截器一起使用可以向开发者提供有用的反馈。
在上面的示例代码,注意三个 interceptor-ref结点。每个都有name属性的取值。对于register动作,我们指示框架来使用timer,logger,以及defaultStack拦截器。defaultStack拦截器是所有为任何动作都执行的拦截器。
作者是如何知道,timer的name属性取值,或者如何知道存在个timer拦截器?在Struts2文档的拦截器们页面,有Struts2框架附带的拦截器列表,以及每个拦截器的name取值。
作者如何知道,timer拦截器并不是defaultStack拦截器的一部分?上面的页面里也提供了属于defaultStack的拦截器列表。
注意上面的param结点。这些结点用来向的Exception InterceptorsetLogEnabled和setLogLevel方法提供值。提供true或者ERROR取值,会让Struts2框架记录任何不被应用代码所捕获的异常,并且将这些异常记录为ERROR级别。

运行示例

对示例应用,跟随RADME介绍,构建、配置、运行。查看送到JVM控制台的输出,由logger和timer拦截器生成的信息。读者应当能看到类似下面这样的信息:

INFO: Starting execution stack for action //register
Nov 20, 2010 9:55:48 AM com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
INFO: Finishing execution stack for action //register
Nov 20, 2010 9:55:48 AM com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
INFO: Executed action /register!execute took 177 ms.

如果读者希望让logger和timer拦截器对一个包之中的所有动作都执行,应当使用下面这个struts.xml:

为一个包指定特定拦截器

<package name="basicstgruts2" extends="struts-default">
    <interceptors>
        <interceptor-stack name="appDefault">
            <interceptor-ref name="timer"/>
            <interceptor-ref name="logger"/>
            <interceptor-ref name="defaultStack" />
        </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="appDefault" />
</package>

在以上代码中,使用了interceptors结点来定义一个新的拦截器栈,包含了timer,logger,以及defaultStack拦截器们。我们给这个新的拦截器栈定义的名字是“appDefault”。随后,使用default-interceptor-ref结点来为在package结点中的所有动作,指定appDefault这个拦截器栈将被使用。那么,timer和logger拦截器会对这个包中的所有动作都执行。
注意,在这里和前文的示例中,都执行了所有包含在defaultStack中的拦截器,作为interceptor-ref其中一个结点。当用户指定希望对一个动作或一个包生效的拦截器,那么只有这些拦截器被执行。所以如果在示例中我们在interceptor-ref中忽略了defaultStack,那么只有logger和timer拦截器会被执行。

创建自己的拦截器

读者除了指定自己的拦截器栈,也可以书写自己的新拦截器,并且将其添加到被执行的栈中。Struts的编写拦截器解释了如何做到这一点。例如,可以创建自己的拦截器来控制认证和权限。

总结

拦截器给Struts2框架提供了威力与灵活性。当一个动作类被调用时,开发者可能添加额外的拦截器到被执行的拦截器栈。

猜你喜欢

转载自blog.csdn.net/u010930289/article/details/77415655