Struts2中的拦截器教学示例及课后练习参考资料.docx

上传人:b****8 文档编号:10329710 上传时间:2023-02-10 格式:DOCX 页数:72 大小:971.12KB
下载 相关 举报
Struts2中的拦截器教学示例及课后练习参考资料.docx_第1页
第1页 / 共72页
Struts2中的拦截器教学示例及课后练习参考资料.docx_第2页
第2页 / 共72页
Struts2中的拦截器教学示例及课后练习参考资料.docx_第3页
第3页 / 共72页
Struts2中的拦截器教学示例及课后练习参考资料.docx_第4页
第4页 / 共72页
Struts2中的拦截器教学示例及课后练习参考资料.docx_第5页
第5页 / 共72页
点击查看更多>>
下载资源
资源描述

Struts2中的拦截器教学示例及课后练习参考资料.docx

《Struts2中的拦截器教学示例及课后练习参考资料.docx》由会员分享,可在线阅读,更多相关《Struts2中的拦截器教学示例及课后练习参考资料.docx(72页珍藏版)》请在冰豆网上搜索。

Struts2中的拦截器教学示例及课后练习参考资料.docx

Struts2中的拦截器教学示例及课后练习参考资料

有关拦截器技术的一些概念

1、为什么要应用拦截器

拦截器就是一种AOP的实现方式,传统的JSP&Servlet架构中,客户端发送一个请求,服务器端生成一个request对象,并执行相应的doGet()或者doPst()方法,最后由response返回一个响应到客户端,整个服务过程就结束了。

所以所有的业务逻辑功能只能在doGet()或者doPst()方法中调用,这样整个业务就写死了,如果想增加新的功能,只能修改doGet()或者doPst()方法,不符合开闭原则(OCP)。

2、Struts2框架中的默认拦截器

在Struts2中每发送一个请求都要经过好几层的拦截器最终才到达所调用的action。

由多个拦截器组成的就是一个intercptor-stack,如果扩展了struts-default就默认集成了defaultstack。

里面包含了许多常用的拦截器,比如文件上传时会用到fileUpload,要调出session对象由servletConfig来做。

因为defaultstack里的拦截器,默认已经配好了,所以无需要专门对这些拦截器进行配置。

3、Struts2框架中的各种形式的拦截器的主要作用

拦截器

名字

说明

AliasInterceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

ChainingInterceptor

chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。

CheckboxInterceptor

checkbox

添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

CookiesInterceptor

cookies

使用配置的name,value来是指cookies

ConversionErrorInterceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中。

CreateSessionInterceptor

createSession

自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

DebuggingInterceptor

debugging

提供不同的调试用的页面来展现内部的数据状况。

ExecuteandWaitInterceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面。

ExceptionInterceptor

exception

将异常定位到一个画面

FileUploadInterceptor

fileUpload

提供文件上传功能

I18nInterceptor

i18n

记录用户选择的locale

LoggerInterceptor

logger

输出Action的名字

MessageStoreInterceptor

store

存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

ModelDrivenInterceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在ValueStack中。

ScopedModelDriven

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。

ParametersInterceptor

params

将请求中的参数设置到Action中去。

PrepareInterceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

ScopeInterceptor

scope

将Action状态存入session和application的简单方法。

ServletConfigInterceptor

servletConfig

提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

StaticParametersInterceptor

staticParams

从struts.xml文件中将中的中的内容设置到对应的Action中。

RolesInterceptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行。

TimerInterceptor

timer

输出Action执行的时间

TokenInterceptor

token

通过Token来避免双击

TokenSessionInterceptor

tokenSession

和TokenInterceptor一样,不过双击的时候把请求的数据存储在Session中

ValidationInterceptor

validation

使用action-validation.xml文件中定义的内容校验提交的数据。

WorkflowInterceptor

workflow

调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面

ParameterFilterInterceptor

N/A

从参数列表中删除不必要的参数

ProfilingInterceptor

profiling

通过参数激活profile

WebWork提供的拦截器介绍

1、 自动为Action设置Http请求数据的拦截器(ParametersInterceptor)。

这个拦截器非常方便实用,但完全自动组装对象数据,很可能会带来安全问题。

如果Action不需要设置数据,那么这个Action只要实现com.opensymphony.xwork.interceptor.NoParameters接口即可。

如果是Action中部分数据需要自动设置,部分数据不允许设置,这样可以实现接口com.opensymphony.xwork.interceptor.ParameterNameAware,可以在这个接口的acceptableParameterName(StringparameterName)方法中,定义我们可以接受哪些方法,如果允许只要让这个方法返回True就可以了。

2、 过虑参数功能的拦截器(ParameterFilterInterceptor)。

它可以全局阻止非法或不允许Action访问的参数。

可以很好的和上面的组装参数的拦截器一起使用。

3、 为Action设置静态数据的拦截器(StaticParametersInterceptor)。

它可以将Action定义的静态参数,设置到Action中。

4、 数据验证拦截器(ValidationInterceptor)。

定义之后,会调用验证文件或实现验证接口com.opensymphony.xwork.Validateable的所有验证。

5、 验证流程处理拦截器(WorkflowInterceptor)。

它和上面的拦截器一起使用,处理验证的流程。

如果验证通过则继续前进,如果发现有验证错误消息,直接转到Action中定义的输入结果(input)页面。

6、 类型转换错误处理拦截器()。

它首先去取得类型转换的错误消息(主要是由设置Http请求参数的拦截器产生),如果取到错误消息,它会将错误消息传递给实现接口com.opensymphony.xwork.ValidationAware的Action,这样我们可以将这些错误消息暴露到页面中。

7、 Action链拦截器(ChainingInterceptor)。

它是用来拷贝前一个Action的属性数据到当前Action中。

它要求前一个Action必须是chainResult(),这样才能进行Action的数据拷贝。

8、 防止页面重复提交(或页面重复刷新)拦截器。

TokenInterceptor和TokenSessionInterceptor都是防止重复提交的拦截器。

不同点是后者在Session存贮了最近一次请求的结果数据。

9、 文件上传的拦截器(FileUploadInterceptor)。

实现文件上传的功能。

如果有人曾经手工写过文件上传程序,那一定会惊叹于这个拦截器。

我们可以在这个拦截器中设定上传文件的大小和类型限制。

记得需要第三方的文件上传库的支持,只要在webwork.properties中配置过,并拷贝相应的jar包就可以了。

10、 进度条等待拦截器(ExecuteandWaitInterceptor)。

当Action的执行需要很长实际的时候,我们可以使用这个进度条等待的拦截器。

它会将Action放到后台执行,而在前端显示进度条或等待消息提示的页面。

应用Struts2中的拦截器技术---自定义拦截器组件、并且了解拦截器组件的工作机制

1、添加一个拦截器组件

类名称为AuthorizedUserInterceptor、包名称为com.px1987.sshwebcrm.interceptor、并且从com.opensymphony.xwork2.interceptor.AbstractInterceptor基类进行继承。

2、编程该拦截器组件

Struts2截获Action请求,在Action执行之前或之后调用拦截器方法。

这样,可以用插拔的方式将功能注入到Action中。

WebWork框架的很多功能都是以拦截器的形式提供出来。

例如:

参数组装,验证,国际化,文件上传等等。

packagecom.px1987.sshwebcrm.interceptor;

importjava.util.Map;

importcom.opensymphony.xwork2.Action;

importcom.opensymphony.xwork2.ActionInvocation;

importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;

importcom.px1987.sshwebcrm.actionform.UserInfoActionForm;

publicclassAuthorizedUserInterceptorextendsAbstractInterceptor{

publicAuthorizedUserInterceptor(){

}

@Override

publicStringintercept(ActionInvocationoneActionInvocation)throwsException{

//前置效果(在被拦截的目标Action类中的方法执行之前执行)

System.out.println("在第一个拦截器中的前置拦截代码已经被执行!

");

StringreturnResult=oneActionInvocation.invoke();

System.out.println("原来的Action类中的目标方法已经被执行!

")

//后置效果(在被拦截的目标Action类中的方法执行以后再执行)

System.out.println("在第一个拦截器中的后置拦截代码已经被执行!

结果为:

"+returnResult);

returnreturnResult;

}

}

3、在struts.xml文件中配置和定义出该拦截器组件

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"http:

//struts.apache.org/dtds/struts-2.1.dtd">

class="com.px1987.sshwebcrm.interceptor.AuthorizedUserInterceptor"/>

/userManage/loginSuccess.jsp

class="com.px1987.sshwebcrm.action.UserInfoManageActionModel">

/userManage/loginSuccess.jsp

--必须还要对系统中的默认的拦截器组件也要引用-->

class="com.px1987.sshwebcrm.action.UserInfoAction">

/userManage/loginSuccess.jsp

class="com.px1987.sshwebcrm.action.UserInfoAction">

/userManage/loginSuccess.jsp

method="{1}">

/userManage/loginSuccess.jsp

--

/userManage/{1}.jsp

-->

method="defaultActionMethod">

/userManage/loginSuccess.jsp

这是在struts.xml文件中为某个Action提供“注入的属性”值

注意:

上面的各个标签的前后顺序要满足DTD中的要求,否则将会出现下面的错误。

4、测试该拦截器组件的效果——不能在单元测试中执行,必须通过浏览器执行

http:

//192.168.1.66:

8080/sshwebcrm/userManage/modelUserLogin.jsp

注意:

一定要引用系统中的默认的拦截器(),否则表单提交后将无法正常地获得参数。

让我们再来回顾一下之前我们曾经用过的一张ActionLifeCycle的图:

  

图中,我们可以发现,Struts2的Interceptor一层一层,把Action包裹在最里面。

这样的结构,大概有以下一些特点:

 

1.整个结构就如同一个堆栈,除了Action以外,堆栈中的其他元素是Interceptor 

2.Action位于堆栈的底部。

由于堆栈"先进后出"的特性,如果我们试图把Action拿出来执行,我们必须首先把位于Action上端的Interceptor拿出来执行。

这样,整个执行就形成了一个递归调用 

3.每个位于堆栈中的Interceptor,除了需要完成它自身的逻辑,还需要完成一个特殊的执行职责。

这个执行职责有3种选择:

 

1)中止整个执行,直接返回一个字符串作为resultCode 

2)通过递归调用负责调用堆栈中下一个Interceptor的执行 

3)如果在堆栈内已经不存在任何的Interceptor,调用Action 

Struts2的拦截器结构的设计,实际上是一个典型的责任链模式的应用。

首先将整个执行划分成若干相同类型的元素,每个元素具备不同的逻辑责任,并将他们纳入到一个链式的数据结构中(我们可以把堆栈结构也看作是一个递归的链式结构),而每个元素又有责任负责链式结构中下一个元素的执行调用。

 

这样的设计,从代码重构的角度来看,实际上是将一个复杂的系统,分而治之,从而使得每个部分的逻辑能够高度重用并具备高度可扩展性。

所以,Interceptor结构实在是Struts2/Xwork设计中的精华之笔。

体验拦截器链的实现效果

1、再增加一个拦截器组件

类名称为LogInfoInterceptor、包名称为com.px1987.sshwebcrm.interceptor

2、编程该拦截器组件

packagecom.px1987.sshwebcrm.interceptor;

importcom.opensymphony.xwork2.ActionInvocation;

importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;

publicclassLogInfoInterceptorextendsAbstractInterceptor{

publicLogInfoInterceptor(){

}

@Override

publicStringintercept(ActionInvocationactionInvocation)throwsException{

//前置效果(在被拦截的目标Action类中的方法执行之前执行)

System.out.println("在第二个拦截器中的前置拦截代码已经被执行!

");

StringreturnResult=actionInvocation.invoke();

System.out.println("在第二个拦截器中的原来的Action类中的目标方法已经被执行!

");

//后置效果(在被拦截的目标Action类中的方法执行以后再执行)

System.out.println("在第二个拦截器中的后置拦截代码已经被执行!

结果为:

"+returnResult);

returnreturnResult;

}

}

3、定义和引用该拦截器

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"http:

//struts.apache.org/dtds/struts-2.1.dtd">

class="com.px1987.sshwebcrm.interceptor.AuthorizedUserInterceptor"/>

class="com.px1987.sshwebcrm.interceptor.LogInfoInterceptor"/>

/userManage/loginSuccess.jsp

class="com.px1987.sshwebcrm.action.UserInfoManageActionModel">

/userManage/loginSuccess.jsp

--注意引用的顺序也就是执行的顺序-->

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 思想汇报心得体会

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1