Struts2知识点小结(四)--拦截器与注解开发
一、Struts2的拦截器(interceptor)
作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强、权限控制),需要拦截器组件
1、struts2内置拦截器
1.1 struts-default.xml中配置好的拦截器
struts2框架已经定义好并使用的拦截器
发送请求 -----> interceptor1---->interceptor2 ------>......-----> DemoAction
在struts-default.xml文件中已经声明了多个拦截器
<interceptors>
... ...
<!--声明拦截器-->
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
... ...
<!--声明拦截器栈-->
<interceptor-stack name="basicStack">
... ...
<interceptor-ref name="exception"/>
... ...
</interceptor-stack>
</interceptors>
<!-- 默认的拦截器引用 -->
<default-interceptor-ref name="defaultStack"/>
1.2 源码分析interceptor的执行过程(简化源码)
--->StrutsPrepareAndExecuteFilter
--->public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
--->execute.executeAction(request, response, mapping);
--->dispatcher.serviceAction(request, response, mapping);
--->ActionProxy proxy = createActionProxy();
--->proxy.execute();
--->retCode = invocation.invoke();
--->
Iterator<InterceptorMapping> interceptors;
//判断迭代器集合中是否还有下一个(递归)
if (interceptors.hasNext()) {
final InterceptorMapping interceptor = interceptors.next(); //获得当前InterceptorMapping对象
resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
获得拦截器对象本身 调用该拦截器内部的拦截方法intercept
} else {
resultCode = invokeActionOnly(); //仅仅执行当前要访问目标Action
}
PS:
resultCode:逻辑视图名,字符串
总结:
如果在interceptor中调用invocation.invoke(); 代表放行
如果在interceptor中return 字符串,代表不放行 , 且return的字符串就是要匹配的逻辑视图
PS:
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
class InterceptorMapping{
private String name; //modelDriven
private Interceptor interceptor; //class对应全限定名的对象
}
细节点:拦截器的作用范围
1、当前包下所有的Action都执行配置的拦截器
<default-interceptor-ref name="my"></default-interceptor-ref>
2、action可以执行自己局部的interceptor
<action name="target_*" class="com.itheima.action.TargetAction" method="{1}">
<interceptor-ref name="my"></interceptor-ref>
<result name="success">/success.jsp</result>
</action>
3、action中的方法可以执行局部的interceptor
例如:访问target的show方法执行my拦截器 访问target的xxx方法不执行my拦截器
class MyInterceptor3 extends MethodFilterInterceptor
<interceptor-ref name="my3">
<param name="excludeMethods">xxx</param>
</interceptor-ref>
2、struts2自定义拦截器
开发步骤:
1、自定义拦截器类 实现interceptor接口(继承interceptor的实现类)
2、实现intercept方法,该方法封装拦截功能的逻辑代码
3、在struts.xml中配置拦截器
声明拦截器
使用拦截器
4、测试
二、Struts2的注解开发
Struts2的注解开发 主要 是对Action的xml配置替代
Struts2注解开发需要导入额外jar包:Struts2-convention-plugin.jar
作用到类上的注解
@Namespce()
@ParentPackage()
@Results({})
@Result(name,type,location)
@InterceptorRefs({})
@InterceptorRef()
作用到方法的注解
@Action(
value="",
results={},
interceptorRefs={}
)
注意
struts默认扫描action,actions,struts,struts2这4个包的注解 手动配置扩充包名称
<constant name="struts.convention.package.locators" value="action,actions,struts,struts2,web"/>
Struts2知识点小结(四)--拦截器与注解开发的更多相关文章
- Struts2(十四)拦截器实现权限管理
一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...
- 框架学习之Struts2(四)---拦截器和标签
一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...
- SpringMVC(AbstractController,拦截器,注解)
1.Controller接口及其实现类 Controller是控制器/处理器接口,只有一个方法handleRequest,用于进行请求的功能处理(功能处理方法),处理完请求后返回ModelAndVie ...
- Struts2基础学习(五)—拦截器
一.概述 1.初识拦截器 Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...
- 【struts2】预定义拦截器
1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个St ...
- 使用struts2中默认的拦截器以及自定义拦截器
转自:http://blog.sina.com.cn/s/blog_82f01d350101echs.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Acti ...
- Struts2 (四) — 拦截器
一.拦截器 1.概述 1.1什么是拦截器 在struts2中,拦截器(Interceptor)是用来动态拦截Action执行的对象. 拦截器有点类似以前Servlet阶段的Filter(过滤器 ...
- struts2(三) 输入校验和拦截器
前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器, --WH 一.输入校验 在以前我们写一个登录页面时,并 ...
- Struts2 源码分析——拦截器的机制
本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样 ...
随机推荐
- CSS3动画属性animation的基本用法
CSS3新增了一个令人心动的属性:animation,尽管利用animation做出来的动画没有flash或者javascript做出的动画流畅绚丽,但是从代码量和浏览器性能上有着明显的优点. ani ...
- sql时间区间查询性能测试
这个测试针对"一个月"的区间来查询数据.分datetime类型和nvachar类型. 先比较datetime类型: 一.datediff函数 declare @beginTime ...
- Wp及Windows应用商店程序Logo生成器
在开发wp或windows应用商店程序时,需要制作不同分辨率下的logo,往往不同分辨率下的logo仅仅是图片尺寸或图片的内边距不同,为了快速生成不同分辨率下的图片,减少工作量,于是就自己动手开发了个 ...
- Windows进程间通信--命名管道
1 相关概述 命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制.命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信. ...
- SVN服务器在Ubuntu16.04下搭建多版本库详细教程
1 介绍 Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 以很方面恢复到以前的版本,并可以查看数据 ...
- 【数据库】5.0 MySQL入门学习(五)——MySQL源码了解及MySQL初始化设置
1.0 MySQL源码目录主要包括:客户端代码.服务端代码.测试工具.其他库文件.当然,看懂源代码得有一定的C语言基础. BUILD:各种平台的编译脚本,可以用来制作各平台的二进制版本 client: ...
- 使用Android Studio搭建Android开发环境
一.Android Studio简单介绍 2013年GoogleI/O大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA开发环境,旨 ...
- Java开发高性能网站需要关注的事
转自:http://www.javabloger.com/java-development-concern-those-things/ 近期各家IT媒体举办的业内技术大会让很多网站都在披露自己的技术内 ...
- geth访问公有链
同步以太坊,配置rpc地址 mkdir /opt/blockchain nohup geth --syncmode "fast" --cache=1024 --maxpeers 3 ...
- SQL Server ->> 在SQL Server中创建ASSEMBLY
首先要把数据库的TRUSTWORTHY属性改为ON ALTER DATABASE [MYDB] SET TRUSTWORTHY ON GO 接下来直接创建ASSEMBLY应该就没问题了.但是往往有可能 ...