`

使用Struts2自带的拦截器

阅读更多

   首先,要跟大家道个歉,前一阵子为给客户个一个DEMO,忙得不可开交,所以很久没有更新Blog。提到这个DEMO我想顺便跟大家分享一下心得——如果大家希望快速开发,一个类似Struts 2这样的简单方便的WEB框架必不可少。我们在开发DEMO使用的还是Struts 1.2.8,而且没有不使用任何EL(表达式语言),导致页面出现无数类似

“<%= ((Integer) request.getAttribute("xx")).intValue()%6 %>”

的代码。Struts 1.x的Form Bean的麻烦使得有部分同事直接使用request.getParameter(String arg),继而引入另一种麻烦。诸如此类的问题,在DEMO这样时间紧迫的项目凸显了Struts 1.x对快速开发的无能为力。不过没办法,由于我们项目中的几个资深员工除了Struts 1.x外,对其它的WEB框架似乎不大感兴趣。

    言归正传,Interceptor(以下译为拦截器)是Struts 2的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化转换器校验等。

<script type="text/javascript"><!-- google_ad_client="pub-1832179689702023" ; google_ad_width="336; google_ad_height" = 280; google_ad_format="336x280_as" ; google_ad_type="text_image" ; //2007-01-10: 336_280 google_ad_channel="7111701428" ; google_color_border="FFFFFF" ; google_color_bg="FFFFFF" ; google_color_link="0000FF" ; google_color_text="000000" ; google_color_url="3D81EE" ; //--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>

 

<!--done-->
什么是拦截器

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

     在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

     谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

实现原理

     Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器,如图1所示。

图1 拦截器调用序列图
图1 拦截器调用序列图

已有的拦截器

    Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以到struts2-all-2.0.1.jar或struts2-core-2.0.1.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

在本文使用是Struts 2的最新发布版本2.0.1。需要下载的朋友请点击以下链接:
http://apache.justdn.org/struts/binaries/struts-2.0.1-all.zip

以下部分就是从struts-default.xml文件摘取的内容:

< interceptor name ="alias" class ="com.opensymphony.xwork2.interceptor.AliasInterceptor" />
< interceptor name ="autowiring" class ="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor" />
< interceptor name ="chain" class ="com.opensymphony.xwork2.interceptor.ChainingInterceptor" />
< interceptor name ="conversionError" class ="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor" />
< interceptor name ="createSession" class ="org.apache.struts2.interceptor.CreateSessionInterceptor" />
< interceptor name ="debugging" class ="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
< interceptor name ="external-ref" class ="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor" />
< interceptor name ="execAndWait" class ="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor" />
< interceptor name ="exception" class ="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
< interceptor name ="fileUpload" class ="org.apache.struts2.interceptor.FileUploadInterceptor" />
< interceptor name ="i18n" class ="com.opensymphony.xwork2.interceptor.I18nInterceptor" />
< interceptor name ="logger" class ="com.opensymphony.xwork2.interceptor.LoggingInterceptor" />
< interceptor name ="model-driven" class ="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
< interceptor name ="scoped-model-driven" class ="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor" />
< interceptor name ="params" class ="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
< interceptor name ="prepare" class ="com.opensymphony.xwork2.interceptor.PrepareInterceptor" />
< interceptor name ="static-params" class ="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
< interceptor name ="scope" class ="org.apache.struts2.interceptor.ScopeInterceptor" />
< interceptor name ="servlet-config" class ="org.apache.struts2.interceptor.ServletConfigInterceptor" />
< interceptor name ="sessionAutowiring" class ="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor" />
< interceptor name ="timer" class ="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
< interceptor name ="token" class ="org.apache.struts2.interceptor.TokenInterceptor" />
< interceptor name ="token-session" class ="org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
< interceptor name ="validation" class ="com.opensymphony.xwork2.validator.ValidationInterceptor" />
< interceptor name ="workflow" class ="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor" />
< interceptor name ="store" class ="org.apache.struts2.interceptor.MessageStoreInterceptor" />
< interceptor name ="checkbox" class ="org.apache.struts2.interceptor.CheckboxInterceptor" />
< interceptor name ="profiling" class ="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />

配置和使用拦截器

     在struts-default.xml中已经配置了以上的拦截器。如果您想要使用上述拦截器,只需要在应用程序struts.xml文件中通过“<include file="struts-default.xml" />”将struts-default.xml文件包含进来,并继承其中的struts-default包(package),最后在定义Action时,使用“<interceptor-ref name="xx" />”引用拦截器或拦截器栈(interceptor stack)。一旦您继承了struts-default包(package),所有Action都会调用拦截器栈 ——defaultStack。当然,在Action配置中加入“<interceptor-ref name="xx" />”可以覆盖defaultStack。

下面是关于拦截器timer使用的例子。首先,新建Action类tuotrial/TimerInterceptorAction.java,内容如下:

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

public class TimerInterceptorAction extends ActionSupport {
   @Override
   
public String execute() {
       
try {
           
// 模拟耗时的操作
           Thread.sleep( 500 );
       }
catch (Exception e) {
           e.printStackTrace();
       }

       
return SUCCESS;
   }

}

配置Action,名为Timer,配置文件如下:

<! DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"
>
< struts >
   
< include file ="struts-default.xml" />    
   
< package name ="InterceptorDemo" extends ="struts-default" >
       
< action name ="Timer" class ="tutorial.TimerInterceptorAction" >
           
< interceptor-ref name ="timer" />
           
< result > /Timer.jsp </ result >
       
</ action >
   
</ package >
</ struts >

至于Timer.jsp可以随意写些什么到里面。发布运行应用程序,在浏览器的地址栏键入http://localhost:8080/Struts2_Interceptor/Timer.action,在出现Timer.jsp页面后,查看服务器的后台输出。

2006 - 12 - 6 14 : 27 : 32 com.opensymphony.xwork2.interceptor.TimerInterceptor doLog
信息: Executed action
[ //Timer!execute ] took 2859 ms.

    在您的环境中执行Timer!execute的耗时,可能上述的时间有些不同,这取决于您PC的性能。但是无论如何,2859 ms与500 ms还是相差太远了。这是什么原因呢?其实原因是第一次加载Timer时,需要进行一定的初始工作。当你重新请求Timer.action时,以上输出会变为:

2006 - 12 - 6 14 : 29 : 18 com.opensymphony.xwork2.interceptor.TimerInterceptor doLog
信息: Executed action
[ //Timer!execute ] took 500 ms.

       OK,这正是我们期待的结果。上述例子演示了拦截器timer的用途——用于显示执行某个action方法的耗时,在我们做一个粗略的性能调试时,这相当有用。



々上善若水々 2007-11-24 07:47 发表评论
分享到:
评论

相关推荐

    struts2官方自带的四个例子

    拦截器是Struts2的核心组件之一,它们在Action执行前后执行自定义逻辑。Interceptor示例展示了如何创建和配置拦截器,如日志记录、权限检查等。通过拦截器,开发者可以实现跨Action的功能,如事务管理、性能监控等...

    对Struts2内建拦截器的知识总结以及将Struts的Jar包上传下

    这些功能可以通过编写自定义拦截器或者使用Struts2提供的内建拦截器实现。 Struts2内建拦截器包括: 1. **Params拦截器**:处理请求参数,将它们设置到Action上下文中,便于后续Action使用。 2. **Prepare拦截器**...

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_9_拦截器 共32页.pptx

    **知识点3:Struts2自带拦截器列表** | 序号 | 拦截器名称 | 功能描述 | |------|--------------|----------------------------------------------------------------------------------------------| | 1 | alias ...

    struts2所有jar以及自带实例项目

    5. **Value Stack**:Struts2使用Value Stack存储Action上下文中的数据。Action的属性可以直接放入Stack,然后在视图层(如JSP)中直接访问。 6. **FreeMarker或Velocity模板**:Struts2支持使用FreeMarker或...

    struts2讲义_吴峻申

    4.1 拦截器在Struts2中的缺省应用 47 4.2 拦截器原理实现 50 4.3 在Struts2中配置自定义的拦截器 53 4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的...

    Struts2入门教程(全新完整版)

    7.开启struts2自带的开发模式常量 6 8.vo传参模式 7 9.ModerDriven传参模式(不建议采用) 7 10.为什么要使用struts2代替struts1.x 7 二、struts.xml配置及例程 7 1.配置文件的优先级 7 2.配置形式 8 3.package配置...

    struts2详细介绍

    相比于其前身Struts1,Struts2提供了更强大的功能集,包括更加灵活的配置方式、丰富的拦截器机制以及更为简洁的代码结构。Struts2不仅继承了Struts1的优点,如清晰的MVC分离、易于维护和扩展等,还在许多方面进行了...

    自定义拦截器实现防止重复提交

    在实际应用中,你还需要在Struts2的配置文件(通常是`struts.xml`)中注册这个自定义拦截器,并将其应用到相应的Action上,以确保在执行Action之前先经过拦截器的检查。 总结来说,防止重复提交的自定义拦截器主要...

    struts2教程(完全版)

    接下来,学习如何创建Action、配置Action映射、使用结果类型、拦截器等,以及如何使用Struts2的UI标签和OGNL表达式,将使你更深入地理解并运用Struts2框架。记得实践是学习的最佳途径,尝试创建一个简单的Struts2...

    双鱼林struts2_hibernate人事工资管理系统

    Struts2的拦截器机制使得添加全局或特定操作的逻辑变得简单,同时提供了一套强大的结果类型和国际化支持。 2. Hibernate持久化框架:Hibernate是Java领域中的一款ORM(对象关系映射)框架,用于简化数据库操作。它...

    Struts2学习文档

    - **概念介绍**:列出Struts2自带的一些常用拦截器,如`params`拦截器、`servletConfig`拦截器等。 **7.4 开发自己的拦截器** - **实现方式**:指导如何自定义拦截器。 **7.5 深入拦截器编程** - **7.5.1 拦截...

    struts2项目性能调优三步曲.txt

    拦截器是Struts2框架中用于处理请求前后的关键组件,但过度使用会显著拖慢性能。优化策略包括: 1. **去除不必要的拦截器**:审查`struts.xml`中的拦截器配置,移除不使用的拦截器,减少请求处理流程的复杂度。 ...

    struts2经典教程

    - **值栈**:Struts2使用值栈来管理请求生命周期中的数据。它是Struts2的核心特性之一,用于存储Action、FormBean等对象。 - **OGNL(Object-Graph Navigation Language)**:这是一种强大的表达式语言,用于访问和...

    struts2用户管理

    Struts2可以通过拦截器或者自定义插件实现分页。通常我们需要在Action类中接收当前页码和每页数量,然后在UserDAO的selectByPage()方法中配合SQL的LIMIT和OFFSET子句实现分页查询。 **7. 框架验证** Struts2提供了...

    struts2_base jar包

    5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,允许在视图层动态地访问和修改模型数据,使得视图与模型之间的交互更为灵活。 6. **结果类型**:Action执行后,可以通过...

    Struts2.docx

    Struts2的核心在于它作为一个servlet,它使用拦截器(Interceptor)机制来处理HTTP请求,实现了业务逻辑与Servlet API的解耦。 在Struts2的工作流程中,客户端发起的请求首先会经过一系列过滤器,其中包括...

    Struts2入门教程

    4. `struts-default.xml`:Struts2框架默认加载的配置文件,定义了一些核心bean和拦截器,会被自动包含到`struts.xml`中。 5. 其他配置文件如`velocity.properties`、`struts-default.vm`和`struts-plugin.xml`也是...

    Struts2完美教程

    - **作用**:定义Struts2的核心bean和拦截器,被自动包含到`struts.xml`文件中。 - **位置**:位于`struts2-core.jar`内。 **5. 其他配置文件** - **velocity.properties**:用于配置Velocity模板引擎。 - **...

    Struts2_国际化

    在Struts2的配置文件中,可以利用i18n拦截器来根据用户的选择加载对应的国际化资源文件。此外,通过constant元素配置常量,指定默认的国际化资源文件名。 3. 输出国际化信息到页面。在JSP页面中,使用Struts2的标签...

    struts2学习笔记

    - **struts-default.xml**:struts2框架默认加载的配置文件,定义了核心bean和拦截器,通常通过`&lt;package extends="struts-default"&gt;`的方式被struts.xml包含。 - **其他配置文件**:例如velocity.properties、...

Global site tag (gtag.js) - Google Analytics