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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值