java课件-04框架struts29拦截器_第1页
java课件-04框架struts29拦截器_第2页
java课件-04框架struts29拦截器_第3页
java课件-04框架struts29拦截器_第4页
java课件-04框架struts29拦截器_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Struts2本章节授课目标器的概念配置

器使用

器2Struts2框架工作原理图注意观察Interceptors3器器?器(Interceptor)是Struts2的一个重要特性。Struts2框架的大多数

功能都是通过

器来实现的,像避免表单重复提交、类型转换、对象组装、验证、文件上传等,都是在器的帮助下实现的。拦截器之所以称为“器”,是因为它可以在Action执行之前或执行之后调用。Struts2将它的功能放到器中实现而不是分散到Action中实现,有利于系统的解耦,使得功能的实现类类似于个人电脑的组装,变”一个

器,不需要某个功能成了可插拔的。需要某个功能就“就“拔出”。器的作用:① 为action动态添加输入验证②

对象组装(也就是进行数据类型转换)③

权限控制④

日志记录4器器工作过程5器序号器名称作用1alias在请求之间转换名字不同的相似参数2chain将所有的属性从前一个Aciotn复到当前Action中3checkbox添加自动的复选框处理代码。当复选框未复选时采用false值添加到参数中4基于的名/值设置Action的属性5conversionError将类型转换错误从ActionContext中取出,添加到Action字段错误中6createSession自动创建一个HttpSession对象7debugging当struts.devMode属性设置为true,才有,用于调试8execAndWait可以用于防止

Action

Http请求超时9exception提供了异常处理的 功能10fileUpload用于对文件上传提供支持11i18n用于支 际化12logger记录一个action执行的开始和结束13token检查传到Action的token值的有效性,防表单重复提交6器配置和使用

器前面所介绍的器在struts-default.xml中已经进行了配置。如果您想要使用上述

器,只需要在应用程序struts.xml文件中通过“<include

file=”struts-default.xml“

/>”将struts-default.xml文件包含进来,并继承其中的struts-default包(package),最后在定义Action时,使用“<interceptor-refname=”xx“

/>”

器或

器栈(interceptorstack)。一旦您继承了struts-default包(package),所有Action都会调用

器栈

——defaultStack。当然,在Action配置中加入“<interceptor-ref

name=”xx“

/>”可以覆盖defaultStack。下面 通过使用timer 器的使用案例进行。7器创建Action类package

com.shinowit;import

com.opensymphony.xwork2.ActionSupport;6L;public

class

TimerInterceptorAction

extends

ActionSupport

{private

static

final

long

serialVersionUID

=

-public

String

execute()

{try{//模拟耗时的操作Thread.sleep(500);}

catch

(Exception

e)

{e.printStackTrace();}return

SUCCESS;}}8器在Struts2配置xml中定义Action,名为TimerAction,并配置

器<package

name="InterceptorDemo"

extends="struts-default"><action

name="TimerAction"class="com.shinowit.TimerInterceptorAction"><interceptor-ref

name="timer"/><result>/Timer.jsp</result></action></package>器timer缺省没有配置在struts-default包中9器timer器执行效果1011自定义

器编写 器类作为“框架(framework)”,可扩展性是不可或缺的,因为世上提供如此丰富的器的能力,恰恰相反,没有放之四海而皆准的东西。虽然,Struts

2为器实现,但是这并不意味

失去创建自定义在Struts

2自定义

器是相当容易的一件事。大家在开始着手创建自定义 器前,切记以下原则:器必须是无状态的,不要使用在API提供的ActionInvocation之外的任何东西。原因:Struts

2不能保证为每一个请求或者action创建一个实例,所以如果

器带有状态,会

并发问题。在Struts2中编写

类,有如下二种方式:实现Interceptor接口继承

Interceptor类(一般会选择此种方式)12自定义

器器,都需要对下述三个方法进行编写 器类无论选择哪种方式创建override。三个方法如下:1. void

init();此方法在

用于初始化器实例创建之后,intercept()方法被调用之前调用,器所需要资源。void

destroy();该方法在

器实例清除之前调用,用于

在init()方法中分配的资源。该方法只执行一次。String

intercept(ActionInvocation

invocation)

throwsException;该方法在Action执行之前被调用, 器为Action提供的附加功能在该方法中实现。利用invocation参数,可以获取action执行的状态。在intercept()方法中,如果要继续执行后续部分,可以调用invocation.invoke()。13自定义

器器示例代码自定义package

com.shinowit;import

com.opensymphony.xwork2.ActionInvocation;import

erceptor.

Interceptor;public

class

AroundIntercept

extends Interceptor

{private

static

final

longserialVersionUID

=

1L;@Overridepublic

void

init()

{System.out.println("这是一个初始化方法");}@Overridepublic

String

intercept(ActionInvocation

invocation)

throws

Exception{String

result

=

"";System.out.println("在action的execute方法执行之前动作");result=invocation.invoke();System.out.println("在action的execute方法执行之后动作");return

result;注意:在编写 器时要注意, 器必顺是无状态的,换句话

说,在器类中不应该有实例变量。这是因为struts2对每一个Action的请求使用的是同一个

器实例来处理,如果

器有状态,在多线程并 况下,

器的状态将不可测。14自定义

器自定义 器的配置<package

name="InterceptorDemo"

extends="struts-default"><interceptors><interceptor

name="aroundInterceptor"class="com.shinowit.AroundIntercept"></interceptor></interceptors><action

name="TimerAction"class="com.shinowit.TimerInterceptorAction"><interceptor-ref

name="aroundInterceptor"/><interceptor-ref

name="timer"/><result>/Timer.jsp</result></action></package>15自定义

器时该如何处理?可特殊 器抽象类只需要对Action中部分方法进行以使用下面这个类:erceptor.MethodFilterInterceptorMethodFilterInterceptor通过指定include/excluded方法列表来选择 或排除的方法,可以设置的参数如下:excludeMethods要排除的方法includeMethods要

的方法在设置 或排除的方法时,如果有多个方法,那么以逗号(,)分隔,如果一个方法的名字同时出现在excludeMethods和includeMethods参数中,那么会当作要 的方法。16自定义

器器示例,修改父类为基于MethodFilterInterceptor的MethodFilterInterceptrorpackage

com.shinowit;import

com.opensymphony.xwork2.ActionInvocation;import

erceptor.MethodFilterInterceptor;public

class

AroundIntercept

extendsMethodFilterInterceptor

{ntercept(ActionInvocation

invocation)

throws@OverrideprotectedStringException

{System.out.println("AroundIntercept被调用......");returninvocation.invoke();}}17自定义

器CrudAction.java代码package

com.shinowit;import

com.opensymphony.xwork2.ActionSupport;public

class

CrudAction

extends

ActionSupport

{public

String

insert(){System.out.println("insert方法被调用");return

SUCCESS;}public

String

update(){System.out.println("update方法被调用");return

SUCCESS;}public

String

delete(){System.out.println("delete方法被调用");return

SUCCESS;}public

String

select(){System.out.println("select方法被调用");return

SUCCESS;}public

String

execute(){System.out.println("execute方法被调用");return

SUCCESS;}}18自定义

器基于MethodFilterInterceptor的

器示例<package

name="InterceptorDemo"

extends="struts-default"><interceptors><interceptor

name="aroundInterceptor"

class="com.shinowit.AroundIntercept"></interceptor></interceptors><action

name="crud_*"

class="com.shinowit.CrudAction"method="{1}"><interceptor-ref

name="aroundInterceptor"><param

name="includeMethods">select,update</param><param

name="excludeMethods">delete,insert</param></interceptor-ref><result>/index.jsp</result></action></package>19自定义

器基于方法过滤的器执行效果2021自定义

器配置

器器需要在struts.xml中进行配置才能为action提供服务。要为action配置

器,首先需要在interceptors元素中使用interceptor元素定义

器,然后

在action中使用interceptor-ref元素指定

的class,前者指定比如对如前面的器。Interceptor元素有两个必需的属性:name和器的名字,后者指定

器的完整类名。器,需要如下配置:<

package

name=“default"

extends

="struts-default"

><interceptors>

<!

-

-在这里定义

器-

-><interceptor

name=“around”

class=“AroundInterceptor”/></interceptors><

action

name=“test”

class=“ .AroundAction”

><

result

>

/Timer.jsp

</

result

>器--><interceptor-ref

name=“around”/><!–此处</

action

></

package

>22自定义

器配置

器如果在一个action需要多个 器,那又需要如何配置?另外,对于多个 器之间的执行顺序又是怎样的?对于上述问题有二个解决方法:为一个Action配置多个将多个

器配为一个器器栈,然后在action中23配置示例为一个Action配置多个

器<

package

name

=“default"

extends

="struts-default"

><interceptors>

<!

-

-在这里定义

器-

-><interceptor

name=“before”

class=“BeforeInterceptor”/><interceptor

name=“after”

class=“AfterInterceptor”/></interceptors><

action

name=“test”

class=“

.TestAction”

><

result

>

/Timer.jsp

</

result

>器-->器--><interceptor-ref

name=“before”/><!–此处<interceptor-ref

name=“after”/><!–此处</

action

></

package

>24配置示例定义 器栈示例<

package

name

=“default"

extends

="struts-default"

><interceptors>

<!

-

-在这里定义

器-

-><interceptor

name=“before”

class=“BeforeInterceptor”/><interceptor

name=“after”

class=“AfterInterceptor”/>器栈--><!—配置

器栈,便于使用→<interceptor-stack

name=“mystack”><

interceptor-ref

name

=“before”

/><

interceptor-ref

name

=“after”

/></interceptor-stack></interceptors><

action

name=“test”

class=“

.TestAction”

><result

>

/Timer.jsp

</

result

><interceptor-ref

name=“mystack”/><!–此处</

action></

package

>25配置示例缺省 器栈的配置<

package

name

=“default"

extends

="struts-default"

><interceptors>

<!

-

-在这里定义

器-

-><interceptor

name=“before”

class=“BeforeInterceptor”/><interceptor

name=“after”

class=“AfterInterceptor”/><!—配置

器栈,便于使用→<interceptor-stack

name=“mystack”><

interceptor-ref

name

=“before”/><

interceptor-ref

name

=“after”

/></interceptor-stack></interceptors><!—此处指定了一个默认的 器栈,也就意味着此名下所有的action都将会执行此默认 器栈中的 器(按出现顺序)→<default-interceptor-ref

name=“mystack”/>.TestAction”

><

action

name=“test”

class=“<result

>

/Timer.jsp

</

result

></

action

></

package

>26配置示例当配置缺省 器栈之后又在action中定义 器时<

package

name

=“default"

extends

="struts-default"

><interceptors>

<!

-

-在这里定义

器-

-><interceptor

name=“before”

class=“BeforeInterceptor”/><interceptor

name=“after”

class=“AfterInterceptor”/><!—配置

器栈,便于使用→<interceptor-stack

name=“mystack”><

interceptor-ref

name

=“before”

/><interceptor-ref

name

=“after”

/></interceptor-stack></interceptors><default-interceptor-ref

name=“mystack”/><

act

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论