Struts2拦截器

来源:互联网 发布:dkms linux 编辑:程序博客网 时间:2024/06/17 23:49

Struts2的拦截器

1. 实现拦截器的两种方法:

一般情况下建议实现Abstracinterceptor类,不用重写init和destory方法。

1.1 实现interceptor接口

  • void init():初始化拦截器所需要的资源
  • void destroy():释放在init()中分配的资源
  • String interceptor(ActionInovation ai) throws Exception
    • 实现拦截器功能
    • 利用ActionInovation参数获取拦截器状态
    • 返回result字符串作为逻辑视图

1.2 继承AbstractInterceptor类

  • 提供了init()和destroy()的空实现
  • 只需实现interceptor()方法即可

2. 执行一个拦截器步骤:

  • 创建一个类继承AbstractInterceptor
  • 实现interceptor()方法
  • 在xml文件中注册拦截器,并在要拦截的action中引用该拦截器

3. 拦截器实例

3.1拦截器实现执行时间统计

在timer.action中执行一些列动作,配置拦截器,计算处timer.action的执行时间,并在控制台输出

java类

===================TimerAction==========================package com.bart.action;import com.opensymphony.xwork2.ActionSupport;public class TimerAction extends ActionSupport {    @Override    public String execute() throws Exception {        for(int i=0;i<500;i++){            if(i%2==0)                System.out.println("i的值是:"+i);        }        return SUCCESS;    }}===================InterceptorOne==========================/* * 拦截器实现计算执行action花费的时间 * */package com.bart.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class InterceptorOne extends AbstractInterceptor {    @Override    public String intercept(ActionInvocation invocation) throws Exception {        //1.执行action之前        long start=System.currentTimeMillis();        //2.执行下一个拦截器,如果已经是最后一个,则执行目标action        String result = invocation.invoke();        //3.执行action之后        long end=System.currentTimeMillis();        System.out.println("执行action共花费:"+(end-start)+"ms");        return result;    }}

timer_interceptor.xml拦截器

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <!-- 拦截器示例 -->    <package name="default" namespace="/" extends="struts-default">        <!-- 注册拦截器 -->        <interceptors>            <interceptor name="timerInterceptor" class="com.bart.interceptor.InterceptorOne">            </interceptor>        </interceptors>        <action name="timer" class="com.bart.action.TimerAction">            <result>/success.jsp</result>            <!-- 为Action显示引用拦截器后,默认的拦截器defaultStack不再生效,            需要手工引用。而且从顺序角度去讲,最好把默认的拦截器写在自定义拦            截器上面 -->            <interceptor-ref name="defaultStack"></interceptor-ref>            <!-- 引用拦截器 -->            <interceptor-ref name="timerInterceptor"></interceptor-ref>        </action>        </package>        <constant name="struts.i18n.encoding" value="UTF-8"></constant></struts>

struts.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <include file="timer_interceptor.xml"></include>    <constant name="struts.action.extension" value="html,jsp,do"></constant></struts>

运行Tomcat服务器,浏览器输入http://localhost:8080/Struts2Demo1/timer.action
之后会执行timer.action同时拦截器timerInterceptor拦截器动作,并计算出运行时间输出。

控制台输出

i的值是:0i的值是:2...i的值是:498执行action共花费:102ms

拦截器实现后台管理界面

创建一个后台管理界面,只有登录成功后,才能访问到。

  • 创建manage.jsp,并在login.xml中配置相关action
  • LoginAction实现SessionAware接口,并在login()方法中处理相关逻辑,当用户名密码都正确时,session.put(“xxx”,object);
  • 创建ManageInterceptor类,在interceptor()方法中处理相关逻辑
  • login.xml中注册拦截器,可以创建自定义拦截器栈,把默认的拦截器放在前面,自定义拦截器放在后面
  • 在manage的action标签中引用拦截器或者自定义的拦截器栈
    java类
=====================LoginAction.java============================package com.bart.action;import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import po.User;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;public class LogInAction extends ActionSupport implements ModelDriven<User>,SessionAware{    /* 第 3 种方法*/    private User user = new User();    private Map<String, Object>session=user.getSession();    //重写SessionAware的方法    public void setSession(Map<String, Object> arg0) {          this.session=arg0;    }    public String logIn(){        if ("admin".equals(user.getUsername())&&"123".equals(user.getPassword())) {             session.put("logName", user.getUsername());             return SUCCESS;        }else{            session.put("loginError", "用户名或密码错误");              return ERROR;        }    }    //重写的接口的方法,返回提交的对象    public User getModel() {        // TODO Auto-generated method stub        return user;    }}=====================ManageInterceptor.java============================package com.bart.interceptor;import java.util.Map;import javax.servlet.jsp.PageContext;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class ManageInterceptor extends AbstractInterceptor {    @Override    public String intercept(ActionInvocation invocation) throws Exception {        ActionContext context = ActionContext.getContext();        Map<String, Object> session = context.getSession();        if(session.get("logName")!=null){            String result = invocation.invoke();            return result;        }else            return "login";    }}

login.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <package name="default" namespace="/" extends="struts-default" >    <!-- 注册拦截器 -->    <interceptors>        <interceptor name="manageInterceptor" class="com.bart.interceptor.ManageInterceptor"></interceptor>        <!-- 自定义拦截器栈 -->        <interceptor-stack name="myStack">            <interceptor-ref name="defaultStack"></interceptor-ref>            <interceptor-ref name="manageInterceptor"></interceptor-ref>        </interceptor-stack>    </interceptors>    <!-- 创建manage.jsp的action -->    <action name="manage" >        <result>/WEB-INF/jsp/manage.jsp</result>        <result name="login">/login.jsp</result>        <!-- 使用自定义的拦截器栈 -->        <interceptor-ref name="myStack"></interceptor-ref>    </action>    <action name="LogInAction" method="logIn" class="com.bart.action.LogInAction" >        <result>/success.jsp</result>        <result name="input">/login.jsp</result>        <result name="error">/login.jsp</result>    </action>    </package>    <constant name="struts.i18n.encoding" value="UTF-8"></constant></struts>   

struts.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <include file="login.xml"></include>    <constant name="struts.action.extension" value="html,jsp,do"></constant></struts>

manage.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <title>My JSP 'manage.jsp' starting page</title>    <link rel="stylesheet" type="text/css" href="styles.css">  </head>  <body>    这是后台管理界面,只有登录成功的用户才能访问! <br>  </body></html>

运行Tomcat服务器,在登陆界面输入用户名和密码admin和123,登陆成功之后,
地址栏输入:http://localhost:8080/Struts2Demo1/manage.action即可进入manage界面
这里写图片描述

1 0
原创粉丝点击