`

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

相关推荐

    struts2 以注解的形式实现拦截器

    这篇博客文章“struts2 以注解的形式实现拦截器”主要探讨了如何利用注解来配置和使用Struts2的拦截器,而不是传统的XML配置方式。 首先,我们来看一下什么是拦截器。在Struts2框架中,拦截器是一个实现了`...

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应的路径指向。 一、Struts2 中的 Action 在 Struts2 中,Action 是处理用户请求的核心组件。Action ...

    Struts2学习案例(拦截器)

    在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...

    struts2注解与拦截器demo

    该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。

    使用struts拦截器+注解实现日志审计功能

    通过分析和学习这个示例,你将更深入地理解如何在Struts 2中结合拦截器和注解实现日志审计。此外,还可以根据实际需求扩展拦截器,比如添加对请求参数的记录、对异常处理的特殊日志记录等。 总之,利用Struts 2的...

    Struts2 拦截器注解(二十七)

    总的来说,通过Struts2的拦截器注解,我们可以更加灵活、高效地管理Action的生命周期,同时减少了配置文件的复杂性。结合合理的源代码组织和Web应用结构,能够构建出易于维护和扩展的Java Web应用。

    Struts2拦截器及其用法详细说明

    Struts2的拦截器可以通过XML或注解两种方式进行配置: - XML配置:在`struts.xml`文件中,使用`&lt;interceptor&gt;`元素定义拦截器,`&lt;interceptor-stack&gt;`元素组合多个拦截器,`&lt;package&gt;`元素下的`interceptors`属性...

    struts2 拦截器实例

    3. **配置拦截器**:拦截器可以通过Struts2配置文件或注解进行配置,指定在哪些Action上使用哪些拦截器。 ### 二、单个Action配置拦截器实例 1. **创建拦截器**:首先,我们需要创建一个实现了`Interceptor`接口的...

    Struts2拦截器源码

    Struts2中的拦截器可以通过XML配置文件或注解进行声明。例如,`struts-default.xml`中包含了默认的拦截器栈,如`params`拦截器用于处理请求参数,`exception`拦截器用于处理异常,`validation`拦截器进行数据校验。 ...

    一个Struts2的核心拦截器例子

    - 在Struts2中,拦截器是一个实现了`Interceptor`接口的类,它通过`ActionInvocation`对象来控制动作的执行流程。拦截器链是由多个拦截器按照指定顺序组成的,每个拦截器都可以在执行动作之前或之后进行操作。 2. ...

    Struts2 拦截器 和 Java 中的动态代理

    总结来说,Struts2拦截器是实现业务逻辑增强和控制流程的重要组件,它基于Java的动态代理机制。通过在Action执行前后插入自定义代码,拦截器使得我们可以方便地进行如日志记录、权限验证等操作,而无需直接修改...

    struts2学习笔记十(第10讲.Struts2的核心 拦截器)

    总的来说,Struts2的核心拦截器是其实现灵活、可扩展架构的关键,通过拦截器,开发者能够方便地添加额外的功能,而无需侵入Action的业务逻辑。了解并熟练运用这些拦截器,对于提高代码质量、简化项目维护具有重要...

    struts2类型转换 拦截器 校验的例子

    Struts2是一个强大的Java ...总结来说,Struts2的类型转换、拦截器和校验机制是构建健壮、可维护的Java web应用程序的重要工具。理解并熟练运用这些概念,能让你更好地利用Struts2框架,提高开发效率,确保应用的质量。

    struts2 实现增删改查。以及拦截器的功能实现源码

    通过阅读和分析这些代码,你可以深入理解Struts2如何协调Action、视图和数据层来完成CRUD操作,以及如何利用拦截器来增强应用程序的功能和性能。 总结来说,这个项目是一个学习和实践Struts2框架基础功能的好资源。...

    Struts2全注解方式实现文件上传与下载

    通过拦截器,我们可以添加自定义逻辑来验证文件类型。 文件下载则是将服务器上的文件发送到客户端的过程。在Struts2中,我们可以通过`StreamResult`结果类型来实现。`StreamResult`会将文件内容流式传输到浏览器,...

    利用struts2拦截器做的简单登录

    总结来说,Struts2拦截器是实现登录验证和其他预处理逻辑的强大工具。通过自定义拦截器,我们可以灵活地控制请求流程,确保只有经过验证的用户才能访问受保护的资源。结合实际的代码示例和配置,我们可以更好地理解...

    struts2拦截器和验证框架(适合初学者-经藏版)

    通过以上详细介绍,我们了解了Struts2中的拦截器和验证框架的基本概念、如何创建自定义拦截器以及如何配置拦截器和使用验证功能。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和使用Struts2框架。

    struts2中拦截器的使用

    Struts2是一个强大的Java Web框架,它通过提供一系列的拦截器(Interceptors)来实现灵活的控制流程,增强MVC模式的功能。拦截器是Struts2框架的核心组件之一,它们在Action调用前后执行,提供了诸如日志记录、权限...

    基于ssh拦截器框架Struts2拦截器的登录验证实现

    总的来说,通过 Struts2 的拦截器机制,我们可以实现高效且可复用的登录验证功能,有效地控制用户访问权限,提高系统的安全性。同时,通过合理的配置和页面设计,可以确保用户体验的流畅性。这种基于拦截器的登录...

    Struts拦截器案例——登陆

    Struts拦截器是Java Web开发中的一个重要概念,尤其在基于Struts2框架的应用中,它扮演着处理...通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目中实现更高效、灵活的控制流。

Global site tag (gtag.js) - Google Analytics