实验六 利用Struts2实现自定义拦截器

合集下载

Struts2_拦截器详细配置过程

Struts2_拦截器详细配置过程

Struts2 拦截器详细配置过程1:所有拦截器的超级接口Interceptor ,Action去实现这个接口; Interceptor 它其中有三个方法(init(),destroy() ,interceptor()):Init()方法:在服务器起动的时候加载一次,并且只加载一次;Destroy()方法:当拦截器销毁时执行的方法;Interceptor()方法:其中里边有一个参数invocationpublic String intercept(ActionInvocationinvocation) throws xception {System.out.println("interceptor!!");String result=invocation.invoke();return result;}Invocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图.2:可以在系统初始化中给拦截器指定默认的参数(也包括了定义拦截器方式)如下:在拦截器类中把hello当做属性set/get方式注入到拦截器类中;<interceptors><!-- 先定义拦截器 --><interceptor name="myInterceptor" class="com.zzz.struts2.i nterceptor.MyInterceptor"><!-- 指定系统初始化给拦截器的参数 --><param name="hello">张钊钊</param></interceptor><!-- 加到自己设置的拦截器栈里边去 --><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去 --><default-interceptor-ref name="myStack"></default-interceptor-ref>也可以在使用拦截器的时候给它设置参数:就是在一个action 的reslut下面配置上如下:<action name="register"class="com.zzz.struts2.action.RegisterAction"><result name="success">/success.jsp</result><!-- result 它其中还有一个信息转发类型 type=""记住,如果不转向JSP,转向图表,可以改变type=""值 --><result name="input">/register.jsp</result><interceptor-ref name="myInterceptor"><param name="hello">welcome</param></interceptor-ref><interceptor-ref name="myStack"></interceptor-ref></action>2.拦截器,拦截器栈和默认的拦截器之间的关系1:拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中包括许多拦截器, 一个拦截器栈中还可以包括许多拦截器栈,配置如下方式: <interceptors><!-- 先定义拦截器 --><interceptor name="myInterceptor" class="com.zzz.struts2.i nterceptor.MyInterceptor"><!-- 指定系统初始化给拦截器的参数 --><param name="hello">张钊钊</param></interceptor><!-- 加到自己设置的拦截器栈里边去 --><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack></interceptors>拦截器的使用:1.先定义;2.在引用使用;<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor. MyInterceptor"><interceptor-ref name="myInterceptor"></interceptor-ref>2:struts2中有一个系统默认的拦截器栈是 defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需手动引入系统的拦截器栈<interceptor-ref name="defaultStack"></interceptor-ref>如果想改变系统默认的拦截器栈,可以这样配置:<default-interceptor-ref name="myStack"></default-interceptor-ref>其中myStack是自己定义的拦截器栈名字;如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;3:抽象的拦截器类AbstractInterceptor1:Interceptor这个超级拦截器接口,有三方法需要实现,但是如果不想使用init();和destroy()方法,可以去继承这个抽象拦截器类;它的使用跟上边的没有什么区别;4:方法过滤拦截器MethodFilterInterceptor1:上边的拦截器都要是针对整个action的,如果针对某个方法进行拦截可以去继承这个类;它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,方法过滤拦截器最好不要配置到自己设置默认的拦截器栈里边,自己手动配置.<interceptor-ref name="myInterceptor3"><param name="includeMethods">execute</param><param name="excludeMethods">execute</param></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref>其中includeMethods ,excludeMethods是固定写法: includeMethods 包含拦截那些方法,多个方法需要用”,”隔开; excludeMehtods是排除拦截的那些方法;5:鉴听器PreResultListener接口1:它的鉴听点在拦截器执行完某个action方法后,在渲染视图之前做一些事情;让某个类去实现这个接口;然后向需要它的拦截器中注册进去如下代码:publicclass MyInterceptor3 extends MethodFilterInterceptor { privatestaticfinallong serialVersionUID = 3756655410194005443L;@Overrideprotected StringdoIntercept(ActionInvocation invocation) throws Exception { //把鉴听器注册到拦截中去;invocation.addPreResultListener(new MyListener());System.out.println("my Interceptor3");String result=arg0.invoke();System.out.println("my interceptor3 finshed!");return result;}}。

struts2_拦截器(Interceptors)

struts2_拦截器(Interceptors)

拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。

拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。

每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。

如何自定义一个拦截器?自定义一个拦截器需要三步:1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

2 在strutx.xml中注册上一步中定义的拦截器。

3 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。

Interceptor接口声明了三个方法:public interface Interceptor extends Serializable {void destroy();void init();String intercept(ActionInvocation invocation) throws Exception; }Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。

Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。

Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。

如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。

另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:public abstract class AbstractInterceptor implements Interceptor {public void init() {}public void destroy() {}public abstract String intercept(ActionInvocation invocation) throws Exception;}在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。

Struts2的拦截器

Struts2的拦截器

exception
提供处理异常功能,将异常映射为结果
fileUpload
负责文件上传
I18n
把指定 Locale 信息放入 Session
logger
输出 Action 名称
store
存储或者访问实现 ValidationAware 接口的 Action 类出现的消息、错
误、字段错误等
model-driven
FilterDispatcher
日志拦截器
Action
Result 图 2-2 添加拦截器
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根保通据护过生高管产中线工资敷艺料设高试技中卷术资配0料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高高与中中带资资负料料荷试试下卷卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并中3试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

通过代码实例跟我学Struts2框架从入门到精通——Struts2框架的拦截器组件技术及应用

通过代码实例跟我学Struts2框架从入门到精通——Struts2框架的拦截器组件技术及应用

(2)在struts-default.xml中定义的默认拦默认拦截器timer组件的示例
将在控制台中出现下面的结果
11、应用了用户自定义的拦截器组件后有可能存在的问题
(1)解决的基本方法 不仅引用自定义的拦截器组件,也对默认的 defaultStack进行引用。 (2)请见下面的示例
(4)编程自定义实 现特定功能的拦截 器,只需要实现拦 截器接口 Interceptor
5、Struts 2框架中的各种形式的拦截器的主要作用
6、实现Interceptor接口创建自定义拦截器 (1)Interceptor接口提供有如下的三个方法
(2)使用init方法可以给拦截器类做必要的初始化操作 ( 3 )应用 destroy 方法可以在拦截器被垃圾回收之前调用, 用来回收init方法初始化的资源。 7 、 intercept() 为拦截器的核心方法,实现具体的拦截功 能
(1)Web Filter和Servlet相互配合、协同工作 Servlet 完成业务功能调度、 Filter 实现系统服务;但 Web Filter 依赖 Servlet 容器并由 Servlet 容器进行生命 周期的管理 (2) Struts2中的拦截器独立于Servlet容器 (3)拦截器是用Java中的“动态代理”和“反射”技术实 现的,并由Struts2的运行时系统程序调度和管理。
(3)在struts.xml文件中定义和引用该拦截器组件
(4)测试该拦截器组件
(5)注意拦截器只能拦截对Action的访问,不能防止用户非 法直接访问的*.jsp页面文件 为此,可以应用Filter组件来控制对*.jsp页面的访问。
10、引用Struts 2框架中的默认拦截器
(1)在struts-default.xml中已经配置了Struts 2框架中 的默认拦截器

Struts2的拦截器配置

Struts2的拦截器配置

拦截器实例
public class SimpleInterceptor extends AbstractInterceptor { private String name; public void setName(String name) { = name; } public String intercept(ActionInvocation invocation) throws Exception { LoginAction action = (LoginAction)invocation.getAction(); ......... String result = invocation.invoke(); ...... return result; } }
Struts 专题篇
第九章 Struts 2 的拦截器 主讲:陈宝峰
内容描述
● ● ● ● ● ●
拦截器概述 拦截器配置 使用拦截器的配置 使用默认拦截器的配置 拦截器实例 方法过滤
拦截器概述
● ●
拦截器是 Struts 2 中的重要组成部分 大量的内建拦截器完成了大部分的 Struts2 框架的工作
结束
使用默认拦截器的配置
<package name=” 包名” > <interceptors> <interceptor name=” 拦截器名 1” class=”......” /> ...... <interceptor-stack name=” 拦截器栈名 1”> <interceptor-ref name=” 拦截器名 1” /> ...... </interceptor-stack> </interceptors> <default-interceptor-ref name=” 拦截器名或拦截器栈名” /> <action ...... /> </package>

Struts2拦截器(翻译自Struts2官方网站)

Struts2拦截器(翻译自Struts2官方网站)

Struts2拦截器(翻译自Struts2官方网站)许多的Struts2中的Action需要共享一些共用信息或者是模块,有些Action需要对输入进行验证,另外一些Action 或许需要对文件上传之前做一些逻辑处理,又或者一些Action需要对重复提交进行保护,还有一些Actiion需要在页面显示前,初始化下拉框或一些页面组件。

Struts2框架使用了Interceptor(拦截器)策略使共享这些关心的模块更简单的使用起来。

当需要使用到一些映射到Action的资源时,框架生成了Action对象,但在该Action 被执行前,执法该Action中的方法被另外一个对象拦截了,在Action执行时,可能再次被拦截,我们亲切地称此对象为拦截器。

理解拦截器拦截器能够在一个Action执行前后拦截它。

目前的很多框架的核心实现均是基于拦截器。

(本人说两句,OOP 因为拦截器而显得更为精彩,AOP必将成为下一个核心关注点)。

拦截器可以帮助实现很多公共的内容,其中有重复提交,类型转换,对象初始化,验证,文件上传,页面初始化等等。

由于每个拦截器都可以像热插拔的模块,你可以在你的Action中正确地去使用需要的拦截器。

拦截器可以配置在一个基类的action中,自定义的拦截器可以尽量少或者配合框架中的已有的拦截器。

所以套用句外国人的话说吧,在一个Action执行时,让我们为它再提升一些吧,给Action更大的舞台更强大的力量吧。

如上图所示,Struts2的Action被一个或者多个拦截器围绕,所有的用户请求都会被拦截器所拦截,最后交给Action处理,处理结果以逻辑视图的方式返回给用户,调用的流程由配置文件来实现。

在一些例子中,一个拦截器可以解决像重复提交以及验证失败这样的例子。

当然也可以改变一个Action在执行前的状态。

拦截器可以定义为一个指定执行顺序的链中,在某些情况下,拦截器的顺序非常的重要。

="struts-default"&gt;该元素的意思是定义了一个继承于struts-default包的包,那么该包中的所有action均可使用struts-default.xml中定义的拦截器以及拦截器链。

strtus2拦截器使用说明

strtus2拦截器使用说明

1. 理解拦截器1.1. 什么是拦截器:拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

拦截是AOP的一种实现策略。

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。

它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。

同时也是提供了一种可以提取action中可重用的部分的方式。

谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。

拦截器链就是将拦截器按一定的顺序联结成一条链。

在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

1.2. 拦截器的实现原理:大部分时候,拦截器方法都是通过代理的方式来调用的。

Struts 2的拦截器实现相对简单。

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

如下图:2. 拦截器的配置Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。

大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

Struts2(XWork)提供的拦截器的功能说明:拦截器名字说明Alias Interceptoralias在不同请求之间将请求参数在不同名字件转换,请求内容不变Chaining Interceptorchain让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。

Struts2拦截器拦截器是Struts2的核心组成部分

Struts2拦截器拦截器是Struts2的核心组成部分

}
二、自定义拦截器
2.通过AbstractInterceptor类实现拦截器
前面通过实现Interceptor接口实现了自定义拦截器类的,但是我 们发现就算我们不需要对拦截器的初始化和销毁进行任何操作,也不 得不实现init方法和destroy方法。
这时可以使用另外一个类AbstractInterceptor。该类是一个抽象 类并实现了Interceptor接口,其代码如下所示。 public abstract class AbstractInterceptor implements Interceptor {
3.截器配置拦截器
前面介绍了如何定义拦截器类,但是这时拦截器还不能起作用。 要拦截器其作用则必须在struts.xml文件中配置该拦截器,下面介绍 几种配置拦截器的方法。
1.最简单的配置 2.配置并传递参数 3.配置多个拦截器 4.配置拦截器栈 5.配置拦截器栈并传递参数 6.在拦截器栈中再引入拦截器栈
public void init() {//初始化方法} public void destroy() {//销毁方法} public abstract String intercept(ActionInvocation invocation) throws Exception; //拦截方法 }
二、自定义拦截器
二、自定义拦截器
4.使用拦截器
前面已经介绍了如何配置拦截器,但是现在拦截器还是不能起作 用。因为Action还不知道要使用哪个拦截器,所以还必须在Action元 素中通过添加interceptor-ref节点来指定使用哪个拦截器,代码格式 如下所示。 <action name="业务控制器名" class="业务控制器实现类">
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
private String name;
private String password;
private boolean role;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
<constant name="struts.enable.SlashesInActionNames" value="true" />
<constant name="struts.action.extension" value="action" />
<package name="default" extends="struts-default">
</action>
<action name="update" class="erAction"
method="update">
<result name="success">update_result.jsp</result>
<result name="login">/Login.jsp</result>
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/Mg_book", "root", "123456");
return conn;
} catch (Exception e) {
// TODO Auto-generated catch block
<interceptors>
<interceptor name="CheckLoginInterceptor" class=".interceptor.CheckLoginInterceptor"></interceptor>
<interceptor name="CheckRegistInterceptor" class=".interceptor.CheckRegistInterceptor"></interceptor>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="CheckLoginInterceptor"/>
</action>
<action name="show" class=".action.ShowAction">
<result name="success">displayAll.jsp</result>
method="updateInit">
<result name="success">update.jsp</result>
<result name="login">/Login.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="CheckLoginInterceptor"/>
<result name="error">F_error.jsp</result>
<result name="login">/Login.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="CheckLoginInterceptor"/>
<param-name>actionPackages</param-name>
<param-value>com.mycompany.myapp.actions</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<result name="error">regist_error.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="CheckRegistInterceptor"/>
</action>
<action name="updateInit" class="erAction"
import java.sql.DriverManager;
public class DBConn {
public static Connection conn;
public static Connection getConn(){
try {
Class.forName("com.mysql.jdbc.Driver");
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<?xml vers"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
</action>
</package>
</struts>
Db
create database Mg_book;
use Mg_book;
create table users(
id int auto_increment primary key not null,
name varchar(10) not null,
values("王丫", "1234", true);
Login
package .entity;
import java.io.Serializable;
/**
* @author wdf
*
*/
public class Login implements Serializable{
private Integer id;
1、自定义拦截器,实现对注册页面上的文字信息进行过滤拦截,不允许出现字符集合中{“佛法”,”集会”,”党派”}的文字信息。如出现,则返回到注册页面,重新填写。
2、定义拦截器,实现登录检查。由于在项目开发时,需要对大多数的页面进行登录检查。当没有登录就无法进行操作,并返回到登录页面。为减少代码量利用Struts2中自定义拦截器的功能,实现登录检查。(避免不登录直接访问某个Action)
<url-pattern>/*</url-pattern>
</filter-mapping>
<display-name>WDF_INTERCEPTOR_6</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
return name;
}
public void setName(String name) {
= name;
}
public String getPassword() {
return password;
相关文档
最新文档