struts2拦截器的三种实现方式

原创 2015年07月10日 08:56:31
(一)
实现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;
	}
}

Struts2总结---实现Action三种方式(2)

Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现...
  • helongzhong
  • helongzhong
  • 2017年03月03日 16:36
  • 957

自己实现Struts2(六)实现参数拦截器并调试框架

上一章自己实现Struts2(五)实现StrutsPrepareAndExecuteFilter我把Struts2的核心拦截器StrutsPrepareAndExecuteFilter实现好了,现在其...
  • TimHeath
  • TimHeath
  • 2017年03月26日 20:29
  • 742

【Struts2】:拦截器实现方法过滤

众所周知,我们在使用Struts2进行项目开发的时候,如果为某个Action配置拦截器,那么这个拦截器就会拦截该Action内的所有方法。但是在有些情况下,我们不需要拦截所有的方法,只想拦截指定的方法...
  • u010929604
  • u010929604
  • 2016年05月31日 16:32
  • 1775

Struts2中的拦截器详解

拦截器是什么拦截器是一种可以在让用户在Action执行之前和Result执行之后进行一些功能处理的机制。 拦截器在action执行之前和result执行之后的顺序是相反的,可以看下图: 也就是说执...
  • u010870518
  • u010870518
  • 2015年05月24日 13:40
  • 3509

struts2自定义拦截器注解配置方法

自定义拦截器:package com.penjing.interceptor;import javax.servlet.http.HttpServletRequest;import net.sf.js...
  • u014655269
  • u014655269
  • 2015年04月19日 23:49
  • 1749

Struts学习总结(四)---简单模拟实现Struts2的拦截器

简单模拟实现Struts的拦截器
  • wu631464569
  • wu631464569
  • 2016年08月31日 10:02
  • 298

Struts2自定义登录验证拦截器

Controller.UserAction.java package Controller; import java.util.Map; import com.opensymphony.xwor...
  • u012997311
  • u012997311
  • 2016年01月04日 14:35
  • 661

struts2的token拦截器的原理及作用

众所周知struts2有着自己的token拦截器,主要是用于防止用户进行表单的重复提交的。但是一直没搞明白两个问题:token拦截器实现的原理是如何的?哪些action需要使用token拦截器去防止其...
  • u013068118
  • u013068118
  • 2015年04月01日 20:54
  • 2764

Struts2自定义拦截器实例—只允许从登录页面进入系统

【1】struts.xml: ...
  • yang_ai
  • yang_ai
  • 2016年07月31日 14:47
  • 534

谈一谈struts2和springmvc的拦截器

最近涉及到了两个项目,都需要考虑全局的拦截器,其功能就是判断session的登陆状态,如果session信息完好,可以从中取得相应的信息,则放行,否则拦截,进入重定向的uri。 既然是全局的拦截器,...
  • xinfei0803
  • xinfei0803
  • 2013年08月02日 11:09
  • 2804
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:struts2拦截器的三种实现方式
举报原因:
原因补充:

(最多只允许输入30个字)