struts2入门教程四(拦截器)

拦截器概念:

拦截器(Interceptor),在AOP(Aspect-OrientedProgramming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

   在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

Struts2将它的核心功能放到拦截器中实现,而不是分散到Action中实现,有利于系统的解耦,使得功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。

 

拦截器工作方式

如下图:


Struts2内置拦截器




自定义 计时拦截器

一:继承AbstractInterceptor 抽象类

Java 代码

package action;
 
import com.opensymphony.xwork2.ActionSupport;
 
public classHelloAction extends ActionSupport {
 
    private String message;
  
   @Override
   public String execute() throws Exception {
      message="Hello";
      return super.execute();
   }
 
   public String getMessage() {
      return message;
   }
 
   public void setMessage(Stringmessage) {
      this.message = message;
   }
 
  
}

 

Jsp代码:----仅为测试用

<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
 <head>
 <title>My JSP 'index.jsp' starting page</title>
  </head>
  <body>
  ${message }
 </body>
</html>

 

Struts.xml

<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN"
   "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
 
   <package name="hello" namespace="/hello"extends="struts-default">
      <interceptors>
         <interceptor name="myinterceptor" class="util.MyInterceptor">
        
         <param name="name">计时拦截器</param>
         </interceptor>
      </interceptors> 
      <action name="login" class="action.HelloAction">
         <result name="success">
            /index.jsp
         </result> 
         <interceptor-ref name="myinterceptor">
         <param name="name">HelloAction 计时拦截器</param>        
         </interceptor-ref>
      </action>
   </package> 
</struts>


 自定义的拦截器—java代码

package util;
 
import java.util.Date;
 
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 
public classMyInterceptor extends AbstractInterceptor{
 
   /**
    *
    */
   private static final long serialVersionUID= 1L;
 
  
   private String name;
  
   @Override
   public Stringintercept(ActionInvocation invocation) throws Exception {
     
     
      System.out.println("调用前"+new Date());
     
      long start=System.currentTimeMillis();
      Stringresult=invocation.invoke();
     
      long end=System.currentTimeMillis();
      System.out.println("调用后"+new Date());
     
      System.out.println(name+"用时"+(end-start));
      return result;
   }
 
   public void setName(String name) {
      this.name = name;
   }
   
}


效果图

 

二:继承MethodFilterInterceptor

Java代码

 添加两个方法用来测试

 

public String add() {
      message="add";
      return SUCCESS;
   }
   public String delete() {
      message="delete";
      return SUCCESS;
   }


自定义的拦截器—java代码

package util; 
import java.util.Date; 
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
 
public class MethodInteceptor extends MethodFilterInterceptor {
 
         /**
          *
          */
         privatestatic final long serialVersionUID = 1L;
         privateString name;
        
         @Override
         publicString doIntercept(ActionInvocation invocation) throws Exception {
                  
                  
                   System.out.println(name+"调用前"+newDate());
                  
                   longstart=System.currentTimeMillis();
                   Stringresult=invocation.invoke();
                  
                   longend=System.currentTimeMillis();
                   System.out.println(name+"调用后"+newDate());
                  
                   System.out.println(name+"用时"+(end-start));
                   returnresult;
         }
 
         publicvoid setName(String name) {
                   this.name= name;
         }
 
 
}


Struts.xml

<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN"
   "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
 
   <package name="hello" namespace="/hello"extends="struts-default">
      <interceptors>
         <interceptor name="myinterceptor" class="util.MyInterceptor">
 
            <param name="name">计时拦截器1</param>
         </interceptor>
         <interceptor name="methodInteceptor" class="util.MethodInteceptor">
 
            <param name="name">计时拦截器2</param>
         </interceptor>
      </interceptors>
 
 
      <action name="*" class="action.HelloAction"method="{1}">
         <result name="success">
            /index.jsp
         </result>
 
 
         <interceptor-ref name="myinterceptor">
            <param name="name">HelloAction 计时拦截器1</param>
         </interceptor-ref>
         <interceptor-ref name="methodInteceptor">
            <param name="name">HelloAction 计时拦截器2</param>
            <param name="excludeMethods">add,delete</param>
            <param name="includeMethods">execute</param>
         </interceptor-ref>
 
 
      </action>
   </package>
 
</struts>


效果图:


解释说明:

MethodFilterInterceptor通过指定included/excluded方法列表来选择拦截器或排除的方法,可以设置的参数如下:

excludeMethods-------要排除的方法。

includeMethods--------要拦截的方法

 

由于 struts.xml 文件中国将 add与delete 方法排除故不生效。所以出现如下状况!

访问:http://localhost:8080/interceptor/hello/execute

 

访问http://localhost:8080/interceptor/hello/add

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值