struts2拦截器+监听器 .
一、拦截器是怎么实现:
实际上它是用Java中的动态代理来实现的
二、拦截器在Struts2中的应用
对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action……struts2内置的拦截器有很多,在此我就不一一列举了。
那么怎么在struts2中定义自己的拦截器呢?
很简单Struts2为我们提供了一个Interceptor接口,该接口源代码如下:
publicinterface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
1) init():在拦截器执行之前调用,主要用于初始化系统资源。
2) destroty():与init()对应,用于拦截器执行之后销毁资源。
3) intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了 action,则返回一个真正的,也就是该action中execute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。
通常我们使用拦截器并不需要申请资源,为此Struts2还为我们提供了一个AbstractInterceptor类,该类的init()和destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。
下面创建一个判断用户是否登录的拦截器。代码如下:
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
@SuppressWarnings("serial")
public class CheckLoginInterceptor extends AbstractInterceptor {
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("begin check login interceptor!");
// 检查Session中是否存在user
Map session = actionInvocation.getInvocationContext().getSession();
String username = (String) session.get("user");
if (username != null && username.length() > 0) {
// 存在的情况下进行后续操作。
System.out.println("already login!");
return actionInvocation.invoke();
} else {
// 否则终止后续操作,返回LOGIN
System.out.println("no login, forward login page!");
return Action.LOGIN;
}
}
}
创建好拦截器后,还不能使用,还需要我们在struts.xml中配置一下。
下面看一下怎么配置拦截器。
<interceptors>
<interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />
</interceptors>
这个定义好的拦截器在Action中怎么使用呢?使用方法很简单,如下:
<action name=" " class=" " >
<result> </result>
<interceptor-ref name="checkLogin" />
</action>
一旦我们为某个action引用了自定义的拦截器,struts2默认的拦截器就不会再起作用,因此还需要引用默认拦截器。
<action name=" " class=" " >
<result> </result>
<interceptor-ref name="checkLogin" />
<interceptor-ref name="defaultStack" />
</action>
但是我们这么做似乎也不太方便,因为如果拦截器checkLogin需要被多个action引用的话,每一个都要配置一遍太麻烦了。我们可以把它定义成默认的拦截器。
<interceptors>
<interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />
<!—-定义一个拦截器栈-->
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="checkLogin" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mydefault" />
参数问题:即<param../>的使用:
系统为拦截器指定参数有两个时机:
1.定义拦截器时指定参数值(通过<interceptor .../>元素来定义拦截器,参数就是它下面的<param name="参数">参数值</param>):这种参数值是拦截器这个参数的默认数值。
2.使用拦截器时指定参数值(通过<interceptor-ref.../>元素来使用拦截器参数就是它下面的<param name="参数">参数值</param>):这种参数值是当在Action中使用该拦截器时动态分配的参数值。
无论在哪里里面配置,他的值都是传给拦截器类。
另外,struts2还为我们提供了一个方法过滤的拦截器MethodFilterInterceptor类,该类继承 AbstractInterceptor类,重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。该类的使用方法很简单,跟上例类似,就不举例了。这个拦截器与以往的拦截器配置有所不同。那就是可以指定哪些方法需要被拦截,那些不需要。通常在引用该拦截器时指定。
<interceptor-ref name=" ">
<param name="exculdeMethods"></param>
<param name="includeMethods"></param>
</interceptor-ref>
exculdeMethods:是不被拦截的方法,如果有多个以逗号分隔。
includeMethods:需要被拦截的方法,如果有多个以逗号分隔。
上面两个参数,在MethodFilterInterceptor类中都有对应的方法。
如果一个方法同时在这两个方法中列出,则该方法会被拦截。
struts2中提供了这种方法过滤的拦截器有如下几个:
1.TokenInterceptor
2.TokenSessionStoreInterceptor
3.DefaultWorkflowInterceptor
4.ValudationInterceptor
三、覆盖特定拦截器的参数
<拦截器名>.<参数名>
<interceptor-ref name="my-stack">
<!--second为拦截器名,name为参数名-->
<param name="second.name">改名后的拦截器</param>
</interceptor-ref>
四、拦截结果的监听器
实现拦截结果的监听器首先必须现实com.opensymphony.xwork2.interceptor.PreResultListener类
并重写里面的方法beforeResult :
public class MyListener implements PreResultListener {
public void beforeResult(ActionInvocation invocation, String resultCode) {
System.out.println(resultCode);
}
}
参数介绍:
1.虽然beforeResult方法也获得ActionInvocation类型的参数,但通过这个参数来控制Action的作用已经不再明显--因为Action的execute方法已经执行结束了。
2.resultCode,这个参数就是被拦截Action的execute方法的返回值。
然后再在拦截器里面调用
invocation.addPreResultListener(new MyListener());
拦截器结果监听器是在系统处理Result之前,在execute之后执行的。
注意:不要在PreResultListener监听器的beforeResult方法中通过ActionInvocation参数调用invoke方法。否则容易造成死循环。
struts2拦截器+监听器 .的更多相关文章
- Struts2拦截器登录验证
Struts2拦截器 Struts2拦截器的概念和Spring Mvc拦截器一样. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截 ...
- 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载
一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ...
- struts2动态调用+Servlet过滤器+struts2拦截器
周末真的是懒到心慌...... 本文是在完整s2sh项目基础上添加的,不太了解s2sh项目构建的朋友可以先参考一下这几篇文章: eclipse环境下基于tomcat-7.0.82构建struts2项目 ...
- Struts2 拦截器配置以及实现
@(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...
- struts2 拦截器
拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
- struts2拦截器
一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...
- Struts2拦截器模拟
前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...
- Struts2拦截器初涉
Struts2拦截器初涉 正在练习struts,本例是从一个pdf上摘抄的例子,那本pdf都不知道叫什么名字,不过感觉很适合初学者. 在这里要实现一个简单的拦截器"GreetingInter ...
随机推荐
- Vno博客样式分享
不知不觉有一年多没有更新博客了,还是几位园友因为喜欢这套博客样式发了消息,否则我都快忘记自己还有一个博客了,哈哈. 言归正传,这套博客样式是当时闲来无事copy的iOS界喵神的博客Vno,确实很漂亮, ...
- JQuery-EasyUI DataGrid CRUD
ASP.NET使用EasyUI-DataGrid + ashx + JQuery Ajax:实现数据的增删查改,查询和分页! 数据表: 学生表:学生编号.姓名.性别.班级编号.年龄 班级表:班级编号. ...
- 【C++】递增递减操作符与指针的关系
可以将递增与递减操作符用于指针和基本变量,将递增操作符用于指针时,将把指针的值增加其指向的数据类型占用的字节数,这种规则适用于对指针递增和递减. int arr[5] = {21,32,23,45,3 ...
- Springmvc + mybatis + spring 配置,spring事物
今天配置了半天,发现,事物不起效果,主要出现如下错误: org.mybatis.spring.transaction.SpringManagedTransaction] - [JDBC Connect ...
- 清除浮动(clearfix hack)
eg:
- UI第一节—— UILable
1.首先说说怎么创建UI程序,打开xcode,选择Create a new Xcode project.看如下截图 2,接下来就蹦出一个和写OC应用差不多的界面,不多解释了 3.我给工程取得名字就叫 ...
- 给Windows + Apache 2.2 + PHP 5.3 安装PHP性能测试工具 xhprof_0.10.3_php53_vc9.dll
1.下载XHProf 到这里 http://dev.freshsite.pl/php-extensions/xhprof.html 下载Windows版本的XHProf,我这里选择下载 XHProf ...
- [原创]svn 常见错误总结
错误: Unable to make name in 'X:\nfs\drivers\can_uart\.svn\tmp' 解决: 改变当前文件夹的权限 linux 下显示修改的文件名 参考链接:ht ...
- Redis Windows下安装部署
下载Redis 在Redis的官网下载页上有各种各样的版本,我这次是在windows上部署的,要去GitHub上下载.我下载的是2.8.12版的,相信大家百度一下就可以搜到,这就是我们需要的: 启动R ...
- ACdream1063——平衡树
1.题目大意:让你设计一种数据结构,支持插入一个数,和在这个结构里查询结构中的哪个数和给定的数的异或值最小 2.分析:这个怎么做呢,就是trie树,我们建立一个trie树,把树按01进制存进去,然后在 ...