Struts2入门(二)——配置拦截器

一、前言

之前便了解过,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请求
    @Overridepublic String intercept(ActionInvocation arg0) throws Exception {//取得被拦截的actionLoginAction 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);    //输出的值是:successreturn 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;}@Overrideprotected String doIntercept(ActionInvocation arg0) throws Exception {//取得被拦截的actionLoginAction 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);    //输出的值是:successreturn 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之前的行为
    @Overridepublic 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;}@Overrideprotected 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;}}

 

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

转载于:https://www.cnblogs.com/IT-1994/p/5997079.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux固态机械分区吗,不再疑惑!实测数据后才知道固态硬盘究竟要不要分区

不再疑惑&#xff01;实测数据后才知道固态硬盘究竟要不要分区2019-12-10 20:52:00162点赞594收藏177评论前几年的固态硬盘价格昂贵&#xff0c;一般用户会选择128G或256G的固态作为系统盘&#xff0c;由于单盘空间不大&#xff0c;一般都会配合机械硬盘使用&#xff0c;无需考…

安卓手机的后门控制工具SPADE

SPADE&#xff0c;一款安卓手机的后门控制工具&#xff0c;安全研究人员可以以此了解和研究安卓后门原理。 首先&#xff0c;我们从网站www.apk4fun.com下载apk文件&#xff0c;如ccleaner。然后&#xff0c;我们安装spade git clone https://github.com/suraj-root/spade.git …

MySQL案例-open too many files,MyISAM与partition

-------------------------------------------------------------------------------------------------短文---------------------------------------------------------------------------------------------------------------长话短说~现象: error log中批量刷错误日志, 形…

linux网卡有很多error,教你设置win7系统虚拟机安装linux提示network error的解决方法...

很多朋友在使用电脑的过程中&#xff0c;会发现win7系统虚拟机安装linux提示network error的现象&#xff0c;当遇到win7系统虚拟机安装linux提示network error的问题&#xff0c;我们要怎么解决呢&#xff1f;如今还有很多用户不知道如何处理win7系统虚拟机安装linux提示netwo…

linux模拟网络延迟,使用Nistnet搭建网络延迟模拟设备 (network delay simulator)

mknod /dev/hitbox c 62 0mknod /dev/nistnet c 62 1chown root /dev/hitboxchown root /dev/nistnetmknod /dev/mungebox c 63 0chown root /dev/mungeboxmknod /dev/spybox c 64 0chown root /dev/spyboxmodprobe nistnet可以将这个放到/etc/rc.local中&#xff0c;以便重启后…

将本地Blog部署到GitHub上,有自己的博客页面!

前言 上一篇文章我们已经把本地的hexo环境搭建好了&#xff0c;并且在本地成功预览&#xff0c;但是本地预览也意味着自己的博文只能自己看的到&#xff0c;其他人根本看不到&#xff0c;这篇文章将接上文说一说如何把本地Blog部署到GitHub上&#xff0c;好让小伙伴可以来访问我…

Linux下安装配置JDK

本人使用的VM虚拟机&#xff0c;在VM上安装了Linux&#xff0c;版本是CentOS-6.7-i386-bin-DVD1.iso。 一、下载JDK 在进入JDK官网&#xff0c;找到要下载的JDK版本&#xff0c;将下载地址复制下来&#xff0c;放到迅雷中下载&#xff0c;我下载的是&#xff1a;http://downloa…

新手使用GitHub客户端提交项目的步骤

1.下载https://windows.github.com/ github客户端 2.安装完github&#xff0c;会出现 点击GitHub&#xff0c;Git Shell是命令行指令&#xff0c;暂时用不上 3.点击进入之后 输入你在https://github.com上面注册的用户名和密码点击log in 4.登录之后新建项目 点击左上角…

linux的命令uname n,Linux下uname命令及其选项

Linux下uname命令及其选项2017-03-15 23:22:26晓得了Linux系统的用户信息后&#xff0c;你也可能想晓得所登录的系统信息&#xff0c;今日就绍介获取系统本身信息的命令uname,这搭u应当是UNIX的缩写&#xff0c;操作如次&#xff1a;uname使役uname还可以得到其它相关系统的信息…

火狐浏览器Firefox如何使用插件,火狐有哪些好用的插件

1 CoorPreviews 不打开网页链接预览该网页的内容。 预览如图所示&#xff1a; 点击关闭旁边的钉子可以让该窗口保持开着并且浏览速度加快。这对于快速浏览图片时非常有用。 2 FoxTab 3D方式预览网页&#xff0c;只要按一下输入框左侧按钮即可。 此外还提供多种预览模式和其…

GitHub+Hexo搭建自己的Blog之-主题配置

前言 前两章我们已经把Blog的环境全部搭建完毕了&#xff0c;但是还没有内容&#xff0c;而且hexo默认的主题是不是感觉挺丑的&#xff0c;其实hexo给我们提供了很多主题模板&#xff0c;总有一款是你喜欢的&#xff0c;本篇文章将继续说一说如何配置主题&#xff0c;怎么创建博…

开源app之MyHearts

前言 这个月&#xff0c;说实话&#xff0c;有忙有闲&#xff0c;经历了一次病痛的洗礼&#xff0c;才认识到了只有好好的生活&#xff0c;认真的对待自己的身体&#xff0c;才能更好的去工作&#xff0c;没有了身体的支撑&#xff0c;什么工作都只能是纸老虎&#xff0c;不攻自…

前端那些事之原生 js实现贪吃蛇篇

2019独角兽企业重金招聘Python工程师标准>>> 原生js实现贪吃蛇 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>贪吃蛇游戏</title><style>body, div, img {margin: 0 auto;pa…

整理一些完全免费开放的API接口

前言 在开发测试阶段&#xff0c;或者是在写Demo的时候&#xff0c;难免会用到一些测试数据&#xff0c;有时苦于没有可用的接口&#xff0c;需要自己动手去写&#xff0c;但是这样大大降低了效率&#xff0c;前期我也找了一些开放的接口&#xff0c;这篇文章整理一下&#xff…

如何发现优秀的开源项目?

之前发过一系列有关 GitHub 的文章&#xff0c;有同学问了&#xff0c;GitHub 我大概了解了&#xff0c;Git 也差不多会使用了&#xff0c;但是 还是搞不清 GitHub 如何帮助我的工作&#xff0c;怎么提升我的工作效率&#xff1f; 问到点子上了&#xff0c;GitHub 其中一个最重…

自已开发完美的触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器

手机端网页版app在使用下拉列表时&#xff0c;传统的下拉列表使用起来体验非常不好&#xff0c;一般做的稍好一点的交互功能界面都不会直接使用下拉列表&#xff0c;所以app的原生下拉列表都是弹窗列表选择&#xff0c;网页型app从使用体验上来当然也应该做成那样&#xff0c;前…

一个 js 中值传递和引用传递的坑。

今天在调试代码时遇到一个问题&#xff0c;刚开始想不明白&#xff0c;然后分析了一下后&#xff0c;才知道其中的问题&#xff0c;这也是一个基础的问题&#xff0c;&#xff08;所以基础是很重要的&#xff09; 代码如下&#xff1a; var a 3; a a * 2; console.log(a); //…

关于在用异步消息处理机制使用Message.Obtain()方法(而非New Message)获得一个Message对象的好处

类概述 定义一个包含任意类型的描述数据对象&#xff0c;此对象可以发送给Handler。对象包含两个额外的int字段和一个额外的对象字段&#xff0c;这样可以使得在很多情况下不用做分配工作。 尽管Message的构造器是公开的&#xff0c;但是获取Message对象的最好方法是调用Messag…

python编程中的if __name__ == 'main': 的作用和原理

大多数编排得好一点的脚本或者程序里面都有这段if __name__ main: &#xff0c;虽然一直知道他的作用&#xff0c;但是一直比较模糊&#xff0c;收集资料详细理解之后与打架分享。 1、这段代码的功能 一个python的文件有两种使用的方法&#xff0c;第一是直接作为脚本执行&…

自己简单封装的自己项目需要的http请求

2019独角兽企业重金招聘Python工程师标准>>> package www.tydic.com.util;import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Http…