`
whp0731
  • 浏览: 174793 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

struts2学习之九---拦截器

阅读更多

拦截器实现机制
一、回忆“java反射与动态代理二.txt”,因为它的底层原理是java动态代理


二、拦截器类实现机理就是将如下java动态代理类DynamicSubject 中“before”“after”提取出来形成一个类。

 

即在 真正使用目标类方法前和方法类后需要做的事或叫调用的函数独立出来,形成一个类,就像此类打印“before calling"或打印“after calling”两个方法单独独立出来一个类,然后是通过类的方法去调用这两个方法,其实拦截器类本省没有做什么,无非就是定义了真正的在处理某个实际类之前需要做什么事情,而实现主要还是通过动态代理去实现的。

三、拦截器实现原理


通过以下代码来阐述
1、TargetInterface接口(因为java实现动态代理需要面向接口)

package com.interceptor;
public interface TargetInterface
{
 public void doSomething();
}

 
2、Target.java

package com.interceptor;
public class Target implements TargetInterface
{
 public void doSomething()
 {
  System.out.println("do something");
 }
}

 
3、Interceptor.java 拦截器类,其实拦截器类本身是一个很普通的类,他和上面的目标类也是没有耦合关系的,通过下面的处理器类MyHandler.java类会将它们耦合在一起

package com.interceptor;
public class Interceptor
{
 public void before()
 {
  System.out.println("before");
 }
 
 public void after()
 {
  System.out.println("after");
 }
}

 

 

4、MyHandler.java类,该类实现了InvocationHandler接口,覆写了invoke方法。

package com.interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler
{
 private Object object;

 private Interceptor interceptor = new Interceptor();

 public void setObject(Object object)
 {
  this.object = object;
 }
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable
 {
  Object result = null;

  interceptor.before();

  result = method.invoke(object, args);

  interceptor.after();

  return result;
 }

}

 

5、Myproxy.java该类 的作用是根据Proxy的静态方法生成代理类,返回

package com.interceptor;

import java.lang.reflect.Proxy;

public class MyProxy
{
 public Object getProxy(Object object)
 {
  MyHandler myHandler = new MyHandler();

  myHandler.setObject(object);

  return Proxy.newProxyInstance(Target.class.getClassLoader(), object
    .getClass().getInterfaces(), myHandler);
 }
}

 

6、客户端Client.java

package com.interceptor;
public class Client
{
 public static void main(String[] args)
 {
  TargetInterface target = new Target();
  
  MyProxy myProxy = new MyProxy();
  
  TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
  
  proxy.doSomething();
 }

}

 


7、执行结果

before
do something
after

 

 

 

四、拦截器的使用


1、类MyInterceptor

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

public class MyInterceptor implements Interceptor//必须继承这个接口,覆写下面三个//方法
{

 private String hello;
 
 public String getHello()
 {
  return hello;
 }

 public void setHello(String hello)
 {
  this.hello = hello;
 }

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

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

 public String intercept(ActionInvocation invocation) throws Exception
 {
  System.out.println("intercept");
  
  String result = invocation.invoke();//当有拦截器链的时后,一直传递下去一个个拦截下去
  
  System.out.println("finish");
  
  return result;
 }

}

 

2、在struts.xml文件中配置拦截器

<interceptor name="myInterceptor" class="com.test.interceptor.MyInterceptor">
<!--此处的参数"hello"值为world可以在拦截器使用类中被读取或叫动态加载,如上面MyInterceptor -->
      <param name="hello">world</param>
</interceptor>

 

 

3、在struts.xml文件中使用拦截器

<action name="register" class="com.test.action.RegisterAction" method="test">
   <result name="success">/success.jsp</result>
   <result name="input">/register2.jsp</result>
   <interceptor-ref name="auth">
                            <param name="hello">world2222</param><!--此处的参数"hello"值为world可以被替换掉-->
                        </interceptor-ref>
   <interceptor-ref name="defaultStack"></interceptor-ref>
</action>

 
说明:如果对于某一个action你增加了一个拦截器配置,那么你需要再显示地引用默认拦截器。<interceptor-ref

name="defaultStack"></interceptor-ref>
拦截器的执行顺序:先配置的先执行,但退出的时候,后配置的先执行。

即在struts.xml类中,对某一个action。如果你没有增加任何拦截器,那么Action会去引用默认拦截器,会默认加载。(每一个action

会有一个而且只能有一个的默认的拦截器
如果对于某一个action你增加了一个拦截器配置,那么你需要再显示地声明默认拦截器。
拦截器的执行顺序:先配置的先执行,但退出的时候,后配置的先执行。

 

五、拦截器栈


拦截器栈可以有多个拦截器组成
也可以由别的拦截器栈和拦截器等组成
默认的拦截器栈只有一个,可以通过struts.xml中设置<default-interceptor-ref name="defaultStack"/>,defaultStack系统指定的

默认的拦截器栈!默认的拦截器栈可以修改的。例如修改为myDefaultStack等

拦截器栈在struts.xml中的使用举例
 

 <interceptors>
   <interceptor name="myInterceptor" class="com.test.interceptor.MyInterceptor">
    <param name="hello">world</param>
   </interceptor>
   
   <interceptor name="myInterceptor2" class="com.test.interceptor.MyInterceptor2">
   </interceptor>
   
   <interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3">
   
   </interceptor>
   
   <interceptor name="auth" class="com.test.interceptor.AuthInterceptor">
   
   </interceptor>
   
   <interceptor-stack name="myStack">
    <interceptor-ref name="myInterceptor"></interceptor-ref>
    <interceptor-ref name="myInterceptor2"></interceptor-ref>
           <interceptor-ref name="defaultStack"></interceptor-ref>  
   </interceptor-stack>
  </interceptors>

 

 

六、AbstractInterceptor已经实现拦截器的init方法、和destroy()方法

 

所以直接继承之它会比较简单。
如:MyInterceptor2.java

package com.test.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor2 extends AbstractInterceptor
{

 @Override
 public String intercept(ActionInvocation invocation) throws Exception
 {
  System.out.println("intercept2");
  
  String result = invocation.invoke();
  
  System.out.println("finish2");
  
  return result;
 }

}

 

七、选择性拦截


1、拦截某个方法时,可以在struts.xml中定义
如:

    <action name="register" class="com.test.action.RegisterAction" method="test">
   <result name="success">/success.jsp</result>
   <result name="input">/register2.jsp</result>   
   <interceptor-ref name="auth"></interceptor-ref><!--对执行test方法时拦截-->
   <interceptor-ref name="defaultStack"></interceptor-ref>  
  </action>

        

2、方法过滤拦截器可以直接继承MethodFilterInterceptor(继承之AbstractInterceptor)
1)拦截器类MyInterceptor3

package com.test.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor3 extends MethodFilterInterceptor
{
 @Override
 public void init()
 {
  System.out.println("init3");
 }
 
 @Override
 protected String doIntercept(ActionInvocation invocation) throws Exception
 {
  System.out.println("my interceptor3");

  String result = invocation.invoke();
  
  System.out.println("after my interceptor3 finished");

  return result;
 }
}

 
2)在struts.xml中定义
              

  <interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3">
         </interceptor>

  <action name="register" class="com.test.action.RegisterAction" method="test">
   <result name="success">/success.jsp</result>
   <result name="input">/register2.jsp</result> 
   
                        <interceptor-ref name="myInterceptor3">
    <param name="excludeMethods">test,execute</param>
    <!--   <param name="includeMethods">test</param>  -->
   </interceptor-ref>
   <interceptor-ref name="defaultStack"></interceptor-ref>

  </action>

  

八、注册监听器


1、MyListener.java监听器类

package com.test.listener;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener;

public class MyListener implements PreResultListener
{

 public void beforeResult(ActionInvocation invocation, String resultCode)
 {
  System.out.println("result : " + resultCode);
 }

}

 

2、MyInterceptor.java

package com.test.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.test.listener.MyListener;
public class MyInterceptor3 extends MethodFilterInterceptor
{
 @Override
 public void init()
 {
  System.out.println("init3");
 }
 
 @Override
 protected String doIntercept(ActionInvocation invocation) throws Exception
 {
  invocation.addPreResultListener(new MyListener());//此处为注册监听器
  System.out.println("my interceptor3");

  String result = invocation.invoke();
  
  System.out.println("after my interceptor3 finished");

  return result;
 }
}

 

执行结果

my interceptor3

validate(方法)。。。。。

result : input(即返回结果但把结果给客户端方法之前,会执行这个监听器类)

after my interceptor3 finished

 


九、用户登录才能操作的例程
1、AuthInterceptor.java

package com.test.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthInterceptor extends AbstractInterceptor
{
 @Override
 @SuppressWarnings("unchecked")
 public String intercept(ActionInvocation invocation) throws Exception
 {//struts2已经把session从容器里脱离出来了,放在map中了,所以使用和测试都很方便。
  Map map = invocation.getInvocationContext().getSession();
  
  if(map.get("user") == null)
  {
   return Action.LOGIN;
  }
  else
  {
   return invocation.invoke();
  }
 }

}

 

2、改造LoginAction.java类的excute方法,即把用户放在session里

import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public String execute() throws Exception
 {
  if ("hello".equals(this.getUsername().trim())
    && "world".equals(this.getPassword().trim()))
  {
   Map map = ActionContext.getContext().getSession();
   
   map.put("user","valid");
   
   return "success";
  }

 

3、修改struts.xml

<interceptor name="auth" class="com.test.interceptor.AuthInterceptor">
</interceptor>
<action name="register" class="com.test.action.RegisterAction" method="test">
   <result name="success">/success.jsp</result> 
   <interceptor-ref name="auth"></interceptor-ref>
   <interceptor-ref name="defaultStack"></interceptor-ref>
</action>


还有因为大家不成功时都转到登录界面,所以可以配置全局的input,redirect属性值表示重定向,struts这里的默认值是dispatcher
<groble-results>
     <result name="login" type="redirect">/login2.jsp</result>
</groble-results>

 

分享到:
评论

相关推荐

    Struts2学习案例(拦截器)

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

    Struts2 拦截器-v3

    通过深入学习"Struts2 拦截器-v3",开发者不仅可以理解Struts2框架的核心机制,还能掌握如何利用拦截器提升应用的灵活性和可扩展性。实践案例和动手练习将帮助巩固理论知识,提高实际开发技能。

    struts2-json-plugin源码

    4. **拦截器**:Struts2的拦截器机制允许在Action调用前后执行特定逻辑。JSON插件可能包含用于处理JSON请求和响应的拦截器,比如处理JSON参数的解析和验证。 5. **Action与模型驱动**:如果Action使用模型驱动模式...

    struts2-core-2.0.11源码

    1. **拦截器(Interceptors)**:Struts2的核心特性之一,拦截器负责在Action调用前后执行额外的逻辑,如日志记录、权限验证等。在`org.apache.struts2.interceptor`包下,你可以找到各种预定义的拦截器类。 2. **...

    Struts2源代码 包含struts-core和xwork-core源码

    - `struts-core` 是Struts2框架的核心部分,包含了许多核心服务,如Action的执行、结果的处理、拦截器的管理等。 - 它提供了`Action`接口,开发者通过实现这个接口来定义应用程序的业务逻辑。 - 拦截器是Struts2...

    struts-2.3.16.1-all

    3. **Interceptor(拦截器)**:拦截器是Struts 2中的核心组件之一,它允许开发者在Action执行前后插入自定义逻辑,如日志记录、权限验证等。常见的拦截器有`params`(处理请求参数)、`validation`(进行数据校验)...

    struts-2.2.3.1-apps

    3. **拦截器**:拦截器是Struts 2中的重要组件,它们按照预定义的顺序在Action调用前后执行,实现如日志记录、权限检查、事务管理等功能。开发者可以自定义拦截器来扩展框架功能。 4. **OGNL(Object-Graph ...

    struts2拦截器应用小例子

    通过这个例子,你可以学习到如何创建、注册拦截器,以及如何在Struts2框架中构建拦截器栈,从而更灵活地管理应用程序的行为。 总结来说,Struts2的拦截器机制提供了强大的功能,允许开发者以声明式的方式控制请求的...

    struts框架入门学习---工程源码

    总结来说,这个“Struts框架入门学习---工程源码”提供了实践Struts框架的基础,涵盖了Action、MVC模式、配置文件、拦截器和视图等方面,对于初学者来说是一份宝贵的资料。通过分析和运行这个工程,你可以更好地理解...

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    struts2-showcase.rar

    2. **拦截器(Interceptors)**:Struts2的核心功能之一,拦截器可以插在Action调用之前和之后,实现如日志、事务管理、验证等通用功能,增强了代码的可复用性。 3. **动态方法调用(Dynamic Method Invocation,DMI...

    struts-2.1.8-all-src.zip

    3. **拦截器**:拦截器是Struts2的一大特色,它实现了AOP(面向切面编程),可以插入到Action调用的前后,进行如日志记录、权限检查等操作。 4. **插件支持**:Struts2拥有丰富的插件库,如Freemarker和Velocity...

    struts-2.1.8.1-lib-src.zip

    通过对`struts-2.1.8.1-lib-src`的深入研究,开发者可以了解到Struts 2的核心机制,学习如何创建自定义拦截器、Action和结果类型,以及如何配置和扩展框架,从而提升Web应用的开发效率和质量。同时,源代码的分析也...

    struts-xwork-core源码

    - 拦截器是Struts2的一大特色,它们在Action执行前后运行,可以实现日志记录、事务管理、权限检查等功能。Struts2的许多功能都是通过拦截器实现的。 6. **Value Stack**: - 值栈是Struts2的一个重要概念,它是一...

    struts2课件----传智博客张孝祥老师最新讲解PPT

    学习Struts2,不仅要掌握基础的配置和Action设计,还要理解Interceptor(拦截器)的概念,它们可以插入到Action调用流程中,实现事务管理、权限控制等功能。另外,Struts2的国际化、异常处理、主题和模板等功能也是...

    struts-2.1.8.1-all-01

    2. **拦截器(Interceptors)**:Struts 2的核心组件之一,它们在Action执行前后进行干预,实现如日志记录、权限验证、数据校验等功能。 3. **配置灵活性**:Struts 2允许开发者使用XML或注解来配置Action、结果和...

    Struts2之拦截器原理分析及使用-上案例struts007

    接下来,我们将通过案例"struts007"来学习拦截器的配置与使用。在Struts2的配置文件(如struts.xml)中,可以定义一个拦截器或者拦截器栈。拦截器栈是由多个拦截器按照特定顺序组成的,每个拦截器都有自己的名字和...

    struts 空项目 struts2-blank-2.0.12.war

    这个“struts2-blank-2.0.12.war”文件是一个基于Struts2框架的空项目,版本为2.0.12,非常适合初学者或者开发者用于学习和参考。下面将详细解释Struts2框架的核心概念、主要特性以及如何使用这个空项目进行开发。 ...

    struts2-tags-文档.rar

    "struts2.chm"可能是Struts2的基础教程,涵盖了框架的基本概念、配置、动作、拦截器等核心组件。在这个文档中,你可以了解到如何设置Struts2的配置文件,如何创建Action类,以及如何使用拦截器进行业务逻辑处理。...

Global site tag (gtag.js) - Google Analytics