浅谈Struts2(四)
一、Struts2的拦截器(Intercept)
作用:把多个Action中的共有代码,提取至拦截器,从而减少Action中的冗余代码。
1、Action拦截器
a、编写interceptor类
public class MyInterceptor implements Interceptor{
//ActionInvocation 参数的作用:
// 1、决定了请求轨迹:ai.invoke();
// 2、获取值栈对象:ValueStack vs = ai.getStack();
// 3、获取请求访问目标的Action对象:ai.getAction();
//
//
//String 返回值代表路径跳转,类似于String execute();的返回值。
@Override
public String intercept(ActionInvocation ai)throws Exception{
System.out.println("-----myInterceptor invoke----");
//ai.invoke();
return "error";
}
}
b、struts.xml文件的配置
<package name="p1" extends="struts-default" namespace="/p1">
<interceptors>
<interceptor name="myInter" class="xxxxxx.MyInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myInter"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<action name="target" class="xxxx.TargetAction"> <interceptor-ref name="myStack"></interceptor-ref> <result name="success">/admin/result.jsp</result> </action>
</package>
默认拦截器栈:
配置文件中的<default-interceptor-ref>节点,就是声明了默认拦截器栈,说明这个包下的所有Action,都会自动被该拦截器栈拦截。
拦截器栈:
配置文件中的<interceptor-stack>节点便为拦截器栈。可以看到下方的<aciton>节点中直接通过拦截器栈的name属性引用该拦截器栈,拦截器栈中拦截器的配置顺序,决定了拦截器的使用顺序。
可以看到,拦截器栈中第一行<interceptor-ref name="defaultStack"/>拦截器,是并没有声明的,而是平白无故自己出来的。下面就要来讨论一下struts2的系统拦截器。
系统拦截器:
系统拦截器有许多,提供了不同的功能,举个最常见的例子,struts2接收client数据就是在struts2的系统拦截器parms拦截器中完成的。在该params拦截器中,获得当前访问Action,然后通过反射获取到该Action的成员变量的名字,然后再通过该成员变量的名字,用底层最原始的request.getParameter();方法来获取到client传过来的数据,之后还要进行类型转换等等一系列操作,最后执行ai.invoke()跳转到当前的Action中。
而这个系统拦截器是在struts2-core.jar中写好并声明过的。我们自定义拦截器之后,只在Action中引入我们自定义的拦截器,系统拦截器就会失效,导致许多便捷的功能都没办法使用。所以,如上面代码所写,在我们引入自己的拦截器时,应该将我们自己的拦截器与系统拦截器绑定在一起,共同组成一个拦截器栈来进行使用,并且一定要注意的是,要将系统拦截器放在第一行。
2、方法拦截器
作用:在DMIAction的开发过程中,一个Action中写入了许多方法,这是要拦截的时候应该应用方法拦截器针对方法来进行拦截,而不是粗暴的对整个Action来进行拦截。
a、编写MethodInterceptor类
public class MyMethodInterceptor extends MethodFilterInterceptor{
//ActionInvocation ai的作用:
// 1、控制请求轨迹
// 2 、获取ValueStack
// 3、获取目标Action
//String 返回值:跳转错误页面的路径。
@Override
protected String doIntercept(ActionInvocation ai)throws Exception{
System.out.println("-------MyMethodInterceptor-------");
//ai.invoke();
return "error";
}
}
b、struts.xml配置文件
<interceptors>
<interceptor name="myMethodInterceptor" class="xxxx.MyMethodInterceptor">
<param name="includeMethods">m1,m2</param>
</interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myMethodInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
其中<param name="includemethods">节点即为配置需要拦截哪些方法。还有一种写法为<param name="excludeMethods">即为配置不需要拦截哪些方法,剩余包内的方法均需要拦截。
浅谈Struts2(四)的更多相关文章
- 浅谈struts2之chain
转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...
- 浅谈 Struts2 面试题收藏
Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- 浅谈Struts2(三)
一.Struts2收集client的参数 核心思路: <form method="post" action="XXXX"> <input ty ...
- 浅谈struts2的国际化----i18n
可能大家在使用struts框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization i 开头,n 结尾. 总共18个字母,今天的主要内容就是环绕这 四个字母. ...
- 浅谈Struts2
学过SSH框架很长一段时间了,一直没有很系统的总结一下,这里先简单谈谈Struts2. 为什么要用Struts2? 这里列举一些Servlet的缺点: 1.每写一个servlet在web.xml中都要 ...
- [SSH 2] 以网站主页面浅谈Struts2配置
导读:前面总体的介绍了一下SSH框架,那么作为Struts这一支,具体是怎么配置的呢?本篇博客则主要是以自己做过的实例中的登录一条线,简单介绍一下struts2的配置,如有不妥之处,还请大家多提点提点 ...
- 小学生之浅谈Struts2与struts1的运行机制
Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...
- 浅谈Struts2(二)
一.struts2的跳转 1.action跳转JSP a.默认为forward <action name="action1" class="com.liquidxu ...
随机推荐
- 占成本85% SSD深度选购教你如何看颗粒
颗粒是固态硬盘负责容量和传输的介质,在这一方面上与优盘产品是相同的,从外观上看,颗粒占据了整个固态硬盘内部70%左右的空间,其同样做为成本技术,根据厂商的用料不同,成为了固态硬盘内部核心材料. 颗粒的 ...
- 不要将 Array、Object 等类型指定给 prototype
在 JavaScript 中,注意不要将 Array.Object 等类型指定给 prototype,除非您的应用需要那么做.先观察如下代码: function Foo(){}Foo.prototyp ...
- [Leetcode][Python]32: Longest Valid Parentheses
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 32: Longest Valid Parentheseshttps://oj ...
- jQuery判断滚动条滚到页面底部脚本
原文地址 http://www.111cn.net/wy/jquery/61741.htm
- struts漏洞修补过程之S2-016
Struts漏洞修补过程之S2-016.邪恶的Struts再次现身,这一次是远程执行漏洞.官方建议立即升级到2.3.15.1.真希望这是最后一次漏洞修补.下面是升级步骤. 1.升级到struts2.3 ...
- ubuntu13.04安装SenchaArchitect-2.2无法启动的问题
系统是ubuntukylin-13.04-desktop版本,不知道别的版本有没有这个问题,未测试.SenchaArchitect采用最新版本2.2.2,我安装的是32位的. 具体无法启动的问题如下: ...
- php curl模拟post请求提交数据样例总结
在php中要模拟post请求数据提交我们会使用到curl函数,以下我来给大家举几个curl模拟post请求提交数据样例有须要的朋友可參考參考.注意:curl函数在php中默认是不被支持的,假设须要使用 ...
- php 设置字符集为utf-8
header("Content-Type:text/html;charset=utf-8");
- Lambda表达式图解
internal delegate int MyDel(int x); public class Lambda { ; };//匿名方法 ; };//Lambda表达式 ; };//Lambda表达式 ...
- (function(){}())写法的用途
全局命名空间污染与 IIFE 总是将代码包裹成一个 IIFE(Immediately-Invoked Function Expression),用以创建独立隔绝的定义域.这一举措可防止全局命名空间被污 ...