java之struts2之拦截器
1.struts2能完成数据的设置,数据的封装,数据的类型转换,数据的校验等等。struts2是如何来完成这些功能的?struts2的所有功能都是由拦截器来完成的。
2.拦截器是struts2的核心。拦截器是一个类似于过滤器的类。在执行action的处理方法前会 先执行拦截器,然后再执行action的处理方法,然后再执行拦截器,再响应。

3. struts2的所有功能都是由拦截器来实现的,而拦截器在struts2中时可以自由配置和自由装配的。所以struts2的所有功能也都是可插拔的。并且struts2中的拦截器是可以自定义的,所以如果struts2没有提供项目所需的功能时,可以通过自定义拦截器来实现。
4. struts2的拦截器有哪些,分别有什么功能:
- alias : 对于HTTP请求包含的参数设置别名
- autowiring : 将某些JavaBean实例自动绑定到其他Bean对应的属性中。有点类似Spring的自动绑定,在Spring部分会详细说明
- chain : 在Web项目开发中,以前使用Struts开发的时候经常碰到两个Action互相传递参数或属性的情况。该拦截器就是让前一个Action的参数可以在现有Action中使用。
- conversionError : 从ActionContext中将转化类型时候发生的错误添加到Action的值域错误中,在检验的时候经常被使用来显示类型转化的错误信息
- cookie : 从Struts2.0.7版本开始,可以把cookie注入Action中可设置的名字或值中
- createSession : 自动创建一个HTTP的 Session, 尤其是对需要HTTP的Session的拦截器特别有用。比如下面介绍的TokenInterceptor
- debugging : 用来对在视图间传递的数据进行调试
- execAndWait : 不显示执行Action, 在视图上显示给用户的是一个正在等待的页面,但是Action其实是在背后正在执行着。该拦截器尤其在对进度条进行开发的时候特别有用。
- exception : 将异常和Action返回的result相映射
- fileUpload : 支持文件上传功能的拦截器
- i18n : 支持国际化的拦截器
- logger : 拥有日志功能的拦截器
- modelDriven : Action执行该拦截器的时候,它可以从一个scope范围检索和存储model值,通过调用setModel方法去设置model的值
- params : 将HTTP请求中包含的参数值设置到Action中
- prepare : 假如Action继承了Preparable接口,则会调用prepare方法
- staticParams : 对于在struts.xml文件中的Action中设置的参数设置到对应的Action中
- scope : 在session或者application范围中设置Action的状态
- servletConfig : 该拦截器提供访问包括HttpServletRequest和HttpServletResponse对象的Map方法
- timer : 输出Action的执行时间
- token : 避免重复提交的校验拦截器
- tokenSession : 和token拦截器类似,但它还能存储提交的数据到session里
- validation : 运行在action-validation.xml文件中定义的校验规则。(数据校验部分)
- workflow : 在Action中调用validate检验方法。如果Action有错误则返回到 input 视图
- store : 执行校验功能的时候,该拦截器提供存储和检索Action的所有错误和正确信息的功能
- checkbox : 视图中如果有checkbox存在的情况,该拦截器自动将unchecked的checkbox当做一个参数(通常为false)记录下来。这样可以用一个隐藏的表单值来记录所有未提交的checkbox,而且缺省unchecked的checkbox值是布尔类型的,如果视图中checkbox的值设置的不是布尔类型,它就会被覆盖成布尔类型的值
- profiling : 通过参数来激活或者不激活分析检测功能,前提示Web项目是在开发模式下。(涉及到调试和性能检验时使用)
- roles : 进行权限配置的拦截器,如果登录用户拥有相应的权限才去执行某一特定的Action
5.struts2中拦截器定义的位置在struts-default.xml中
6.自定义拦截器步骤:
a) 编写类,实现Interceptor接口
public class ActionExecuteTimeInterceptor implements Interceptor{
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
long start=System.currentTimeMillis();
//执行下一个拦截器 如果下面没有拦截器则执行action的处理方法,并将结果返回
String result = invocation.invoke();
System.out.println("执行时间为:"+(System.currentTimeMillis()-start));
return result;
}
}
b) 在struts.xml中配置拦截器
<!-- 拦截器配置 -->
<interceptors>
<!-- 配置自定义拦截器
name 是唯一的
class 是自定义拦截器的完全限定名
-->
<interceptor name="executeTime" class="cn.sxt.interceptor.ActionExecuteTimeInterceptor"></interceptor>
</interceptors>
c) 在对应action中 引用自定义拦截器
<package name="default" extends="struts-default" namespace="/">
<!-- 拦截器配置 -->
<interceptors>
<!-- 配置自定义拦截器
name 是唯一的
class 是自定义拦截器的完全限定名
-->
<interceptor name="executeTime" class="cn.sxt.interceptor.ActionExecuteTimeInterceptor"></interceptor>
</interceptors>
<action name="add" class="cn.sxt.action.UserAction" method="add">
<result>/success.jsp</result>
<!-- 在action中引用自定义的拦截器 -->
<interceptor-ref name="executeTime"></interceptor-ref>
</action>
</package>
7.自定义拦截器有两种方式实现,一种实现Interceptor接口还可以继承AbstractInterceptor类来实现:如:
public class HelloInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("hello interceptor 被执行");
return invocation.invoke();
}
}
8.如果引用了自定义拦截器,那么struts2的拦截器将不再起作用。如果需要使用struts2的拦截器需要手动引入。
<action name="add" class="cn.sxt.action.UserAction" method="add">
<result>/success.jsp</result>
<!-- 在action中引用自定义的拦截器 -->
<interceptor-ref name="executeTime"></interceptor-ref>
<interceptor-ref name="helloInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
9.当自定义拦截器比较多时,在action中引用拦截器将会变得比较麻烦,所以呢,struts2提供了拦截器栈。拦截器栈是用来引用已经定义好的拦截器的。一个拦截器栈可以包括多个拦截器,引用拦截器栈的方式和引用拦截器的方式一样。
<!-- 拦截器配置 -->
<interceptors>
<!-- 配置自定义拦截器
name 是唯一的
class 是自定义拦截器的完全限定名
-->
<interceptor name="helloInterceptor" class="cn.sxt.interceptor.HelloInterceptor"></interceptor>
<interceptor name="executeTime" class="cn.sxt.interceptor.ActionExecuteTimeInterceptor"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="executeTime"></interceptor-ref>
<interceptor-ref name="helloInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="add" class="cn.sxt.action.UserAction" method="add">
<result>/success.jsp</result>
<!-- 在action中引用自定义的拦截器 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
10.在struts2如果没有自定义拦截器时,action类会引用默认的拦截器栈。如果有自定义拦截器后,想自定义拦截器设置为默认拦截器应该如何操作?
在package中去定义一个default-interceptor-ref即可。
<!-- 设置默认拦截器 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="add" class="cn.sxt.action.UserAction" method="add">
<result>/success.jsp</result>
</action>
11.拦截器的使用:
登录拦截器用来实现用户登录检查:
public class LoginInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//判断执行的Action是否login.action
//如果不是 判断用户是否登录
//如果登录了 执行下一个拦截器,如果没有登录 去登录
//获取执行action的名称
String actionName=invocation.getProxy().getActionName();
if("login".equals(actionName)){
return invocation.invoke();
}
Object obj=ServletActionContext.getRequest().getSession().getAttribute("currentUser");
if(obj!=null){
return invocation.invoke();
}
return Action.LOGIN;
}
}
配置
<struts>
<package name="default" extends="struts-default" namespace="/">
<!-- 拦截器配置 -->
<interceptors>
<interceptor name="loginInterceptor" class="cn.sxt.interceptor.LoginInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!-- 定义全局结果集 -->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<action name="login" class="cn.sxt.action.UserAction" method="login">
<result>/success.jsp</result>
</action>
<action name="show" class="cn.sxt.action.UserAction" method="show">
<result>/show.jsp</result>
</action>
</package>
</struts>
12.总结:
拦截器是单列的,所有action执行的都是同一个拦截器。所以在自定义拦截器时要注意线程安全的问题。拦截器只拦截action。
13.注意过滤器和拦截器区别
14. 方法拦截器
方法拦截器是比拦截器更加细粒度的拦截器,只拦截方法。通过配置方法拦截器可以有效提高系统性能。
/**
* 自定义方法拦截器
*
*/
public class AddMethodInterceptor extends MethodFilterInterceptor{ @Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("进入方法拦截器");
return invocation.invoke();
} }
配置
<!-- 配置方法拦截器 -->
<interceptor name="addInterceptor" class="cn.sxt.interceptor.AddMethodInterceptor">
<!-- 配置哪些方法 需要被拦截 -->
<param name="includeMethods">add</param>
<!-- 排除哪些方法不被拦截
<param name="excludeMethods"></param> -->
</interceptor>
java之struts2之拦截器的更多相关文章
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- Struts2使用拦截器完成权限控制示例
http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求: 要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...
- Struts2【拦截器】就是这么简单
什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...
- Struts2学习-拦截器
1.新建项目user4,建立好和user3一样的目录,与之相比只是添加几个类,主要是struts.xml和action类的改变,其结果没有太大的变化 struts,xml <?xml versi ...
- JavaWeb框架_Struts2_(三)---->Struts2的拦截器
2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...
- 谈谈 Struts2 的拦截器
套话 相信非常多人都用过 Struts2 了,当然,对 Struts2 的原理也都比較了解.之前在一个项目中就已经用到了,当初的理解也不过局限在应用的层面上,对于更深层次的原理.机制,了解的并非非常多 ...
- JavaWeb_(Struts2框架)拦截器interceptor
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)
参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspec ...
- struts2 paramsPrepareParamsStack拦截器简化代码(源码分析)
目录 一.在讲 paramsPrepareParamsStack 之前,先看一个增删改查的例子. 1. Dao.java准备数据和提供增删改查 2. Employee.java 为model 3. E ...
随机推荐
- iis启动 服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425)
问题描述:每隔一段时间应用程序池就会自动停止. 再次启动就报错:服务无法在此时接受控制信息. (异常来自 HRESULT:0x80070425) 处理办法:同时按下Win+R,运行“services. ...
- Java 12 骚操作, String居然还能这样玩!
Java 13 都快要来了,12必须跟栈长学起! Java 13 即将发布,新特性必须抢先看! 栈长之前在Java技术栈微信公众号分享过<Java 11 已发布,String 还能这样玩!> ...
- Kafka(四) —— KafkaProducer源码阅读
一.doSend()方法 Kafka中的每一条消息都对应一个ProducerRecord对象. public class ProducerRecord<K, V> { private fi ...
- 微信小程序之页面导航栏
效果图: 页面有点丑,作为初次学习,页面可以要求不那么美观,先学会再说.毕竟后面可以优化的很漂亮. 代码实例如下: <view class="section btn-area" ...
- node.js使用cluster实现多进程
首先郑重声明: nodeJS 是一门单线程!异步!非阻塞语言! nodeJS 是一门单线程!异步!非阻塞语言! nodeJS 是一门单线程!异步!非阻塞语言! 重要的事情说3遍. 因为nodeJS天生 ...
- SOAP简介及实例
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换. 或者更简单地说:SOAP 是用于访问网络服务的协议. 您应当具备的基础知识 在继续学习之前,您需要对下面的知识有基本 ...
- Redis配置讲解及实战
前言 Redis是一个开源的内存k-v数据库,同时也可用作缓存,消息队列.支持多种数据类型,如字符串,列表,字典,集合,有序集合. 演示环境 $ uname -a Darwin Darwin Kern ...
- free中buffer 与 cache 的区别
通常人们所说的Cache就是指缓存SRAM. SRAM叫静态内存,“静态”指的是当我们将一笔数据写入SRAM后,除非重新写入新数据或关闭电源,否则写入的数据保持不变. 由于CPU的速度比内存和硬盘的速 ...
- Android: 判断当前手机品牌(转)
参考资料 Android判断手机ROM 正文 有时候需要判断手机系统的ROM,检测ROM是MIUI.EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件查找是否有对应属性 ...
- JavaXXX成长直通车_汇总
学习开始于2019-12-08 阶段一 阶段一-01.万丈高楼,地基首要-第1章 学习指南-1-1 课程导学 1-2是图片 阶段一-01.万丈高楼,地基首要-第1章 学习指南-1-3 大型网站架构演变 ...