Struts2拦截器

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的值是:0
i的值是: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界面
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值