Struts2教程9:实现自已的拦截器
实现一个拦截器非常简单。实际上,一个拦截器就是一个普通的类,只是这个类必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。Interceptor接口有如下三个方法:
{
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import javax.servlet.http.*;
import org.apache.struts2.*;
public class ActionInterceptor implements Interceptor
{
protected final String INVOKE = "##invoke";
public void destroy()
{
System.out.println("destroy");
}
public void init()
{
System.out.println("init");
}
public String intercept(ActionInvocation invocation) throws Exception
{
HttpServletRequest request = ServletActionContext.getRequest();
String action = request.getParameter("action");
System.out.println(this.hashCode());
if (action != null)
{
try
{
java.lang.reflect.Method method = this.getClass().getMethod(action);
String result = (String)method.invoke(this);
if(result != null)
{
if(!result.equals(INVOKE))
return result;
}
else
return null;
}
catch (Exception e)
{
}
}
return invocation.invoke();
}
}
在实现完上面的拦截器父类后,任何继承于ActionInterceptor类的拦截器都可以自动根据action的参数值调用自身的相应方法。下面我们来实现一个拥有两个动作方法test和print的拦截器类。代码如下:
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
public class MultiMethodInterceptor extends ActionInterceptor
{
public String test() throws Exception
{
HttpServletResponse response = ServletActionContext.getResponse();
response.getWriter().println("invoke test");
return this.INVOKE;
}
public String print() throws Exception
{
HttpServletResponse response = ServletActionContext.getResponse();
response.getWriter().println("invoke print");
return null;
}
}
http://localhost:8080/struts2/test/ddd.action?action=print
下面我们来实现一个Action类,代码如下:
import org.apache.struts2.*;
import com.opensymphony.xwork2.ActionSupport;
public class InterceptorAction extends ActionSupport
{
public String abcd() throws Exception
{
ServletActionContext.getResponse().getWriter()
.println("invoke abcd");
return null;
}
}
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="demo" extends="struts-default" namespace="/test">
<interceptors>
<interceptor name="method" class="interceptor.MultiMethodInterceptor" />
<interceptor-stack name="methodStack">
<interceptor-ref name="method" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<action name="interceptor" class="action.InterceptorAction" method="abcd">
<interceptor-ref name="methodStack" />
</action>
</package>
</struts>
http://localhost:8080/struts2/test/ddd.action?action=test
invoke test
invoke print
二、拦截器的参数
我们在使用很多Struts2内置的拦截器时会发现有很多拦截器都带参数,当然。我们自己做的拦截器也可以加上同样的参数。有两个参数比较常用,这两个参数是includeMethods和excludeMethods,其中includeMethods指定了拦截器要调用的Action类的执行方法(默认是execute),也就是说,只有在includeMethods中指定的方法才会被Struts2调用,而excludeMethods恰恰相反,在这个参数中指定的执行方法不会被Struts2调用。如果有多个方法,中间用逗号(,)分隔。在Struts2中提供了一个抽象类来处理这两个参数。这个类如下:
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor
如有继承于这个类的拦截器类都会自动处理includeMethods和excludeMethods参数,如下面的拦截器类所示:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.*;
public class MyFilterInterceptor extends MethodFilterInterceptor
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception
{
System.out.println("doIntercept");
System.out.println(name);
return invocation.invoke();
}
}
MethodFilterInterceptor的子类需要实现doIntercept方法(相当于Interceptor的intercept方法),如上面代码所示。在上面的代码中还有一个name属性,是为了读取拦截器的name属性而设置的,如下面的配置代码所示:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="demo" extends="struts-default" namespace="/test">
<interceptors>
<interceptor name="method" class="interceptor.MultiMethodInterceptor" />
<interceptor name="filter"
class="interceptor.MyFilterInterceptor">
<param name="includeMethods">abcd</param>
<param name="name">中国</param>
</interceptor>
<interceptor-stack name="methodStack">
<interceptor-ref name="method" />
<interceptor-ref name="filter" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<action name="interceptor" class="action.InterceptorAction" method="abcd">
<interceptor-ref name="methodStack" />
</action>
</package>
</struts>
Struts2教程9:实现自已的拦截器相关推荐
- MVC教程第六篇:拦截器
MVC教程第六篇:拦截器 摘要 本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 ...
- 【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【拦截器机制】
[Java EE (Struts2 + Spring + Hibernate)开发]:Struts2(二)之[拦截器机制] 本文地址:http://blog.csdn.net/shanglianlm/ ...
- Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】
什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...
- Struts2学习笔记(九) 拦截器(Interceptor)(下)
拦截器的查找顺序 如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢: (1) 首先查找当前Action是否声明了拦截器,如果有则使用这个拦截器,不再继续寻找,如果没有,则执行下一 ...
- Struts2自定义类型转换器、自定义拦截器和用户输入数据的验证
一.自定义类型转换器 1.编写一个类,继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter 2.覆盖掉其中的public Obj ...
- Struts2学习笔记(八) 拦截器(Interceptor)(上)
什么是拦截器(Interceptor) 拦截器是struts2框架最重要的特性之一.它可以让你在Action 方法执行前后(Result执行之后)进行一些功能处理.在前面学习Action和学习Resu ...
- struts2教程(7)--拦截器
Struts2拦截器 一.拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链 ...
- Struts2拦截器的使用
如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了str ...
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
最新文章
- File Filter用法
- Animation动画:
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
- python网络爬虫爬取房价信息
- C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序...
- 【阿里架构设计思想】一线互联网系统的核心架构是什么样子的?淘宝系统架构演进之路
- css fix 手机端,移动端布局fixed问题解决方案
- 一个很Low的通讯录管理系统(但是能用)C/C++单链表实现
- JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案
- 代码行数统计工具SourceCounter
- Linux之whereis命令
- NC65安装手册、NC65授权教程
- centos老是自动更换ip地址解决方案
- confluence 无法保存页面 排错记录
- 现代密码学-密钥管理技术
- win7系统访问局域网中的wamp服务器
- 2019东南大学计算机考研录取,东南大学2019年硕士研究生拟录取名单公示-不带成绩...
- ug后处理如何加密_UG后处理修改方法
- 阿里测试左移和开发赋能分享
- 大学计算机基础第三版重要知识点,大一大学计算机基础课程知识点
热门文章
- properties 特有的方法
- 计算机是一种在什么控制下 自动高速,计算机是一种能对数字化信息进行自动高速运算的通用处....ppt...
- Linux实验四:编译和调试工具的使用
- mysql书写规则_每天10分钟带你学会MySQL(二)SQL语句的基本书写规则
- python异常处理_Python入门 断言与异常处理
- 使用百度大脑,导入aip以及相应的库文件报错问题
- macos 10.15 django2.2+apache2.4+ladon+wsgi写webseverice接口
- predict_16x16[i_mode]( p_dst, i_stride )lowres
- PartitionMotionSearch()
- VUE:解决 [Vue warn]: Error in render: “TypeError: item.slice is not a function“ (取部分数据)