您的位置:首页 > 编程语言 > Java开发

Struts2自定义拦截器

2014-11-30 01:23 447 查看
作者:禅楼望月

尽管Struts2已经内置了很多的拦截器,但是有时这些拦截器可能不能满足我们的需求,这时我们就必须自定义我们自己的拦截器。

如果我们要创建自己的拦截器,则必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
// 在拦截器实例销毁之前被调用,主要用于销毁在 init() 中打开的资源
}

@Override
public void init() {
/* 拦截器实例化之后,拦截器执行拦截之前,系统将回调该方法。对于每个拦截器,
该方法只被执行一次,和Servlet的init方法一样。因此方法主要用于初始化性资源。*/
}

@Override
public String intercept(ActionInvocation invocation) throws Exception {
/* 这里执行拦截动作,和Action的execute方法一样,该方法返回一个字符串,作为
* 逻辑视图。如果该方法直接返回了一个字符串,系统则直接跳到该字符串所对应的页面,
* 而不会调用被拦截的Action,该方法的参数invocation包含了被拦截的Action
* 的引用,可以通过调用该参数的invoke方法,将控制权转给下一个拦截器,或者转给Action的execute方法*/
return null;
}
}

如果我们的拦截器不需要打开资源则可以使用com.opensymphony.xwork2.interceptor.AbstractInterceptor类,该类为我们实现了init()和destroy()方法,我们只需要实现intercept方法即可。

如,实现这样一个拦截器:登陆的时候验证用户名如果为“毛爷爷”,则转到错误页面,否则为请求添加一个日期的属性:

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.stbc.web.Action.LoginAction;

public class InterceptorHello extends AbstractInterceptor {
private static final long serialVersionUID = -5407269431454126006L;

private String name;

public void setName(String name) {
this.name = name;
}

@Override
public String intercept(ActionInvocation invocation) throws Exception {
HttpServletRequest request=ServletActionContext.getRequest();
if(request.getParameter("username").equals("毛爷爷")){
return "error";
}else {
request.setAttribute("datetime", new Date());
LoginAction action=(LoginAction) invocation.getAction();
return action.execute();
}
}
}
实用的方法和使用内置拦截器的方法一样:

<package name="loginPackage" extends="struts-default"  namespace="/login">
<interceptors>
<interceptor name="interceptormaoyeye" class="test.InterceptorHello">
<param name="name">你好!</param>
</interceptor>
</interceptors>
<action name="login" class="com.stbc.web.Action.LoginAction">
<result name="success">welcome.jsp</result>
<result name="error">welcome.jsp</result>
<interceptor-ref name="interceptormaoyeye">
<!-- 这里使用了反射的方法,实际上调用的是拦截器类的setName方法 -->
<param name="name">覆盖了默认值</param>
</interceptor-ref>
</action>
</package>


欢迎转载,请注明出处.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: