`

Struts2通过注解来实现拦截器

阅读更多
首页写一个自定义的拦截器类MyInterceptor,实现Interceptor接口(或者继承自AbstractInterceptor)的类。
Interceptor接口声明了三个方法:
public interface Interceptor extends Serializable {
 
    void destroy();
 
    void init();
 
    String intercept(ActionInvocation invocation) throws Exception;
}

nit方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,
使用这个方法可以给拦截器类做必要的初始话操作。

Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。

Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用
invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。
如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:
public abstract class AbstractInterceptor implements Interceptor {
 
     public void init() {
    }
   
    public void destroy() {
    }
 
 
    public abstract String intercept(ActionInvocation invocation) throws Exception;
}

在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。

我们尝试编写一个拦截器,该拦截器,代码为:

package com.sunny.action;

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

public class MyInterceptor implements Interceptor {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public void init() {
		System.out.println("init");
	}

	@Override
	public String intercept(ActionInvocation invoker) throws Exception {
		System.out.println("intercept");

		String result = invoker.invoke();

		return result;
	}

	@Override
	public void destroy() {
		System.out.println("destory");
	}
}

然后定义在struts.xml中注册拦截器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<!-- 请求参数的编码方式 -->
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<package name="custom-default" extends="struts-default">

		<interceptors>
			<interceptor name="annotationInterceptor" class="com.sunny.action.MyInterceptor" />
			<interceptor-stack name="annotatedStack">
				<interceptor-ref name="annotationInterceptor" />
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>
		 <!-- 设置全局 全局默认的拦截器栈-->  
        <default-interceptor-ref name="annotatedStack"></default-interceptor-ref> 
        
	</package>

</struts>    

最后在Action类中通过注解引用
package com.sunny.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ExceptionMapping;
import org.apache.struts2.convention.annotation.ExceptionMappings;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;
import com.sunny.entity.Users;

@ParentPackage("custom-default")
@Namespace("/login")
// 公共异常捕获
@ExceptionMappings({ @ExceptionMapping(exception = "java.lang.Exception", result = "exception") })
// 拦截器
@InterceptorRefs({ @InterceptorRef("annotatedStack") })
public class LoginAction extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Users users;

	public Users getUsers() {
		return users;
	}

	public void setUsers(Users users) {
		this.users = users;
	}

	@Action(value = "add", results = {
			@Result(name = "success", location = "/a.jsp"),
			@Result(name = "error", location = "/index.jsp") })
	@Override
	public String execute() throws Exception {
		if (users.getUsername().equals("sunny")
				&& users.getPassword().equals("sunny")) {
			return "success";
		} else {
			return "error";
		}
	}
}

完成后启动服务就可以看到自定义的拦截器输出init
在浏览器中输入:http://localhost:8080/Struts2/login/add.action调用execute()后会看到输出intercept。之后停止服务会看到输出destory。

一个简单的拦截器已经配置完成。
分享到:
评论
1 楼 peter2009 2013-03-19  
@Resource(name="loginfoInteception")
@Scope("prototype")
@SuppressWarnings("serial")
public class LoginfoForHTTPInterceptor extends MethodFilterInterceptor {


<interceptors> 
		    <!--日志拦截器--> 
			<interceptor name="loginfoInteception" class="loginfoInterceptor" /> 
			<!-- 定义一个拦截器栈 --> 
			<interceptor-stack name="sxStack"> 
				<interceptor-ref name="loginfoInteception"/> 
			    <!--默认拦截器--> 
				<interceptor-ref name="defaultStack"/> 
			</interceptor-stack> 
		</interceptors> 
		<default-interceptor-ref name="sxStack" /> 



我用注解写了一个拦截器 为什么在启动tomcat的时候报错了呢

错误如下
3609 2013-03-19 09:13:29 com.opensymphony.xwork2.config.providers.XmlConfigurationProvider DEBUG -Loaded [BUILDER] {PackageConfig Name:coreaction namespace:/back/jsp/core parents:[{PackageConfig Name:struts-default namespace: parents:[]}]}
3615 2013-03-19 09:13:29 com.opensymphony.xwork2.config.providers.InterceptorBuilder WARN -Unable to load config class loginfoInterceptor at interceptor - file:/E:/WorkProject/LSHPharse2/SXFrameWork/WebRoot/WEB-INF/classes/com/sx/core/action/sx-core.xml:9:72 probably due to a missing jar, which might be fine if you never plan to use the loginfoInteception interceptor
3617 2013-03-19 09:13:29 com.opensymphony.xwork2.config.providers.InterceptorBuilder ERROR -Actual exception
Caught Exception while registering Interceptor class loginfoInterceptor - interceptor - file:/E:/WorkProject/LSHPharse2/SXFrameWork/WebRoot/WEB-INF/classes/com/sx/core/action/sx-core.xml:9:72
at com.opensymphony.xwork2.ObjectFactory.buildInterceptor(ObjectFactory.java:214)
at com.opensymphony.xwork2.config.providers.InterceptorBuilder.constructInterceptorReference(InterceptorBuilder.java:70)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.lookupInterceptorReference(XmlConfigurationProvider.java:1101)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptorStack(XmlConfigurationProvider.java:918)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptorStacks(XmlConfigurationProvider.java:931)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptors(XmlConfigurationProvider.java:954)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:522)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:290)
at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:239)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:429)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:471)
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4071)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4725)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.ClassNotFoundException: loginfoInterceptor
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:152)
at com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:108)
at com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance(SpringObjectFactory.java:233)
at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:153)
at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
at com.opensymphony.xwork2.ObjectFactory.buildInterceptor(ObjectFactory.java:192)
... 32 more

相关推荐

Global site tag (gtag.js) - Google Analytics