zoukankan      html  css  js  c++  java
  • Struts2

    开篇:拦截器在Struts中的作用

         在我们的web.xml中,我们配置了一个过滤器,实现将所有请求交付StrutsPrepareAndExecuteFilter类。一旦接受到任意action的请求,该类会创建和初始化一个ActionProxy实例,它代理了具体的action,在其中我们可以添加任意拦截器在execute方法执行之前和之后做一些额外的操作,最终会调用该action实例的execute方法,为用户返回视图结果字符串,然后系统会根据该视图结果字符串调取相应的视图页面。下图是拦截器和action之间的关系:

    这里写图片描述

    这是一种典型的AOP思想,当我们在Struts.xml中定义一个包的时候,大部分情况下我们会继承struts-default文件,所以虽然我们在自己的配置文件中并没有手动配置任何的拦截器,但是我们创建的action却被很多拦截器拦截处理,就是因为struts-default中配置的拦截器生效了。Struts中内建了很多的拦截器,他们大多被配置在struts-default文件中,详细的内建拦截器的介绍可以参考官方API。

    1.ModelDriven 拦截器

    • 当用户触发 add 请求时, ModelDriven 拦截器将调用 EmployeeAction 对象的 getModel() 方法, 并把返回的模型(Employee实例)压入到 ValueStack 栈.
    • 接下来 Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. 因为此时 ValueStack 栈的栈顶元素是刚被压入的模型(Employee)对象, 所以该模型将被填充. 如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象

    2.Preparable 拦截器

    • Struts 2.0 中的 modelDriven 拦截器负责把 Action 类以外的一个对象压入到值栈栈顶
    • 而 prepare 拦截器负责准备为 getModel() 方法准备 model

    3. PrepareInterceptor拦截器用方法

    • 若 Action 实现 Preparable 接口,则 Action 方法需实现 prepare() 方法
    • PrepareInterceptor 拦截器将调用 prepare() 方法,prepareActionMethodName()方法 或 prepareDoActionMethodName ()方法 
    • PrepareInterceptor 拦截器根据 firstCallPrepareDo  属性决定获取 prepareActionMethodName 、prepareDoActionMethodName的顺序。默认情况下先获取 prepareActionMethodName (), 如果没有该方法,就寻找prepareDoActionMethodName()。如果找到对应的方法就调用该方法
    • PrepareInterceptor 拦截器会根据 alwaysInvokePrepare 属性决定是否执行prepare()方法

    4.paramsPrepareParamsStack 拦截器栈

    • paramsPrepareParamsStack 从字面上理解来说, 这个stack的拦截器调用的顺序为:首先 params,然后 prepare,接下来 modelDriven,最后再 params
    • Struts 2.0的设计上要求 modelDriven 在 params 之前调用,而业务中prepare要负责准备model,准备model又需要参数,这就需要在 prepare之前运行params拦截器设置相关参数,这个也就是创建paramsPrepareParamsStack的原因。
    • 流程如下:

        –      1. params拦截器首先给action中的相关参数赋值,如id

        –      2. prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象

        –      3. modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的

        –      4. params拦截器再将参数赋值给model对象

        –      5. action的业务逻辑执行

     

  • 相关阅读:
    C语言volatile关键字的用法
    UDP广播包
    进程和线程的区别
    Unix/Linux进程间通信
    虚拟空间,malloc
    自我介绍
    java初始化顺序
    java 队列基础操作
    java IO基础操作
    Python中的Tab补全功能添加
  • 原文地址:https://www.cnblogs.com/pjlhf/p/8721257.html
Copyright © 2011-2022 走看看