interceptor(拦截器)作为struts2的核心内容,struts2的大部分功能都是靠拦截器来实现的,如:校验,国际化,类型转换。。。
1.拦截器的概念
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
说到拦截器,不得不提下过滤器,其两者原理非常相似,在过滤器里面有过滤器链这个说法,而在Struts 2中称为拦截器栈Interceptor Stack。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
2.拦截器的实现原理
当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器,这个和过滤器原理相似,从下面的图中可以很容易理解其工作方式。
3.struts2自带的拦截器
struts2默认提供了十分丰富的拦截器,大家可以在struts2-core-2.3.1.2.jar包中的struts-default.xml查看关于默认的拦截器与拦截器链的配置。
//截取的部分默认拦截器
<interceptors>
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
<interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
<interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
<interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
<interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
<interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
<interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
<interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
<interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
<interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
<interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
<interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
<interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
</interceptors>
4.拦截器的配置
既然struts2自带了这么多拦截器,那么我们该怎么使用呢?下面我将给大家介绍自带拦截器的使用。
<?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>
<package name="myStruts2" extends="struts-default">
<action name="login" class="com.hx.struts2.LoginAction">
<result name="success">suc.jsp</result>
//使用自带的timer拦截器
<interceptor-ref name="timer"></interceptor-ref>
</action>
</package>
</struts>
/*
注:package 的name属性可以随便取,extends属性值必须是struts-default,如果想让某个Action使用某个拦截器只需在此Action里面加上如上配置即可,<interceptor-ref name="xxx"></interceptor-ref>,这个name属性值和你想要用的自带拦截器name属性值对应即可,要特别注意的是,每个action都有默认的拦截器,你如果加上“<interceptor-ref name="xxx" />”就会覆盖默认的defaultStack。如果你既想使用默认defaultStack,又想使用你想用的如上的<interceptor-ref name="timer"></interceptor-ref>拦截器,该怎么办呢?其实很简单,你只需在action的上面自己建一个拦截器栈即可。方法如下。
*/
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="timer"></interceptor-ref>
</interceptor-stack>
</interceptors>
//现在只需引入<interceptor-ref name="myStack"></interceptor-ref>即可满足你的需求,
//myStack里面可以任意添加自己想要实现的拦截器。
5.自定义拦截器的实现
大家用着用着可能发现使用自带的太局限了,struts2当然也早就考虑到这个问题,所以人家就利用那句话---“约定大于配置”,给你一个约定,你可以按照约定自己编写自己想要的拦截器,下面就给大家介绍该如何编写一个自己的拦截器。
//拦截器分为两种:1>.普通拦截器 2>方法拦截器
//大家在创建拦截器的时候一定要注意:拦截器必须是无状态的,否则可能引起线程同步 !
//1>.普通拦截器
public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
System.out.println("interceptor销毁");
}
@Override
public void init() {
System.out.println("interceptor初始化");
}
@Override
public String intercept(ActionInvocation invocation)
throws Exception {
//验证代码...
return xxx;
}
//如果你不需要init和destroy方法,你可以直接继承AbstractInterceptor
//在action里面配置自定义的拦截器
<interceptors>
<interceptor name="myTimer" class="com.kaishengit.interceptor.MyInterceptor"> </interceptor>
<interceptor-stack name="myInterceptor">
<interceptor-ref name="myTimer"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
//2>方法拦截器
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyMethodInterceptor extends MethodFilterInterceptor {
private static final long serialVersionUID = 1L;
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println(invocation.getProxy().getMethod() + "interceptor...");
return invocation.invoke();
}
}
//方法拦截器的配置和普通拦截器的一样,方法拦截器还可以自定义拦截哪些方法
<interceptor-ref name="myMethodInterceptor">
//会拦截的方法
<param name="includeMethods">login,edit,saveEdit</param>
//放行的方法
<param name="excludeMethods">execute,edit</param>
</interceptor-ref>
/*
最后还想给大家说一点技巧,如果你想让每个action都应用某个拦截器或者拦截器栈,为每个action都配置此个拦截器肯定不合理,这时候你可以自定义一个默认的拦截器。注意:默认拦截器一定要放到定义的拦截器的下面,这个struts2的约定!
*/
<default-interceptor-ref name="myStack"></default-interceptor-ref>
/*
另外还有你对用户是否登录的验证时候,没登录的必须让其返回到登录页进行登录,这时你可以配置一个全局的result。
*/
<global-results>
<result name="error" type="redirectAction">index</result>
</global-results>
好了,对于struts2的拦截器就说到这里,下一篇将给大家说一下struts2的文件上传。
- 大小: 42.2 KB
分享到:
相关推荐
Struts2框架的优势在于其强大的拦截器(Interceptor)机制,允许开发者定义自定义的行为,如日志记录、权限检查等,可以在请求处理流程中的不同阶段插入。此外,它还支持多种结果类型,如Redirect、Stream等,方便...
同时,了解Struts 2的配置文件(如struts.xml)和MVC模式是至关重要的,它们定义了Action的映射、结果类型、拦截器栈等关键配置。 总之,Struts 2.5.26-min-lib.zip是构建基于Struts 2的应用程序的基础,包含了一...
首先,Struts2的核心jar包是框架运行的基础,它们提供了Action映射、拦截器、结果类型和其他关键功能。对于Struts2 v2.1.6,以下是一些必要的jar文件: 1. **struts2-core.jar** - 包含Struts2框架的核心组件,如...
2. **拦截器栈**:多个拦截器的集合称为拦截器栈,Struts2默认提供了几个内置的拦截器栈,如`defaultStack`、`jsonStack`等,也可以自定义拦截器栈。 3. **拦截器配置**:拦截器可以通过Struts2的配置文件`struts....
在Struts1中,拦截器是框架的核心组件之一,它们提供了扩展功能和处理请求的能力,而无需修改Action类本身。本文将深入探讨在Struts1中如何使用拦截器,并以saif-0.1.jar为例,解释其在实际项目中的应用。 首先,...
Action是业务逻辑的载体,Result定义了动作执行后的结果导向,Interceptor是Struts2的拦截器机制,用于在Action执行前后进行额外的操作,如日志记录、权限检查等。此外,核心库还包含了配置管理、插件支持、类型转换...
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
Interceptor(拦截器)是Struts 2中的一个重要特性,它们按照预定义的顺序在Action执行前后进行干预,实现了如日志记录、权限验证等功能。ValueStack则是存储Action属性和OGNL表达式之间交互的对象容器。 Struts 2...
- **Interceptor(拦截器)**:这些是Struts2中的重要组件,它们在Action调用前后执行,提供了事务控制、日志记录、权限验证等功能。 - **配置文件**:通常有struts.xml或类似的配置文件,用于定义Action、结果...
3. **Interceptor(拦截器)**: XWork的拦截器机制是其一大亮点,它允许在Action执行前后插入自定义的处理逻辑,如日志记录、事务管理、权限控制等。通过组合不同的拦截器,可以构建出灵活的业务流程。 4. **配置...
2. **拦截器(Interceptors)**:Struts2的拦截器是其强大的特性之一,允许开发者在Action执行前后添加自定义逻辑。这些拦截器可以实现登录验证、日志记录、性能监控等多种功能。在源码中,你可以看到`...
总之,Struts2拦截器是框架的核心组件之一,它极大地增强了系统的可维护性和可扩展性。开发者应当充分利用拦截器来实现业务逻辑的解耦,提高代码的复用性和灵活性。通过深入学习和实践,我们可以熟练掌握这一强大...
通过 `<interceptor>` 和 `<interceptor-stack>` 标签可以在配置文件中定义和组织拦截器。 3. **值栈(Value Stack)**:值栈是 Struts 2 提供的一种数据管理机制,它将 Action 对象、ActionForm 对象和其他模型...
拦截器(Interceptor)可以插入到Action调用的流程中,实现如日志记录、权限验证等通用功能。视图通常使用Freemarker模板,通过OGNL表达式获取并显示模型数据。 总的来说,Struts2.1.8基础包提供了构建Web应用的...
`struts2-core-2.3.32.jar`是Struts2的核心库,包含了许多关键组件,如Action类、Interceptor拦截器、Result结果类型等。它负责处理HTTP请求,解析请求参数,执行业务逻辑,并将结果返回给用户。在这个版本中,针对...
1. `struts-2.0.1/struts2-core.jar`:这是Struts 2的核心库,包含Action、Result、Interceptor等核心组件。 2. `struts-2.0.1/ognl.jar`:OGNL(Object-Graph Navigation Language)是Struts 2中用于表达式语言,...
- Struts 2框架继承了Struts 1的优点,并对其进行了改进,支持更灵活的配置方式和更强大的拦截器机制。 #### 2. **MVC设计模式** - MVC(Model-View-Controller)是一种软件架构模式,用于将应用程序分为三个核心...
1.Struts2_01_login 对应登录。。 ... login_struts2.jsp-------------------------------采用struts标签的登陆页面 ...2.Struts2_03_TypeConverter ... 拦截器 17.Struts2_09up&down 上传和下载
struts2 最新的入门实例 我自己总结的 呵呵,欢迎提出宝贵的意见 1.Struts2_01_login 对应登录。。 ... login_struts2.jsp-------------------------------采用... 拦截器 17.Struts2_09up&down 上传和下载