关闭

struts2拦截器的三种实现方式

标签: struts2简单拦截器
74人阅读 评论(0) 收藏 举报
分类:
(一)
实现Interceptor接口,接口中有三个方法,分别是init、destroy、intercept。其中init是用来初始化的,destroy是用来回收资源的,最主要的是intercept方法,声明为:String intercept(ActionInvocation invocation),接收一个ActionInvocation 类型的参数,从名字上看是调用action的,下面实现一个简单的拦截器:
首先,一个包含有用户名、密码和提交按钮的jsp页面:
<span style="white-space:pre">	</span><body>
		<s:form action="<span style="color:#cc0000;">user</span>">
			<s:textfield name="username" label="username"></s:textfield>
			</br>
			<s:password name="password" label="password"></s:password>
			</br>
			<s:submit value="submit"></s:submit>
		</s:form>
	</body>

定义拦截器,名字为Interceptor01,实现Interceptor接口:
public class Interceptor01 implements Interceptor {

	public void destroy() {
		System.out.println("destroy...");
	}
	public void init() {
		System.out.println("init...");
	}
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("before Interceptor");

		String result = invocation.invoke();
		
		System.out.println(result);
		
		System.out.println("after Interceptor");
		return result;
	}
}
其次,配置拦截器,在package标签中用<interceptors></interceptors>包含拦截器。
使用拦截器,根据name熟悉引用。其中,name为defaultStack的是默认拦截器,定义在struts-default包中。
然后,根据表单中的action去struts.xml寻找name为user的action。发现action中使用了拦截器,就去用inter1和defaultStack去拦截。但是去拦截谁呢?怎么拦截呢?以后再说。
<struts>
	 <package name="struts2" extends="struts-default">
		<interceptors>
			<interceptor name="inter1" class="struts.interceptor.Interceptor01"></interceptor>
		</interceptors>

		<action name="user" class="token.TokenAction">
			<result name="success">/token/result.jsp</result>

			<interceptor-ref name="inter1"></interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>

		</action>
	</package>
</struts>
下面是action文件:我们打印三句话,红色标记,分别为setUsername、setPassword、execute方法中,用来观察执行的顺序。
public class TokenAction extends ActionSupport {

	private String username;
	private String password;

	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
		System.out.println("set username : " + username);
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
                System.out.println("set password : " + password);
	}
	@Override
	public String execute() throws Exception {

		System.out.println("method execute invoked!");

		return SUCCESS;
	}
}
结果页面显示发过来的用户名和密码。
<body>
    <s:property value="username"/>
    <s:property value="password"/>
  </body>
执行结果为:
before Interceptor
set password : 1234
set username : 张三
method execute invoked!
success
after Interceptor

(二)
拦截器继承AbstractInterceptor父类,以下为AbstractInterceptor源代码:
/**
 * Provides default implementations of optional lifecycle methods
 */
public abstract class AbstractInterceptor implements Interceptor {

    /**
     * Does nothing
     */
    public void init() {
    }
    
    /**
     * Does nothing
     */
    public void destroy() {
    }


    /**
     * Override to handle interception
     */
    public abstract String intercept(ActionInvocation invocation) throws Exception;
}
AbstractInterceptor类空实现了Interceptor接口中的init和destroy方法,然后让我们继续实现intercept方法,和第一种一样,只需修改struts.xml文件的实现类:
<interceptors>
		<interceptor name="inter1" class="struts.interceptor2.Interceptor2"</interceptor>
</interceptors>
定义拦截器类:
public class Interceptor2 extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub

		System.out.println("before invocation");

		String result = invocation.invoke();

		System.out.println(result);
		System.out.println("after invocation");

		return null;
	}
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:220次
    • 积分:30
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档