Struts2学习:interceptor(拦截器)的使用
对于需要登陆验证、权限验证等功能的网站,每一次请求,每一个action都写一段验证的代码,未免显得冗余且不易维护。struts2提供了拦截器interceptor,为这些页面提供一个切面,或者说公共组件,以达到易维护、提高代码重用率的目的。struts默认的interceptor有很多,就不去一一列举,这里从自定义拦截器开始学习。
1、定义一个自定义拦截器:
package com.owlforest.home.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { String output = "Pre-Processing"; System.out.println(output); String result = invocation.invoke(); output = "Post-Processing"; System.out.println(output); return result; } }
2、修改struts.xml,在package中声明和使用拦截器MyInterceptor
<package name="suibian" extends="struts-default"> <!--声明自定义的拦截器--> <interceptors> <interceptor name="myinterceptor" class="com.owlforest.home.interceptor.MyInterceptor" /> </interceptors> <action name="hello" class="com.owlforest.home.action.HelloWorldAction" method="excute"> <!--使用自定义拦截器--> <interceptor-ref name="myinterceptor" /> <interceptor-ref name="params"/> <result name="success">/HelloWorld.jsp</result> </action> </package>
该拦截器在com.owlforest.home.action.HelloWorldAction执行前后会生效,为了便于理解,附上该Action的代码:
package com.owlforest.home.action; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport { private String name; public String excute(){ System.out.println("excute"); return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3、执行程序
程序实现参照Struts2学习:HelloWorld
执行action过后可查看控制台输出,看到下面的信息后及说明生效。
4、对于一个struts.xml里面的package,可能有多个action,多个action可能会用到一系列的相同的interceptor,如果每个action都要写一系列相同的拦截器,则很难维护。struts2提供了拦截器栈,来帮助整合这些拦截器,达到复用的目的。
为了方便理解,我写了两个自定义的拦截器MyInterceptor和SecInterceptor
package com.owlforest.home.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { String output = "Pre-Processing 拦截器MyInterceptor"; System.out.println(output); String result = invocation.invoke(); output = "Post-Processing 拦截器MyInterceptor"; System.out.println(output); return result; } }
package com.owlforest.home.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class SecInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { String output = "Pre-Processing SecInterceptor"; System.out.println(output); String result = invocation.invoke(); output = "Post-Processing SecInterceptor"; System.out.println(output); return result; } }
配置struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 设置struts是否为开发模式,默认为false,测试阶段一般设为true. --> <constant name="struts.devMode" value="true"/> <package name="suibian" extends="struts-default"> <interceptors> <interceptor name="myinterceptor" class="com.owlforest.home.interceptor.MyInterceptor" /> <interceptor name="secinterceptor" class="com.owlforest.home.interceptor.SecInterceptor" /> <interceptor-stack name="myinterceptorstack"> <interceptor-ref name="myinterceptor" /> <interceptor-ref name="secinterceptor" /> </interceptor-stack> </interceptors> <action name="hello" class="com.owlforest.home.action.HelloWorldAction" method="excute"> <interceptor-ref name="myinterceptorstack"/> <interceptor-ref name="params"/> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
5、因为拦截器和拦截器栈是在package中声明使用的,作用域仅在当前声明的package中,对于一些验证、异常相关的拦截器,需要在全局、也就是所有的package中都能使用,这种需要定义一个全局的package,使相应的action对应的package继承自该全局package即可。如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 设置struts是否为开发模式,默认为false,测试阶段一般设为true. --> <constant name="struts.devMode" value="true"/> <!--全局的package--> <package name="commominterceptor" extends="struts-default"> <interceptors> <interceptor name="myinterceptor" class="com.owlforest.home.interceptor.MyInterceptor" /> <interceptor name="secinterceptor" class="com.owlforest.home.interceptor.SecInterceptor" /> <interceptor-stack name="myinterceptorstack"> <interceptor-ref name="myinterceptor" /> <interceptor-ref name="secinterceptor" /> </interceptor-stack> </interceptors> </package> <!--继承自commominterceptor的package--> <package name="suibian" extends="commominterceptor"> <action name="hello" class="com.owlforest.home.action.HelloWorldAction" method="excute"> <interceptor-ref name="myinterceptorstack"/> <interceptor-ref name="params"/> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
拦截器栈与全局拦截器的运行效果如下:
Struts2学习:interceptor(拦截器)的使用的更多相关文章
- 模仿Struts2的Interceptor拦截器实现
模仿Struts2的Interceptor拦截器实现 public interface Invocation { public Object invoke(); } public interface ...
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- struts2学习(5)拦截器简介以及例子执行过程
一.拦截器简介: 二.Struts2预定义拦截器&拦截器栈 在执行action之前和之后,拦截器进行了操作: 比如struts-default.xml中就有很多预定义的拦截器: 拦截器栈: ...
- Struts2学习之拦截器
© 版权声明:本文为博主原创文章,转载请注明出处 拦截器: - Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能 - 拦截器方法在Action执行之前或之后执行 工作原理: - ...
- struts2自定义Interceptor拦截器
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Struts2学习之拦截器栈
© 版权声明:本文为博主原创文章,转载请注明出处 拦截器栈: - 从结构上看:拦截器栈相当于多个拦截器的组合 - 从功能上看:拦截器栈也是拦截器 默认拦截器栈: - 在struts-core.jar中 ...
- Struts2基础学习(五)—拦截器
一.概述 1.初识拦截器 Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...
- 1.5(Spring MVC学习笔记) 拦截器(Interceptor)
一.拦截器 1.1拦截器简介 Spring中的拦截器类似Servlet中的过滤器(Filter),主要用于拦截用户请求, 并进行一定的处理操作(如验证权限.记录日志.设置编码方式等). 1.2拦截器实 ...
- 5.Struts2中的拦截器
拦截器是Struts2中的核心,其自带很多很多的拦截器,这里主要介绍一下自定义拦截器,恩多一半情况下呢?我们不需要使用到自定义的拦截器,Struts2本身已经提 供了很多的拦截器供我们使用,对于自定义 ...
- SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
随机推荐
- create-react-app-typescript 知识点
github:https://github.com/wmonk/create-react-app-typescript 报错:Import sources within a group must be ...
- Kafka三款监控工具比较
在之前的博客中,介绍了Kafka Web Console这个监控工具,在生产环境中使用,运行一段时间后,发现该工具会和Kafka生产者.消费者.ZooKeeper建立大量连接,从而导致网络阻塞.并且这 ...
- DataFlow编程模型与Spark Structured streaming
流式(streaming)和批量( batch):流式数据,实际上更准确的说法应该是unbounded data(processing),也就是无边界的连续的数据的处理:对应的批量计算,更准确的说法是 ...
- 阅读 RAM-Based Shift Register(ALTSHIFT_TAPS) IP Core User Guide
阅读 RAM-Based Shift Register(ALTSHIFT_TAPS) IP Core User Guide 说明:本文档自带测试工程: DE_ALTSHIFT_TAPS.zip 1.支 ...
- delphi内存映射 与 映射数据获取
一.原理 通过使用“内存映射文件”,实现内存共享 二.主要操作 共享内存结构: PShareMem = ^TShareMem; TShareMem = Record id:stri ...
- 《JavaScript设计模式与开发》笔记 2.this指针
1.作为对象方法调用 2.作为普通函数调用 1.作为普通函数进行调用 2.将函数赋值给一个对象 3.callback内部的this指向了window 4.解决callback内部的this问题 3.构 ...
- SQL2000服务端配置-如何让外网访问SQL2000
刚刚写了个DEMO,在内网来测试SQL2000后完全正常.现在想测试外网是否正常,毕竟路由器IP不固定,所以选择了路由器+花生壳免费域名(koma.5166.info),所以先安装花生壳客户端软件.下 ...
- C 500uS状态机架构
main int main(void) { InitSys(); SoftwareInit(); ) { if(P500usReq) { P500usReq = ; P500us(); } Modbu ...
- Ntfs 下的链接符号创建
熟悉过 Unix/Linux 都应该知道,Unix/Linux 用 ln 建立硬链接,ln -s 建立软链接(符号链接). 硬链接和符号链接的区别 Ntfs下的也有链接符: 内置命令:mklink ...
- line-height的理解
font-size:0清除display:inline-block元素换行符间隙,比如两个img标签之间有换行符 行内元素的高度是由其行高决定的. Div或者其他元素内的图片,底部会有间隙,原因是图片 ...