Struts2教程9:实现自已的拦截器

在上一篇中介绍了Struts2拦截器的原理,在这一篇中我们将学习一下如何编写自己的拦截器。

一、拦截器的实现

实现一个拦截器非常简单。实际上,一个拦截器就是一个普通的类,只是这个类必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。Interceptor接口有如下三个方法:

public interface Interceptor extends Serializable
{
    void destroy();
    void init();
    String intercept(ActionInvocation invocation) throws Exception;
}

其中init和destroy方法只在拦截器加载和释放(都由Struts2自身处理)时执行一次。而intercept方法在每次访问动作时都会被调用。Struts2在调用拦截器时,每个拦截器类只有一个对象实例,而所有引用这个拦截器的动作都共享这一个拦截器类的对象实例,因此,在实现Interceptor接口的类中如果使用类变量,要注意同步问题。

下面我们来实现一个简单的拦截器,这个拦截器通过请求参数action指定一个拦截器类中的方法,并调用这个方法(我们可以使用这个拦截器对某一特定的动作进行预处理)。如果方法不存在,或是action参数不存在,则继续执行下面的代码。如下面的URL:

http://localhost:8080/struts2/test/interceptor.action?action=test

访问上面的url后,拦截器会就会调用拦截器中的test方法,如果这个方法不存在,则调用invocation.invoke方法,invoke方法和Servlet过滤器中调用FilterChain.doFilter方法类似,如果在当前拦截器后面还有其他的拦截器,则invoke方法就是调用后面拦截器的intercept方法,否则,invoke会调用Action类的execute方法(或其他的执行方法)。

下面我们先来实现一个拦截器的父类ActionInterceptor。这个类主要实现了根据action参数值来调用方法的功能,代码如下:

package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import javax.servlet.http.*;
import org.apache.struts2.*;
public class ActionInterceptor implements Interceptor
{
    protected final String INVOKE = "##invoke";

    public void destroy()
    {
        System.out.println("destroy");
    }
    public void init()
    {
        System.out.println("init");
    }
    public String intercept(ActionInvocation invocation) throws Exception
    {
        HttpServletRequest request = ServletActionContext.getRequest();
        String action = request.getParameter("action");
        System.out.println(this.hashCode());
        if (action != null)
        {
            try
            {
                java.lang.reflect.Method method = this.getClass().getMethod(action);
                String result = (String)method.invoke(this);
                if(result != null)
                {
                    if(!result.equals(INVOKE))
                        return result;
                }
                else
                    return null;
            }
            catch (Exception e)
            {
            }
        }
        return invocation.invoke();
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索action类的问题
, action
, interceptor
, 方法
, 拦截器
, 拦截器中的方法
, struts2拦截器
, invoke
, 过滤器怎么调用action
, 拦截器aspnetsetmvcstring
, jerseyspring拦截器
, Struts 拦截器
, 一个
http拦截器
,以便于您获取更多的相关知识。

时间: 2024-08-24 14:35:49

Struts2教程9:实现自已的拦截器的相关文章

struts2中,如何关闭某个拦截器

问题描述 struts2中,如何关闭某个拦截器,我想用自己的文件上传方案,但是老是被struts2拦截,结果我得到的文件list=0,结果发现struts-default中有个默认的fileUpload,拦截器,怎么禁用它.<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Con

struts2 配置的文件上传拦截器没有生效

问题描述 struts2配置了文件上传拦截器只允许上传图片,为什么没有生效的呢?其他类型文件还是能够上传 解决方案 解决方案二:但其他文件上传后台会报错,其实没传成功的吧这个要上传前端控制下吧

【Struts2框架】第六节拦截器-拦截器的几个小实例

在看拦截器的小例子的前我们先来看看sturts2的原理 struts2自己是有拦截器的,通过拦截器可以拦截用户请求,并作出处理 拦截器作用有很多,譬如: 1.Action里面有个属性,这个属性我想在action执行之前改成别的值,可以用拦截器解决. 2.比如每个人执行action之前,我可以查看他们有没有这个权限执行这个action. 如果不设置拦截器,你要在每种action方法之前设置判定程序,非常繁琐. 拦截器interceptor体现了一种编程理念,叫做AOP(面向切面编程) 实例1:使用

【Struts2框架】第六节拦截器-拦截器介绍和总结

一.拦截器概念 Strrurs拦截器是可插拔式的拦截器:如果我们要使用某个拦截器,只需要在配置文件中应用该拦截器即可. Struts拦截器由struts-default.xml,struts.xml等配置文件中进行管理. Struts2中已经默认启动了大量通用功能的拦截器(这些拦截器以name-class对的形式配置在struts-default.xml文件中),只要我们配置Action的package继承了struts-default包,这些拦截器就会起作用. 拦截器几乎完成了Sturts2框

关于Struts2文件上传与自定义拦截器_java

一.访问或添加request/session/application属性 public String scope() throws Exception{   ActionContext ctx = ActionContext.getContext();   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app   ctx.getSession().put("ses", &q

Java的Struts2框架中拦截器使用的实例教程_java

1.拦截器小介 拦截器的功能类似于web.xml文件中的Filter,能对用户的请求进行拦截,通过拦截用户的请求来实现对页面的控制.拦截器是在Struts-core-2.2.3.jar中进行配置的,原始的拦截器是在struts-default.xml中配置的,里面封存了拦截器的基本使用方法. Struts2拦截器功能类似于Servlet过滤器.在Action执行execute方法前,Struts2会首先执行struts.xml中引用的拦截器,如果有多个拦截器则会按照上下顺序依次执行,在执行完所有

[转载]难经3:Struts2,拦截器拦不住Result?

[问题] 使用Struts2作为web框架,知道它的拦截器(Interceptor)机制,类似与Filter和spring的AOP,于是实现了一个为Action增加自定义前置(before)动作和后置动作(after)的拦截器(曰:WInterceptor),不过用一段时间发现,在WInterceptor的after中,对Action对象的属性修改在页面看不到,对请求对象的属性设置也无效.为什么在调用了Action之后(invokeAction())之后,request就不能使用了呢,拦截器不能

Struts2教程8:拦截器概述

Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法. Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口继承,在Intercepter接口中有如下三个方法需要实现: void destroy(); void init(); St

struts2.0-Struts2拦截器Struts2拦截器Struts2拦截器Struts2拦截器

问题描述 Struts2拦截器Struts2拦截器Struts2拦截器Struts2拦截器 请问谁有Struts2拦截器学习的详细资料,请问谁有Struts2拦截器学习的详细资料,感谢哈 解决方案 ? Struts2拦截器 ? ? 一.什么是拦截器? 1.拦截器,在AOP(Aspect-Oriented Programming<面向切面编程>)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 在Webwork的中文文档的解释为--拦截器是动态