- 浏览: 133124 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
酱油男js:
不错...学习了。
oracle sql 优化大全 -
浪子秋水:
网页编码就是那点事 -
shenghuorulan:
通俗易懂。好文章,直接想到的问题都提到了。
oracle 全文检索实践 -
飞儿9530:
lucene 3.0.1 学习
来源地址:http://www.blogjava.net/nokiaguy/archive/2008/05/09/199587.html
在上一篇中介绍了 Struts2拦截器的原理,在这一篇中我们将学习一下如何编写自己的拦截器。
一、拦截器的实现
实现一个拦截器非常简单。实际上,一个拦截器就是一个普通的类,只是这个类必须实现
com.opensymphony.xwork2.interceptor.Interceptor
接口。
Interceptor
接口有如下三个方法:
{
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
其中 init和 destroy方法只在拦截器加载和释放(都由 Struts2自身处理)时执行一次。而 intercept方法在每次访问动作时都会被调用。 Struts2在调用拦截器时,每个拦截器类只有一个对象实例,而所有引用这个拦截器的动作都共享这一个拦截器类的对象实例,因此,在实现 Interceptor接口的类中如果使用类变量,要注意同步问题。
下面我们来实现一个简单的拦截器,这个拦截器通过请求参数 action指定一个拦截器类中的方法,并调用这个方法(我们可以使用这个拦截器对某一特定的动作进行预处理)。如果方法不存在,或是 action参数不存在,则继续执行下面的代码。如下面的 URL:
http://localhost:8080/struts2/test/interceptor.action?action=test
访问上面的 url后,拦截器会就会调用拦截器中的 test方法,如果这个方法不存在,则调用 invocation.invoke方法, invoke方法和 Servlet过滤器中调用 FilterChain.doFilter方法类似,如果在当前拦截器后面还有其他的拦截器,则 invoke方法就是调用后面拦截器的 intercept方法,否则, invoke会调用 Action类的 execute方法(或其他的执行方法)。
下面我们先来实现一个拦截器的父类
ActionInterceptor。这个类主要实现了根据
action参数值来调用方法的功能,代码如下:
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();
}
}
从上面代码中的 intercept方法可以看出,在调用 action所指定的方法后,来判断返回值。可能发生的情况有三种:
1. 返回值为 null,执行 return null。
2. 返回值为 INVOKE,执行 return invockation.invoke() 。
3. 其他情况,执行 return result。 result表示指定方法的返回值,如上面代码所示。
在实现完上面的拦截器父类后,任何继承于
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 ;
}
}
test方法返回了
INVOKE,因此,在执行完这个方法后,
Struts2会接着调用其他拦截器的
intercept方法或
Action类的
execute方法。而
print方法在执行完后,只是返回了
null,而不再调用其他的方法了,也就是访问如下的
url时,动作的
execute方法将不会执行:
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 ;
}
}
在这个 Action类中,只有一个 abcd方法,实际上,这个方法相当于 execute方法,在下面会设置动作的 method属性为 abcd。下面我们来在 struts.xml中定义拦截器类和动作,代码如下:
<! 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 >
在配置上面的 methodStack拦截器时要注意,最好在后面引用 defaultStack,否则很多通过拦截器提供的功能将失去。
OK,现在访问如下的
URL:
http://localhost:8080/struts2/test/ddd.action?action=test
在浏览器中将会出现如下的字符串:
invoke test
invoke abcd
而如果访问
http://localhost:8080/struts2/test/ddd.action?action=print,将会只出现如下的字符串:
invoke print
大家可以看出,访问这个 url时并没有调用 abcd方法。如果随便指定的 action值的话,则只调用 abcd方法,如访问 http://localhost:8080/struts2/test/ddd.action?action=aaa,就只会输出 invoke abcd。
二、拦截器的参数
我们在使用很多
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 >
再次访问 http://localhost:8080/struts2/test/ddd.action?action=test, Struts2 就会调用 MyFilterInterceptor的 doIntercept方法来输出 name属性值。如果将上面的 includeMethods参数值中的 abcd去掉,则 Action类的 abcd方法不会被执行。
发表评论
-
linux重启oracle 各种方法
2013-01-15 09:53 1282来自 : http://blog.sina.com.cn/s/ ... -
SVN服务器配置
2013-01-10 22:49 1226来自:http://air-blue55.blog.163.c ... -
网页编码就是那点事
2012-11-24 16:10 941来自 : http://www.kuqin.com/webpa ... -
Tomcat 配置 CAS 的一个问题。unable to find valid certification path to requested target
2012-11-11 21:40 1536来自: http://blog.csdn.net/cool_ ... -
Tomcat SSL配置大全
2012-11-11 21:02 1215来源: http://www.iteye.com/topi ... -
Html中td自动换行问题
2012-10-25 17:57 1016来自:http://blog.csdn.net/dududu0 ... -
oracle 全角、半角转换,和oracle 的 DUMP函数
2012-06-18 09:56 2086to_single_byte(c)转换成半角 to_multi ... -
tomcat sso 配置
2012-05-29 23:18 1637源: http://www.oecp.cn/hi/single ... -
Hibernate 利用配置文件配置HQL/SQL
2012-05-21 17:14 1805Query.hbm.xml <?xml version= ... -
CAS工作流程
2012-05-19 22:25 1581CAS3.0的工作流程: 0.app将用户转发到CAS处, 并 ... -
jforum 表目录
2012-04-18 18:37 2944目 录 1、附件关系表JFORUM_ATTACH 2 2、附件 ... -
Jfroum集成cas单点登录
2012-04-17 21:35 15211.安装CAS 下载cas server ,设置好服务器端, ... -
JForum登录用例
2012-04-15 22:59 60701,键入用户名、密码,单击“登入”按钮,登录请求发送到/JFo ... -
tinyMCE 详细文档
2012-03-28 10:57 2125http://www.iwms.net/n2065c17.as ... -
JBPM3.1.4 相关表的 意义
2012-03-18 22:54 1002JBPM_ACTION action记录表 JBPM_DEC ... -
JBPM环境配置
2012-03-18 18:56 1824jBPM 需要数据库支持, j ... -
xfire 编写webservice例子
2012-02-23 16:51 1057来自 : http://www.blogjava.net/j ... -
ArrayUtils常用的用法
2012-02-21 10:51 1570// 1.打印数组 ArrayUtils.toString(n ... -
Tomcat自动缓存context.xml,导致在eclipse中修改后,不能立即启作用
2012-02-18 11:56 1776http://blog.csdn.net/shiqidide/ ... -
JavaScript CSS Style属性对照表
2012-02-11 22:36 1096CSS语法 (不区分大小写) JavaScript语法 (区分 ...
相关推荐
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
Struts2拦截器实现权限控制demo,我感觉对初学者还是有一定帮助的
Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序
使用Struts2实现用户权限拦截、重点是掌握拦截器的使用和配置方法,通过案例的学习,就能掌握struts中拦截器的使用方法,让我们能快速上手
Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt
运用struts2的拦截器技术实现的页面检测拦截非法用户饿坏指定用户注册。。。
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按...
struts2,Interceptor struts2拦截器实例,两套实例,一套是针对单个的action配置的,另一套实例是针对全局的action配置的拦截器interceptor
关于struts2 拦截器的详细的解释及其在开发中对struts2的拦截器的应用和拦截器在框架中的作用.
基于struts2的拦截器测试,实现了页面的跳转,中间过程的拦截
使用struts的拦截器拦截一些敏感性的词或一些非法或不文秘的言论
struts2 用拦截器 实现用户权限登录 可以直接运行,只单单用到struts的东西。
struts2常用拦截器,struts2经常用到的拦截器,熟悉熟悉
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
创建自己struts2拦截器,手工创建自己的拦截器实现
解决Struts2中的中文乱码。该代码是用作Struts2的拦截器中
该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。
struts2 Interceptor拦截器 http://whitewolf.0fees.net
浅谈Struts2拦截器的原理与实现.docx
struts2拦截器应用小例子,与大家共分享