Struts2拦截器介绍
一、拦截器简介
Struts拦截器和Action的关系如图:
为了在使用拦截器时制定参数值,应通过<interceptor-ref …/>元素添加<param …/>子元素来为拦截器指定参数值。下面是配置拦截器动态指定参数值的语法。
1: <interceptor-stack name="拦截器栈一">2: <interceptor-ref name="拦截器一">3: <param name="参数一">参数值一</param>4: <param name="参数二">参数值二</param>5: </interceptor-ref>6: </interceptor-stack>
二、自定义拦截器
1、简单的拦截器
用户要开发自己的拦截器,需要实现com.opensymphony.xwork2.interceptor.Interceptor接口。下面实现了一个简单的拦截器
1、SimpleInterceptor.java
1: package cc.openhome;2: import java.util.Date;3: import com.opensymphony.xwork2.ActionInvocation;4: import com.opensymphony.xwork2.interceptor.AbstractInterceptor;5: public class SimpleInterceptor extends AbstractInterceptor {6: //简单的拦截器的名字7: private String name;8: //为该简单拦截器设置名字的setter方法9: //拦截Action方法的intercept方法10: @Override11: public String intercept(ActionInvocation invocation) throws Exception {12: // TODO Auto-generated method stub13: //取得被拦截的Action实例14: LoginAction action = (LoginAction) invocation.getAction();15: //打印16: System.out.println("正在执行 ‘"+name+"’ 拦截器的动作========"+"开始执行登录的时间为:"+new Date());17: //取得开始执行Action的时间18: long start = System.currentTimeMillis();19: //执行该拦截器的后一个拦截器,或者直接指定Action的execute()方法20: String result = invocation.invoke();21: System.out.println("正在执行 ‘"+name+" ’拦截器的动作========"+"执行完登录的时间为:"+new Date());22: //取得执行完Action的时间23: long end = System.currentTimeMillis();24: System.out.println("正在执行 ‘"+name+"’ 拦截器的动作========"+"Action执行了"+(end-start)+"毫秒");25: return result;26: }27: public String getName() {28: return name;29: }30:31: public void setName(String name) {32: this.name = name;33: }34: }35:
2、struts.xml
1: <?xml version="1.0" encoding="UTF-8" ?>2: <!DOCTYPE struts PUBLIC3: "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"4: "http://struts.apache.org/dtds/struts-2.3.dtd">5: <struts>6: <package name="struts2" extends="struts-default">7: <!-- 配置应用所使用的拦截器 -->8: <interceptors>9: <!-- 配置mysimple拦截器 -->10: <interceptor name="mysimple" class="cc.openhome.SimpleInterceptor">11: <!-- 为该拦截器指定参数值 -->12: <param name="name">简单拦截器</param>13: </interceptor>14: <interceptor name="authority" class="cc.openhome.AuthorityInterceptor"/>15: </interceptors>16: <action name="login" class="cc.openhome.LoginAction">17: <result name="success">/success.jsp</result>18: <result name="error">/error.jsp</result>19: <result name="input">/denglu.jsp</result>20: <interceptor-ref name="defaultStack"/>21: <interceptor-ref name="mySimple">22: <param name="name">动态拦截器</param>23: </interceptor-ref>24: </action>25: </package>26: </struts>
3、登录页面login.jsp
1: <%@ page language="java" contentType="text/html; charset=UTF-8"2: pageEncoding="UTF-8"%>3: <%@ taglib prefix="s" uri="/struts-tags"%>4: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">5: <html>6: <head>7: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">8: <title>登录界面</title>9: </head>10: <body>11: <s:form action="login">12: <s:textfield name="username" label="用户名"/>13: <s:textfield name="password" label="密 码"/>14: <s:submit value="登录"/>15: </s:form>16: </body>17: </html>
4、LoginAction.java
1: package cc.openhome;2: import com.opensymphony.xwork2.Action;3: import com.opensymphony.xwork2.ModelDriven;4: public class LoginAction implements Action{5: private String username;6: private String password;7: public String getUsername() {8: return username;9: }10: public void setUsername(String username) {11: this.username = username;12: }13: public String getPassword() {14: return password;15: }16: public void setPassword(String password) {17: this.password = password;18: }19: @Override20: public String execute() throws Exception {21: // TODO Auto-generated method stub22: return SUCCESS;23: }24: }25:
5、运行结果
2、拦截器的执行顺序
修改struts.xml如下
1: <?xml version="1.0" encoding="UTF-8" ?>2: <!DOCTYPE struts PUBLIC3: "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"4: "http://struts.apache.org/dtds/struts-2.3.dtd">5: <struts>6: <constant name="struts.custom.i18n.resources" value="messageResource"></constant>7: <package name="openhome" extends="struts-default">8: <!-- 配置应用所使用的拦截器 -->9: <interceptors>10: <!-- 配置mysimple拦截器 -->11: <interceptor name="mysimple" class="cc.openhome.SimpleInterceptor">12: <!-- 为该拦截器指定参数值 -->13: <param name="name">简单拦截器</param>14: </interceptor>15: </interceptors>16: <action name="login" class="cc.openhome.LoginAction" method="execute">17: <result name="input">/input.jsp</result>18: <result name="success">/WEB-INF/page/welcome.jsp</result>19: <result name="error">/WEB-INF/page/error.jsp</result>20: <interceptor-ref name="defaultStack" />21: <interceptor-ref name="mysimple">22: <param name="name">第一个动态拦截器</param>23: </interceptor-ref>24: <interceptor-ref name="mysimple">25: <param name="name">第二个动态拦截器</param>26: </interceptor-ref>27: </action>28: </package>29: <!-- Add packages here -->30: </struts>31:
运行结果如下:可以看到先配置的拦截器,先获得执行机会。
3、方法拦截器
如果不需要拦截特定的方法,假如不拦截execute方法,则在控制台上就不会输出任何信息。
只需要修改提供方法过滤的拦截器
MyFilterInterceptor.java
1: package cc.openhome;2: import java.util.Date;3: import com.opensymphony.xwork2.ActionInvocation;4: import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;5: public class MyFilterInterceptor extends MethodFilterInterceptor {6: private String name;7: public String getName() {8: return name;9: }10: public void setName(String name) {11: this.name = name;12: }13: @Override14: protected String doIntercept(ActionInvocation invocation) throws Exception {15: // TODO Auto-generated method stub16: //取得被拦截的Action实例17: LoginAction action = (LoginAction) invocation.getAction();18:19: //打印20: System.out.println("正在执行 ‘"+name+"’ 拦截器的动作========"+"开始执行登录的时间为:"+new Date());21:22: //取得开始执行Action的时间23: long start = System.currentTimeMillis();24:25: //执行该拦截器的后一个拦截器,或者直接指定Action的execute()方法26: String result = invocation.invoke();27: System.out.println("正在执行 ‘"+name+" ’拦截器的动作========"+"执行完登录的时间为:"+new Date());28:29: //取得执行完Action的时间30: long end = System.currentTimeMillis();31: System.out.println("正在执行 ‘"+name+"’ 拦截器的动作========"+"Action执行了"+(end-start)+"毫秒");32: return result;33: }34: }35:
struts.xml
1: <?xml version="1.0" encoding="UTF-8" ?>2: <!DOCTYPE struts PUBLIC3: "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"4: "http://struts.apache.org/dtds/struts-2.3.dtd">5: <struts>6: <package name="openhome" extends="struts-default">7: <!-- 配置应用所使用的拦截器 -->8: <interceptors>9: <!-- 配置myfilter拦截器 -->10: <interceptor name="myfilter" class="cc.openhome.MyFilterInterceptor">11: <!-- 为该拦截器指定参数值 -->12: <param name="name">方法过滤拦截器</param>13: </interceptor>14: </interceptor>15: <interceptor name="authority" class="cc.openhome.AuthorityInterceptor"/>16: </interceptors>17: <action name="login" class="cc.openhome.LoginAction" method="execute">18: <result name="input">/input.jsp</result>19: <result name="success">/WEB-INF/page/welcome.jsp</result>20: <result name="error">/WEB-INF/page/error.jsp</result>21: <interceptor-ref name="defaultStack" />22: <interceptor-ref name="myfilter">23: <param name="name">改名后的方法拦截器</param>24: <param name="excludeMethods">execute</param>25: </interceptor-ref>26: </action>27: </package>28: <!-- Add packages here -->29: </struts>30:
3、拦截结果的监听器
为了更精确的定义在execute方法执行前后的结构,以及执行后再处理Result执行的动作。这个监听器通过手动注册在拦截内部,必须实现PreReslutListener接口。
MyPreResultListener.java
1: package cc.openhome;2: import com.opensymphony.xwork2.ActionInvocation;3: import com.opensymphony.xwork2.interceptor.PreResultListener;4: public class MyPreResultListener implements PreResultListener {5: @Override6: public void beforeResult(ActionInvocation invocation, String resultCode) {7: // TODO Auto-generated method stub8: System.out.println("返回的逻辑视图是:"+resultCode);9: }10: }11:
BeforeResultInterceptor.java
1: package cc.openhome;2: import com.opensymphony.xwork2.ActionInvocation;3: import com.opensymphony.xwork2.interceptor.AbstractInterceptor;4: public class BeforeResultInterceptor extends AbstractInterceptor {5: @Override6: public String intercept(ActionInvocation invocation) throws Exception {7: // TODO Auto-generated method stub8: //将一个拦截器结果的监听器注册给该拦截器9: invocation.addPreResultListener(new MyPreResultListener());10: System.out.println("execute方法执行之前的拦截。。。");11: //调用下一个拦截器,或者Action的执行方法execute()12: String result = invocation.invoke();13: System.out.println("execute方法执行之后的拦截。。。");14: return result;15: }16: }17:
struts.xml
1: <?xml version="1.0" encoding="UTF-8" ?>2: <!DOCTYPE struts PUBLIC3: "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"4: "http://struts.apache.org/dtds/struts-2.3.dtd">5: <struts>6: <constant name="struts.custom.i18n.resources" value="messageResource"></constant>7: <package name="openhome" extends="struts-default">8: <!-- 配置应用所使用的拦截器 -->9: <interceptors>10: <!-- 配置myresult拦截器 -->11: <interceptor name="myresult" class="cc.openhome.BeforeResultInterceptor">12: <!-- 为该拦截器指定参数值 -->13: <param name="name">结果的拦截器</param>14: </interceptor>15: </interceptors>16: <action name="login" class="cc.openhome.LoginAction" method="execute">17: <result name="input">/input.jsp</result>18: <result name="success">/WEB-INF/page/welcome.jsp</result>19: <result name="error">/WEB-INF/page/error.jsp</result>20: <interceptor-ref name="defaultStack" />21: <interceptor-ref name="myresult">22: <param name="name">结果拦截器</param>23: </interceptor-ref>24: </action>25: <!-- Add packages here -->26: </struts>27:
运行结果
Struts2拦截器介绍的更多相关文章
- Struts2 拦截器配置以及实现
@(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...
- Struts2拦截器配置实例
拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...
- struts2(五)之struts2拦截器与自定义拦截器
前言 前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了, 不过到后面应该都有其他更方便的校验方法,而 ...
- struts2拦截器interceptor的配置方法及使用
转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2 NormalText Code ...
- 防止未登录用户操作—struts2拦截器简单实现(转)
原文地址:http://blog.csdn.net/zhutulang/article/details/38351629 尊重原创,请访问原地址 一般,我们的web应用都是只有在用户登录之后才允许操作 ...
- struts2 拦截器
拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
- struts2拦截器
一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...
- Struts2拦截器模拟
前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...
随机推荐
- Block 朴实理解
转载自:http://www.cnblogs.com/lzz900201/archive/2013/04/17/3025340.html block是个什么玩意儿 Block是Apple Inc.为C ...
- Android tcpdump抓包应用实现
Android tcpdump抓包应用实现 Android应用很多时候都会涉及到网络,在请求网络出错时,我们可以通过抓包来分析网络请求,返回的数据等,通常我们是用tcpdump这个工具来抓包,再通 ...
- js正则之零宽断言
我们学到的正则表达式匹配,都是有“宽度”的,使用 \w+. 匹配下面文本,会将 . 一同匹配: regular. expression. 如果不想匹配符号,只匹配一个位置,就要用到“零宽断言”(匹配宽 ...
- C#调用SCL2008 动态库SCL_API_cdecl.dll or SCL_API_Stdcall.dll,提示找不到指定模块
在公司用的联想 ThinkPad T430i,原装配置及系统,开机巨慢.按下开机键到登陆界面超过1分钟,再到桌面这个时间就难说了,多时有超过3分钟,进入桌面还要等待几分钟才能正常操作.新年过来向公司领 ...
- 操作IFRAME及元素
内容里有两个ifame <iframe id="leftiframe"...</iframe> <iframe id="mainiframe..& ...
- spark 文件系统Alluxio(之前名为Tachyon)
http://www.alluxio.org/documentation/v1.0.0/cn/ http://www.winseliu.com/blog/2016/04/15/alluxio-quic ...
- iOS之NSDictionary和NSArray以及NSMutableDictionary和NSMutableArray:将不再是问题
字典的key就相当于数组的下标,怎样操作数组你就学会了怎样才做字典:来感受一把 需要注意的是读取文件的类型要集合.plist文件的rooty:否则将不能读入文件 // 1.全国省市:得到的是省和市 / ...
- [iOS Animation]-CALayer 专用图层
专用图层 复杂的组织都是专门化的 Catharine R. Stimpson 到目前为止,我们已经探讨过CALayer类了,同时我们也了解到了一些非常有用的绘图和动画功能.但是Core Animati ...
- CodeForces 626D Jerry's Protest
计算前两盘A赢,最后一盘B赢的情况下,B获得的球的值总和大于A获得的球总和值的概率. 存储每一对球的差值有几个,然后处理一下前缀和,暴力枚举就好了...... #include<cstdio&g ...
- Cookie的格式及组成
转自:http://blog.csdn.net/talking12391239/article/details/9665185 Cookie由变量名和值组成,类似JavaScript变量.其属性里既有 ...