`
cjp1989
  • 浏览: 162782 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2知识积累(2)_核心概念:拦截器

阅读更多
     前言:Struts2的三大组件:动作、拦截器、数据转移。动作组件可能是我们日常中经常接触的。但是在后台默默无闻工作的拦截器,却是真正的核心。在Struts2中没有一个动作被单独调用,总是包含了一系列的拦截器在动作执行之前或之后执行。通过创建一个ActionInvocation的对象,封装了一系列被配置在动作之前或之后触发的拦截器。Struts2提供了一组强大的智能默认值,如defaultStack提供了一个常用的拦截器组合。做web应用时,整个系统的权限设置,日志控制,依靠拦截器可以很方便的的实现。

1.拦截器的原理:
    1.1 总指挥ActionInvocation接口,是理解拦截器的关键。它控制着整个动作的执行,以及与之相关的拦截器栈的执行顺序。当struts2框架接收到一个request-->决定url映射到哪个动作-->这个动作的一个实例会被加入到一二新创建的ActionInvocation实例中-->通过xml配置发现那些触发器按么顺序触发.
public interface ActionInvocation extends Serializable {
    Object getAction();
    boolean isExecuted();
    ActionContext getInvocationContext();
    ActionProxy getProxy();
    Result getResult() throws Exception;
    String getResultCode();
    void setResultCode(String resultCode);
    ValueStack getStack();
    void addPreResultListener(PreResultListener listener);
    /**
     * Invokes the next step in processing this ActionInvocation.
     * <p/>
     * If there are more Interceptors, this will call the next one. If Interceptors choose not to short-circuit
     * ActionInvocation processing and return their own return code, they will call invoke() to allow the next Interceptor
     * to execute. If there are no more Interceptors to be applied, the Action is executed.
     * If the {@link ActionProxy#getExecuteResult()} method returns <tt>true</tt>, the Result is also executed.
     *
     * @throws Exception can be thrown.
     * @return the return code.
     */
    String invoke() throws Exception;
    String invokeActionOnly() throws Exception;
    void setActionEventListener(ActionEventListener listener);
    void init(ActionProxy proxy) ;
}

框架通过调用ActionInvocation的invoke方法开始动作的执行,但并不总是映射到第一个拦截器,ActinInvocation负责跟踪执行的状态,并且把控制交给合适的拦截器。通过调用拦截器的intercept()方法将控制交给拦截器。.实际应用中编写的拦截器要实现Interceptor接口,通过intercept()方法返回的控制字符串决定页面的跳转,实现登录,权限控制。这就是拦截器的原理。
public interface Interceptor extends Serializable {
    void destroy();
    void init();
    /**
     * Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the
     * request by the {@link ActionInvocation} or to short-circuit the processing and just return a String return code.
     *
     * @param invocation the action invocation
     * @return the return code, either returned from {@link ActionInvocation#invoke()}, or from the interceptor itself.
     * @throws Exception any system-level error, as defined in {@link com.opensymphony.xwork2.Action#execute()}.
     */
    String intercept(ActionInvocation invocation) throws Exception;

}


2.如何应用拦截器:
    Struts2作为一种声明性框架,在建立拦截器也是采用声明的方式构建构建拦截器、构建栈(stack)、向拦截器传递参数。通常大部分的拦截器以已经在struts-default包中提供了,下面贴出部分配置信息。记住:xml是声明拦截器的唯一选择。注解机制现在还不能支持声明拦截器.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="struts-default" abstract="true">
 <result-types>
     <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
  .........
 </result-types>
  //interceptorsy元素
 <interceptors>
  <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>  .........
  //声明拦截器栈
  <interceptor-stack name="defaultStack">
   <interceptor-ref name="exception"/>
     .........
   <interceptor-ref name="validation">
    <param name="excludeMethods">input,back,cancel,browse</param>
   </interceptor-ref>
  </interceptor-stack>  
  </interceptors>
  //默认引用
<default-interceptor-ref name="defaultStack"/>
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
</package>

</struts>


http://struts.apache.org/dtds/struts-2.3.dtdDTD文件说明:表明Struts.xml的配置文件元素的信息,安装下面条件顺序出现
<!ELEMENT struts (package|include|bean|constant)*>
<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-exception-mappings?, action*)>

struts.xml配置拦截器说明:interceptors元素包含了这个包(struts-default)内的所有interceptor和interceptor-stack的声明,每一个intercptor元素声明了一个可以在这个包内使用的拦截器,只是将一个拦截器的实现类映射到一个逻辑名,class="",就是实现类,这种声明实际上没有创建一个拦截器,或者把这个拦截器与任何动作关联,仅仅是把一个名字映射到一个类。struts-default包内声明了几个拦截器栈,其中最重要的是defaultStack;interceptor-Stack元素的内容是一些列的intercept-ref元素,这些引用必须都指向inrerceptor元素创建的某个逻辑名。如果构建自定义拦截器,创建自己的栈也是这样的简单,栈内的interceptor-ref传入的参数引用自己的拦截器类的逻辑名。最后,一个包可以定义一组默认的拦截器,<default-interceptor-ref name=""/>定义的拦截器组会与这个包内没有显式声明自己的拦截器的所有动作关联。,同样默认引用的元素只指向一个逻辑名=defaultStack,当我们继承这个struts-default包时,允许动作继承默认的拦截器栈defaultStack。

3.实际应用拦截器(以用户登录为例)
先写拦截器的实现类:
public class DemoInterceptor implements Interceptor{
	private String msg ;
	public void init() {
		
	}
	public void destroy() {
		
	}	
	public String intercept(ActionInvocation actionInvocation ) throws Exception {
		
		/* 获取session对象
		 * Map session=ActionContext.getContext().getSession();
		 */
		Map session=actionInvocation.getInvocationContext().getSession();
		 //判断是否登录
		  if(session.get("user")==null||"".equals(session.get("user"))){
			  System.out.println("没有登陆,返回到主页面"); 
			  msg="您好,请重新登录...";
			  actionInvocation.getStack().setValue("msg", msg);
			  //重新指向登录界面
			  return "login";
		  }
		  else{
			  //继续动作的调用,将控制权转交给剩余的拦截器及动作
			  return actionInvocation.invoke();
		  }
	}
}

struts.xml配置文件的书写,定义的是全局拦截器:
<package name="global" extends="struts-default" >
 <interceptors>
  <interceptor name="demoInterceptor" class="demo.DemoInterceptor"/>
  <interceptor-stack name="myStack">
   <!--加入默认的defaultStack-->
   <interceptor-ref name="defaultStack"/>
   <!--加入自己定义的拦截器-->
   <interceptor-ref name="demoInterceptor"/>     
  </interceptor-stack>
 </interceptors>
 <!--将myStack声明为这个包的默认拦截器栈-->
 <default-interceptor-ref name="myStack"/>
 <global-results>
  <result name="login">/login.jsp</result>
 </global-results>
</package>
 ......

如果想在其他包也扩展你写的自定义拦截器,只要在该包的extends="global",就是继承写了自定义拦截器的包

4.结束:
  上面简单的介绍了我对struts2的拦截器的了解,并且写了个很简单的demo,这个可以有读者扩展。文章肯定是有写错或不完善的的地方,欢迎大家指出,因为我也是个菜鸟...下一篇将是:struts2的数据转移和视图层应用...
6
1
分享到:
评论
1 楼 zjilvufe 2012-12-26  
包也扩展你写的自定义拦截器,只要在该包的

相关推荐

    Struts2_API.rar_API_struts2_struts2 api_struts2 api chm_struts2文

    3. **拦截器(Interceptor)**:拦截器是Struts2的核心特性之一,它们按照预定义的顺序在Action调用前后执行,实现了AOP(面向切面编程)的概念。拦截器可以用来实现日志、事务管理、权限验证等功能。 4. **配置...

    Struts2_CRUD.rar_struts2学生_struts2系统_struts2选课_struts学生_简单选课

    通过学习和分析这个Struts2学生选课系统,开发者可以掌握Struts2的核心概念和实践技巧,为构建更复杂的Web应用打下坚实基础。同时,这也是一个很好的实战案例,帮助开发者理解如何将理论知识应用到实际项目中。

    struts2 拦截器

    ### 一、Struts2 拦截器概念 1. **拦截器是什么**:拦截器是一种动态拦截Action调用的对象,它可以理解为一个过滤器,它在Action被调用之前和之后执行特定的逻辑。Struts2的拦截器是基于Java的Servlet Filter机制...

    struts2_api.rar_STRUTS2-API_structs2 api_struts2 api_struts2 res

    5. **Struts2配置**:Struts2的配置可以是XML(struts.xml)或基于注解的,用于定义Action、结果、拦截器栈等。文档中将详细解释如何配置这些元素以满足不同需求。 6. **OGNL(Object-Graph Navigation Language)*...

    一个Struts2的核心拦截器例子

    1. **Struts2拦截器概念**: - 在Struts2中,拦截器是一个实现了`Interceptor`接口的类,它通过`ActionInvocation`对象来控制动作的执行流程。拦截器链是由多个拦截器按照指定顺序组成的,每个拦截器都可以在执行...

    struts2 拦截器实例

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...

    Struts2拦截器及其用法详细说明

    这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP(面向切面编程)思想的组件,它可以理解为在Action调用前后插入的逻辑处理。在...

    详解Struts2拦截器

    通过对Struts2拦截器的深入分析,我们可以看出拦截器不仅是Struts2框架的核心组成部分,也是实现代码重用、提高代码质量的有效手段。理解并合理运用拦截器,对于提升项目的开发效率和代码质量具有重要意义。

    Struts2学习案例(拦截器)

    在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...

    Struts2拦截器源码

    首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...

    struts2拦截器

    在Struts2中,拦截器(Interceptor)是核心功能之一,用于增强应用的功能和处理业务逻辑。拦截器是基于AOP(面向切面编程)的概念,可以在动作执行前后插入额外的操作,比如日志记录、权限检查、数据验证等。 标题...

    Struts2_CRUD.rar_Struts2_CRUD_Struts2的增改删查 操作 示例_struts2_struts2

    综上所述,"Struts2_CRUD"示例涵盖了使用Struts2框架进行基本数据操作的核心概念和实践。通过学习这个示例,初学者可以理解如何在Struts2中组织Action、Form、Interceptor、配置文件和视图,以及如何实现CRUD操作和...

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    Struts2知识点

    Struts2 的 Action 是一个核心概念,Action 负责处理用户的请求并返回结果。Action 可以通过继承 Struts2 的 ActionSupport 类或实现 Struts2 的 Action 接口来实现。 6. Struts2 的结果类型: Struts2 的结果类型...

    struts2_loginCheck.rar_下载LoginCheck

    首先,我们需要了解Struts2的核心概念: 1. **Action类**:在Struts2中,Action类是业务逻辑的载体,它对应于MVC中的Controller。通常,每个Action类都会对应一个用户请求,并负责处理该请求。 2. **Action配置**...

    Struts2_interceptor_和_filter区别

    标题和描述均聚焦于“Struts2_interceptor_和_filter区别”,这暗示着对比和解析Struts2框架中拦截器(Interceptor)与过滤器(Filter)的差异是本文的核心议题。接下来,我们将深入探讨这两者在功能、实现方式以及...

    Struts 2 技术详解:基于WebWork核心的MVC开发与实践

    学习Struts 2,你需要理解它的核心概念,熟悉Action、Interceptor、Result和配置管理。同时,掌握如何创建和配置Action,编写拦截器,以及如何利用OGNL在视图中动态展示数据。通过实际项目的练习,你可以更好地掌握...

    Struts2拦截器源程序

    总结来说,Struts2拦截器是框架的核心部分,它们提供了一种灵活的方式,以实现各种功能,如日志记录、性能监控、权限控制等,同时保持代码的整洁和模块化。通过对`98struts201`文件的深入研究,我们可以更好地掌握...

    尚硅谷_佟刚_Struts2

    尚硅谷_佟刚_Struts2的讲解课件是针对这个框架的一份详细教程,旨在帮助学习者理解和掌握Struts2的核心概念和实际应用。 在Struts2框架中,主要知识点包括: 1. **核心架构**:Struts2基于拦截器(Interceptor)的...

Global site tag (gtag.js) - Google Analytics