首页写一个自定义的拦截器类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。
一个简单的拦截器已经配置完成。
分享到:
相关推荐
这篇博客文章“struts2 以注解的形式实现拦截器”主要探讨了如何利用注解来配置和使用Struts2的拦截器,而不是传统的XML配置方式。 首先,我们来看一下什么是拦截器。在Struts2框架中,拦截器是一个实现了`...
下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应的路径指向。 一、Struts2 中的 Action 在 Struts2 中,Action 是处理用户请求的核心组件。Action ...
在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...
该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。
通过分析和学习这个示例,你将更深入地理解如何在Struts 2中结合拦截器和注解实现日志审计。此外,还可以根据实际需求扩展拦截器,比如添加对请求参数的记录、对异常处理的特殊日志记录等。 总之,利用Struts 2的...
总的来说,通过Struts2的拦截器注解,我们可以更加灵活、高效地管理Action的生命周期,同时减少了配置文件的复杂性。结合合理的源代码组织和Web应用结构,能够构建出易于维护和扩展的Java Web应用。
Struts2的拦截器可以通过XML或注解两种方式进行配置: - XML配置:在`struts.xml`文件中,使用`<interceptor>`元素定义拦截器,`<interceptor-stack>`元素组合多个拦截器,`<package>`元素下的`interceptors`属性...
3. **配置拦截器**:拦截器可以通过Struts2配置文件或注解进行配置,指定在哪些Action上使用哪些拦截器。 ### 二、单个Action配置拦截器实例 1. **创建拦截器**:首先,我们需要创建一个实现了`Interceptor`接口的...
Struts2中的拦截器可以通过XML配置文件或注解进行声明。例如,`struts-default.xml`中包含了默认的拦截器栈,如`params`拦截器用于处理请求参数,`exception`拦截器用于处理异常,`validation`拦截器进行数据校验。 ...
- 在Struts2中,拦截器是一个实现了`Interceptor`接口的类,它通过`ActionInvocation`对象来控制动作的执行流程。拦截器链是由多个拦截器按照指定顺序组成的,每个拦截器都可以在执行动作之前或之后进行操作。 2. ...
总结来说,Struts2拦截器是实现业务逻辑增强和控制流程的重要组件,它基于Java的动态代理机制。通过在Action执行前后插入自定义代码,拦截器使得我们可以方便地进行如日志记录、权限验证等操作,而无需直接修改...
总的来说,Struts2的核心拦截器是其实现灵活、可扩展架构的关键,通过拦截器,开发者能够方便地添加额外的功能,而无需侵入Action的业务逻辑。了解并熟练运用这些拦截器,对于提高代码质量、简化项目维护具有重要...
Struts2是一个强大的Java ...总结来说,Struts2的类型转换、拦截器和校验机制是构建健壮、可维护的Java web应用程序的重要工具。理解并熟练运用这些概念,能让你更好地利用Struts2框架,提高开发效率,确保应用的质量。
通过阅读和分析这些代码,你可以深入理解Struts2如何协调Action、视图和数据层来完成CRUD操作,以及如何利用拦截器来增强应用程序的功能和性能。 总结来说,这个项目是一个学习和实践Struts2框架基础功能的好资源。...
通过拦截器,我们可以添加自定义逻辑来验证文件类型。 文件下载则是将服务器上的文件发送到客户端的过程。在Struts2中,我们可以通过`StreamResult`结果类型来实现。`StreamResult`会将文件内容流式传输到浏览器,...
总结来说,Struts2拦截器是实现登录验证和其他预处理逻辑的强大工具。通过自定义拦截器,我们可以灵活地控制请求流程,确保只有经过验证的用户才能访问受保护的资源。结合实际的代码示例和配置,我们可以更好地理解...
通过以上详细介绍,我们了解了Struts2中的拦截器和验证框架的基本概念、如何创建自定义拦截器以及如何配置拦截器和使用验证功能。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和使用Struts2框架。
Struts2是一个强大的Java Web框架,它通过提供一系列的拦截器(Interceptors)来实现灵活的控制流程,增强MVC模式的功能。拦截器是Struts2框架的核心组件之一,它们在Action调用前后执行,提供了诸如日志记录、权限...
总的来说,通过 Struts2 的拦截器机制,我们可以实现高效且可复用的登录验证功能,有效地控制用户访问权限,提高系统的安全性。同时,通过合理的配置和页面设计,可以确保用户体验的流畅性。这种基于拦截器的登录...
Struts拦截器是Java Web开发中的一个重要概念,尤其在基于Struts2框架的应用中,它扮演着处理...通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目中实现更高效、灵活的控制流。