一、前言

之前便了解过,Struts 2的核心控制器是一个Filter过滤器,负责拦截所有的用户请求,当用户请求发送过来时,会去检测struts.xml是否存在这个action,如果存在,服务器便会自动帮我们跳转到指定的处理类中去处理用户的请求,基本流程如下:

该流程笔者理解是基本流程,。如果有不对的地方,请下方留言。我会改正。谢谢;

好,接着往下讲:

注意:在struts.xml中,配置文件必须有该请求的处理类才能正常跳转,同时,返回SUCCESS字符串的类,必须继承ActionSupport,如果你没有继承,那么就返回"success",同样能够跳转到jsp逻辑视图,但是必须确保你struts.xml有<result name="success">xx.jsp</result>,该标签,具体操作在上一篇文章有介绍过简单例子。

1.1、了解拦截器

什么是拦截器,它的作用是什么?

拦截器,实际上就是对调用方法的改进。

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

拦截器的执行顺序:

在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。

二、实际操作

2.1、自定义拦截器

新建一个类继承AbstractInterceptor。

package com.Interceptor;

import java.util.Date;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor {
private String name;//该属性与struts.xml中的<param name="name">简单拦截器</param>一致,也就是说该name的值是简单拦截器
public void setName(String name) {
this.name = name;
} //拦截action请求
@Override
public String intercept(ActionInvocation arg0) throws Exception {
//取得被拦截的action
LoginAction action = (LoginAction)arg0.getAction();
System.out.println(name+":拦截器的动作------"+"开始执行登录action的时间为:"+new Date());
long start = System.currentTimeMillis();
/*
* ActionInvocation.invoke()就是通知struts2接着干下面的事情
* 比如 调用下一个拦截器 或 执行下一个Action
* 就等于退出了你自己编写的这个interceptor了
* 在这里是去调用action的execute方法,也就是继续执行Struts2 接下来的方法*/
String result = arg0.invoke();
System.out.println(name+":拦截器的动作------"+"执行完登录action的时间为:"+new Date());
long end = System.currentTimeMillis();
System.out.println(name+":拦截器的动作------"+"执行完该action的时间为:"+(end-start)+"毫秒"); System.out.println(result); //输出的值是:success
return result;
}
}
/**
* 该页面的效果如下:
* 简单拦截器:拦截器的动作------开始执行登录action的时间为:Mon Oct 24 19:06:17 CST 2016
用户名:admin,密码:123
简单拦截器:拦截器的动作------执行完登录action的时间为:Mon Oct 24 19:06:18 CST 2016
简单拦截器:拦截器的动作------执行完该action的时间为:1130毫秒
success * */

在struts.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts> <!--简单的拦截器 -->
<package name="Interceptor" extends="struts-default" namespace="/ac">
<!-- 跳转前拦截 -->
<interceptors>
<!-- 声明简单的过滤器 -->
<interceptor name="Inter" class="com.Interceptor.MyInterceptor">
<!--传递name的参数 -->
<param name="name">简单拦截器</param>
</interceptor>
</interceptors>
<action name="loginaction" class="com.Interceptor.LoginAction">
<result name="success">/Interceptor/welcome.jsp</result>
<result name="input">/Interceptor/error.jsp</result>
<!--注意:如果不加默认的拦截器的话,那么类型转换不会执行,也就是说不会把文本上的值赋值给实体类 -->
<interceptor-ref name="defaultStack"/> <!-- 简单的过滤器,定义在这里告诉拦截器在此处action执行 -->
<interceptor-ref name="Inter">
</interceptor-ref>
</action>
</package>
</struts>

struts.xml解析:

<interceptors>:表示声明拦截器

<interceptor>: 表示定义一个拦截器

<param>:给该拦截器一个参数,属性为name

<interceptor-ref name="">:表示该拦截器在这个action中使用。

新建LoginAction类,继承ActionSupport

package com.Interceptor;

import com.opensymphony.xwork2.ActionSupport;

//action类处理
public class LoginAction extends ActionSupport {
private String username;
private String pwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
//默认执行execute方法
public String execute(){
System.out.println("用户名:"+username+",密码:"+pwd);
return SUCCESS;
}

新建jsp视图界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>简单的登录拦截</title>
</head>
<body>
<!--如果在struts.xml中,package包中有配置namespace的话,那么在此处就应该配置。不然会报404错误 -->
<s:form action="loginaction" namespace="/ac">
<s:textfield label="User Name" name="username"/>
<s:password label="Password" name="pwd" />
<s:submit/>
</s:form>
</body>
</html>

(代码笔者测试没问题)

2.2、过滤方法:

拦截器不仅可以定义多个拦截,还可以指定拦截特定的方法。

struts.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts> <!--简单的拦截器 -->
<package name="Interceptor" extends="struts-default" namespace="/ac">
<!-- 跳转前拦截 -->
<interceptors>
<!-- 声明方法过滤器 -->
<interceptor name="myMethod" class="com.Interceptor.MyMethodInterceptor">
<param name="name">方法过滤拦截器</param>
</interceptor>
</interceptors>
<action name="loginaction" class="com.Interceptor.LoginAction" method="method1"> <!-- 如果是拦截方法的话,改为method="method2" -->
<result name="success">/Interceptor/welcome.jsp</result> <!-- /Interceptor是笔者文件夹。别弄错了-->
<result name="input">/Interceptor/error.jsp</result>
<!--注意:如果不加默认的拦截器的话,那么类型转换不会执行,也就是说不会把文本上的值赋值给实体类 -->
<interceptor-ref name="defaultStack"/> <!-- 方法过滤器 -->
<interceptor-ref name="myMethod">
<param name="name">改名后的方法过滤器</param>
<param name="includeMethods">method1,method3</param> <!--表示该方法不被拦截-->
<param name="excludeMethods">method2</param> <!--表示该方法被拦截 -->
</interceptor-ref>
</action>
</package>
</struts>

修改LoginAction类

package com.Interceptor;

import com.opensymphony.xwork2.ActionSupport;

//action类处理
public class LoginAction extends ActionSupport {
private String username;
private String pwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
// 过滤的方法
public String method1() throws Exception {
System.out.println("Action执行方法:method1()");
return SUCCESS;
}
public String method2() throws Exception {
System.out.println("Action执行方法:method2()");
return SUCCESS;
} public String method3() throws Exception {
System.out.println("Action执行方法:method3()");
return SUCCESS;
} }

新建MyMethodInterceptor类继承MethodFilterInterceptor

MethodFilterInterceptor类表示你定义的拦截器支持方法过滤。

package com.Interceptor;

import java.util.Date;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; //过滤方法
public class MyMethodInterceptor extends MethodFilterInterceptor {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
//取得被拦截的action
LoginAction action = (LoginAction)arg0.getAction();
System.out.println(name+":拦截器的动作------"+"开始执行登录action的时间为:"+new Date());
long start = System.currentTimeMillis();
String result = arg0.invoke();
System.out.println(name+":拦截器的动作------"+"执行完登录action的时间为:"+new Date());
long end = System.currentTimeMillis();
System.out.println(name+":拦截器的动作------"+"执行完该action的时间为:"+(end-start)+"毫秒"); System.out.println(result); //输出的值是:success
return result;
} }

至于jsp视图,一样,不需要改变。

得到的结果可以看出来:

当method="method1"或者是method="method3"的时候,会自动去执行MyMethodInterceptor 的方法doIntercept,然后跳转到welcome.jsp界面。

当method="method2"的时候,控制台会出现 Action执行方法:method2(),之后便被拦截了。

以上就是拦截方法的基本代码,例子很简单,但是重在理解。

可能笔者疑惑,为什么需要过滤方法呢?因为拦截器它会自动拦截所有的方法,回造成资源的损耗,所以有些方法我们可以指定不被拦截。

2.3、监听过滤器:

在拦截器中,execute方法执行之前或者之后的方法都被拦截在intercept方法中,这些的结构不够明白,我们可以定义监听,虽然好像没什么用,但是了解一下也挺不错的。

实现拦截器的监听结果必须实现PreResultListener接口。

package com.Interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener; //过拦截器配置一个监听器
public class MyPreResultListener implements PreResultListener {
//定义处理Result之前的行为
@Override
public void beforeResult(ActionInvocation arg0, String arg1) {
System.out.println("返回的逻辑视图为:"+arg1);
}
}

然后MyMethodInterceptor类修改为:

package com.Interceptor;

import java.util.Date;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; //过滤方法
public class MyMethodInterceptor extends MethodFilterInterceptor {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception { //将一个拦截结果的监听器注册给拦截器
arg0.addPreResultListener(new MyPreResultListener());
System.out.println("execute方法被调用之前的拦截");
//调用下一个拦截器或者action的执行方法
String result = arg0.invoke();
System.out.println("execute方法被调用之后的拦截");
return result;
} }

以上就是拦截器基本知识,如果有错误的地方,请指正。谢谢。

Struts2入门(二)——配置拦截器的更多相关文章

  1. Struts2基础学习(五)—拦截器

    一.概述 1.初识拦截器      Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...

  2. struts2-第二章-拦截器

    一,回顾 (1)默认action,404问题;<default-action-ref name="action 名称"/> (2)模块化,package,struts. ...

  3. struts2(三) 输入校验和拦截器

    前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器, --WH 一.输入校验 在以前我们写一个登录页面时,并 ...

  4. struts2第四天——拦截器和标签库

    一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能, ...

  5. Struts2知识点小结(四)--拦截器与注解开发

    一.Struts2的拦截器(interceptor) 作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强.权限控制),需要拦截器组件 1.str ...

  6. 使用struts2中默认的拦截器以及自定义拦截器

    转自:http://blog.sina.com.cn/s/blog_82f01d350101echs.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Acti ...

  7. Struts2学习笔记五 拦截器

    拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. Struts2中,拦截器是动态拦截Action调用的对象.它提供了一种机制可以使 ...

  8. 【struts2】预定义拦截器

    1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个St ...

  9. SpringMvc配置拦截器

    SpringMVC可以通过配置拦截器,进行url过滤等处理. 在spring-mvc.xml的配置文件中,如下示: 其中,在<mvc:interceptors>中可以配置多个拦截器< ...

随机推荐

  1. Git(1)

    安装Git 完毕 (在开始菜单打开的话,打开的不是你想要的路径,切换路径很麻烦) 1.D盘新建 GitTest 文件夹 2.打开GitTest , 在空白的地方右键, 3.单击 Git Bash He ...

  2. Oracle 表空间和用户权限管理

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  3. mysql删除重复记录语句的方法

    例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name ...

  4. Linux监控工具介绍系列——vmstat

      说来惭愧,玩Linux这么久了,居然没有玩转vmstat这个命令,对很多指标的具体意义都有点模糊不清,花了点时间好好学习.整理一下这个命令的相关资料.因为这个命令确实比较重要,而且频繁用到. 命令 ...

  5. 借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率

    原文链接 简介 为发挥 SIMD1 的最大作用,除了对其进行矢量化处理2外,我们还需作出其他努力.可以尝试为循环添加 #pragma omp simd3,查看编译器是否成功进行矢量化,如果性能有所提升 ...

  6. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  7. DotNet Run 命令介绍

    前言 本篇主要介绍 asp.net core 中,使用 dotnet tools 运行 dotnet run 之后的系统执行过程. 如果你觉得对你有帮助的话,不妨点个[推荐]. 目录 dotnet r ...

  8. nginx常用代理配置

    因为业务系统需求,需要对web服务作nginx代理,在不断的尝试过程中,简单总结了一下常见的nginx代理配置. 1. 最简反向代理配置 在http节点下,使用upstream配置服务地址,使用ser ...

  9. cookies,sessionStorage和localStorage的区别---web前端sessionStorage和localStorage区别

    sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁.因此sessionStorage不是一种持久化的本地 ...

  10. SVM分类与回归

    SVM(支撑向量机模型)是二(多)分类问题中经常使用的方法,思想比较简单,但是具体实现与求解细节对工程人员来说比较复杂,如需了解SVM的入门知识和中级进阶可点此下载.本文从应用的角度出发,使用Libs ...