struts2的拦截器(3):通过实现Interceptor接口定义自己的拦截器

来源:互联网 发布:最新抢火车票软件 编辑:程序博客网 时间:2024/06/05 05:42

虽然struts2框架提供了许多内建拦截器,这些内建拦截器实现了struts2的大部分功能,因此,大部分Web应用的通用功能,都可以通过直接使用这些拦截器来完成。但还有一些系统逻辑相关的通用功能,可以通过自定义拦截器来实现。struts2自定义拦截器有如下三种方法:

① 实现com.opensymphony.xwork2.interceptor.Interceptor接口,实现init,destroy,intercept方法。

② 继承com.opensymphony.xwork2.interceptor.AbstractInterceptor抽象类,实现抽象方法intercept。

③ 继承 com.opensymphony.xwork2.interceptor .MethodFilterInterceptor抽象类,实现抽象方法doIntercept方法。

实现Interceptor接口:

public interface Interceptor extends Serializable {   void init();   void destroy();   String intercept(ActionInvocation invocation) throws Exception;}
方法说明init在该拦截器执行拦截之前,系统将回调该方法。对于每个拦截器而言,init方法只执行一次。
该方法的方法体主要用于初始化资源,例如数据库连接等。destroy在该拦截器实例被销毁之前,系统将回调该拦截器的destroy方法。
该方法主要用于销毁在init方法里打开的资源等。intercept该方法是用户需要实现的拦截动作。就像Action的execute方法一样,intercept方法返回一个
字符串作为逻辑视图。如果该方法直接返回了一个字符串,系统将会跳转到该逻辑视图对应的
物理视图,不会调用被拦截的Action。该方法的ActionInvocation参数包含了被拦截的Action的
引用。调用invocation的invoke方法,将控制权转移给下一个拦截器,或转给Action。

login.jsp :

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><s:form action="login"><s:textfield name="name" label="姓名"></s:textfield><s:password name="pass" label="密码"></s:password><s:submit value="确定"></s:submit></s:form></body></html>
welcome.jsp :

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><%Object obj=session.getAttribute("name");if(obj==null){response.sendRedirect("login.jsp");}%>welcome ${name}...</body></html>

struts.xml :

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"    "http://struts.apache.org/dtds/struts-2.1.7.dtd"><struts>    <package name="demo" extends="struts-default">           <interceptors>          <interceptor name="simple" class="interceptor.SimpleInterceptor">            <param name="name">简单拦截器</param>          </interceptor>       </interceptors>              <action name="login" class="action.LoginAction">          <result name="success">/welcome.jsp</result>          <result name="error">/login.jsp</result>                    <interceptor-ref name="simple">            <param name="name">改名后的拦截器</param>          </interceptor-ref>          <interceptor-ref name="defaultStack"></interceptor-ref>                 </action>    </package></struts>

LoginAction.java :

public class LoginAction extends ActionSupport {private String name;private String pass;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;}public String execute(){if(getName().equals("scott")&& getPass().equals("tiger")){Map<String,Object> session=ActionContext.getContext().getSession();session.put("name",getName());return "success";}return "error";}}
SimpleInterceptor.java :

public class SimpleInterceptor implements Interceptor{private String name;//简单拦截器的名字public void setName(String name) {this.name = name;}@Overridepublic void destroy() {System.out.println("没什么资源可关闭...");}@Overridepublic void init() {System.out.println("没什么资源可打开...");}@Overridepublic String intercept(ActionInvocation invocation) throws Exception {LoginAction loginaction=(LoginAction)invocation.getAction();System.out.println(name+"拦截器的动作------"+"开始执行登录Action的时间为:"+new Date());long start=System.currentTimeMillis();String result=invocation.invoke();  //要理解这行代码System.out.println(name+"拦截器的动作------"+"执行完登录Action的时间为:"+new Date());long end=System.currentTimeMillis();System.out.println("执行完该Action耗时:"+(end-start)+"毫秒");return result;   //要理解这行代码}}






原创粉丝点击