这一篇主要讲解struts中的默认拦截器,这些拦截器是已经封装好的。当然也可以自定义拦截器。
1、拦截器的基本概念
2、拦截器的使用方法
3、认识内置拦截器
了解拦截器(Interceptor)的基本概念,了解什么是面向方面的编程思想(AOP),掌握拦截器的使用方法,了解Struts2的内置拦截器。
Action的属性如何被自动填充?如何将参数的数据类型自动转换?
系统如何知道Action是否实现了ModelDriven接口?如何自动调用接口的方法?
系统如何将Action属性传递到JSP视图?
......这一切都是因为有了幕后英雄—拦截器
什么是拦截器?
拦截器是动态拦截Action调用的组件对象。之所以称为“拦截器”,是因为它可以在Action的业务方法执行前后进行拦截调用,实现特定功能。
为什么要使用拦截器?
Struts2框架中包含大量的拦截器,实现了框架的大部分基础功能,如:避免表单重复提交、类型转换、输入验证、文件上传等都是在拦截器帮助下实现的。使用拦截器可使程序开发人员的工作变得轻松。
面向方面的编程(AOP)( Aspect-Oriented Programming) AOP是对OOP的完善和补充。
OOP:基本设计思想(封装、继承、多态)对象之间通过继承、多态建立一种层次关系。 OOP适合系统中核心业务的描述处理,但对于系统中公共行为(如日志管理、权限认证、事务处理等)的描述处理力不从心,而这些公共行为又是普遍存在和十分重要的。
AOP:是将那些封装的对象“剖开”,从中找到这些对象对某一特定需求的共同关切点,即方面,并将这些特定方面的功能实现封装到可重用模块。
【拦截器的设计思想】
拦截器设计采用AOP的思想,Struts2框架中,Action是封装了业务处理行为的对象,而公共行为(基础功能)放到拦截器中实现,而不是分散到Action中实现。
AOP设计思想使得系统功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。
如何将实现业务处理的Action类和实现了公共行为的拦截器类关联到一起,共同实现系统功能?
配置!!!
通过查看Struts2框架的默认配置文件struts-default.xml,了解拦截器的配置和使用。
打开项目的“Referenced Libraries”继续打开struts2-core-2.2.1.1.jar找到struts-default.xml文件双击打开
拦截器的配置包括拦截器的定义和拦截器的引用两部分
1、拦截器的定义
在<interceptors>元素内定义了一组拦截器和一组拦截器栈
【拦截器】 <interceptor>元素用于定义一个拦截器,如:
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
定义拦截器时name指定拦截器的名称,class指定实现了拦截器功能的类,将一个拦截器名与一个拦截器类进行了关联
【拦截器栈】 <interceptor-stack>用于定义一个拦截器栈
由于拦截器较多,为了使用和管理的方便,可将多个拦截器组织在一起形成一个拦截器栈,使用拦截器栈可以将多个拦截器作为一个整体来引用。
在<interceptor-stack>内使用<interceptor-ref name="拦截器名"/>来引用拦截器
2、拦截器的默认引用
<default-interceptor-ref name="defaultStack"/>
defaultStack是struts-default包指定的默认拦截器栈,这个包的继承者内所有的Action都将与这个拦截器栈中的所有拦截器关联。
我们创建的Web应用程序中,struts.xml中定义的包默认都是从struts-default包继承,因此我们在之前创建的Action可以实现数据类型自动转换、Action属性自动填充、基于框架注入获取Web元素。
【在Action中订制内置拦截器】
<package name="user" extends="struts-default">
<action name="login" class="com.hnjm.action.LoginAction">
<interceptor-ref name="timer"/>
<interceptor-ref name="defaultStack"/>
<result>/success.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
【说明】
在配置文件中为Action显式引用拦截器后,继承的默认拦截器将不再起作用,为了继续使用,必须显式引用默认拦截器
1、测试运行,观察控制台的输出
在控制台显示Action的业务方法运行时间
2011-3-15 20:48:47 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Executed action [//login!execute] took 63 ms.
2、增加<interceptor-ref name="logger"/>测试运行
3、将<interceptor-ref name="defaultStack"/>删除,再测试运行
4、package中定义自己的拦截器栈,并在action中引用
<package name="user" extends="struts-default">
<interceptors>
<interceptor-stack name="mystack">
<interceptor-ref name="logger" />
<interceptor-ref name="timer" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<action name="login" class="com.hnjm.action.LoginAction">
<interceptor-ref name="mystack"></interceptor-ref>
<result>/success.jsp</result>
<result name="input">/login.jsp</result>
<result name="invalid.token">/err.jsp</result>
</action>
</package>
Struts2框架中的拦截器