zoukankan      html  css  js  c++  java
  • Struts相关

    struts2


    Action:

    在传统的MVC框架中,Control层一般都是一个类似与Servlet的一个java对象,因为从职责上讲,Control层需要完成一下的职责:

    1、接收从web容器传递过来的参数,并做恰当的类型转化。

    2、调用逻辑处理

    3、搜集证据,并返回到视图。

    其中的第一、三步骤,都需要web容器中的对象的处理。

    Struts2中的Action,与其他传统的MVC框架不同,使用XWork的Action来构造Control层。

    Struts2中的Action,并不需要依赖于特定的web容器,我们看不到类似HttpServletRequest,HttpServletResponse等web服务器相关的对象。

    所以:

    1、Struts2的Action并不带有任何web容器相关的对象,Action优势如何工作在web容器在的呢?

    虽然Struts2的aciton只是一个非常普通的java对象,并不具备任何web容器的特质,但是我们把Action放到一个更大的环境中来看。事实上,Struts2为Action的执行,准备了万丈的数据环境和执行环境,而这个执行环境,就保证了Action在web容器中的顺利运行。

    在Struts2中,每一个http的请求,会被发送到一个Filter.而这个Filter,就那会针对每个请求,创建出一个代码的执行环境,并在这个基础上,为每个执行环境配置与之独行的数据环境,而这个数据环境中的内容,就是来自与web容器中的一个又一个的对象。这样,就能顺利钓鱼那个Action执行代码而无须担心他是否在web容器中了。

    2、Struts2的Action并不带有任何web容器相关的对象,Action中又如何与web容器进行通信并获取web容器的相关对象呢?

    Struts2会为每个http的请求简历一个执行环境和数据环境,其中,数据环境就成为了Action获取web容器的基础。所以,当Action需要获取web容器的相关对象,需要通过数据环境来进行。

    Struts的Action的优点:

    1、使得Struts2的Action易于测试

    如果我们完全不考虑Action的执行环境,仅仅把Action看作一个普通的java对象,那么我们甚至可以直接new一个Action的对象,通过执行其中的方法完成测试,即,我们无需任何mock,来模拟web容器的环境。

    2、结合Action的执行环境,使得Struts2在Control这个层次上,能够定义更加丰富的执行层次。

    因为Action是一个普通的java类,而不是一个servlet类,完全脱离于web容器,所有我们就能够更加方便的对Control层进行合理的层次设计,从而抽象出许多公告的逻辑,并将这些逻辑脱离于Action对象本身,事实上,Struts2也是这么做的,无论Interceptor,还是Result,其实都是抽象出了Action中公共的逻辑部分,并将他们放到Action的外面,从而更加简化了Action的开发。

    3、使得Struts2的Action类似POJO,更加易于管理。

    Struts2的Action是一个线程安全的对象,而web容器传递过来的参数,也会传递到Action中的成员变量中,这样,Action看上去更像一个POJO,从而能够方便的被许多对象容器进行管理,比如说,可以非常方便的把Action纳入Spring的容器中进行管理。

    Action的生命周期:

     

    Action的五大元素:

    Action的数据环境、Action的执行环境、Action的调度者、Action的层次结构和Action的执行结果。

    ActionContext------数据环境

    之前我们提到了Struts2的Action并不是一个Servlet,它是脱离了web容器的,但是对于一个web框架来说,所有的数据请求(Request)和数据返回(Response)都是来源与web容器,那么Action在执行的时候,如何去获取这些数据呢???

    我们需要为每个Action准备一个数据环境------ActionContext。由于Action是应对于一个又一个的url请求,所以ActionContext应该具备以下的特性:

    1、ActionContext应成为Action与web容器之间的桥梁。

    2、ActionContext中应该保存有针对某个请求的详细信息

    3、ActionContext应该是一个线程安全的类对象

    Interceptor -----丰富的层次结构

    在Struts2中,使用了一种类似责任链的设计模式对这些不同职责进行分类并串联起来,从而使得Action层具备了丰富的层次结构,而在这个执行队列中的每个元素,就被我们称为interceptor,也就是拦截器。

    Interceptors can execute code before and after an Action is invoked.

    拦截器可以执行代码之前和之后调用的操作。

    拦截器是 AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来之地in个拦截器的代码在“织入点”的前后执行,从而起到拦截的作用。Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或之后执行拦截器的代码。

    Interceptor一层一层的把Action包了起来,这是一个典型的堆栈结构,在代码执行的时候,每个Interceptor不仅需要变成它本身自己的逻辑,还通过递归调用负责下一个拦截器或Action的调用。

    Struts2 Reference 写道
    Most of the framework's core functionality is implemented as Interceptors. Features like double-submit guards, type conversion, object population, validation, file upload, page preparation, and more, are all implemented with the help of Interceptors. Each and every Interceptor is pluggable, so you can decide exactly which features an Action needs to support.
    大多数框架的核心功能是作为拦截器实现的,功能,如双提交警卫、类型转换、对象认可、验证、文件上传、页面编写和更多,被实现拦截器的帮助,每个拦截器是可插拔的所以你可以决定到底那些功能需要支持的行动。
     
    因此,Struts2提供的绝大多数的功能支持,都通过Intercepor来实现,这新Interceptor可以随意进行配置,并且能够方便的插入程序中去运行。
     
     
    Results ---执行结果
    有执行必然有执行的结果,在Struts2中。action的执行结果被抽象成了一个层次,在这个层次中,可以定义任意类型的view层的结构。也就是说,Struts2并不强制view层的表现形式,可以是JSP、Freemarker模版、二进制流输出等等。
     
    Struts2把执行结果抽象成一个层次,使得你可以不再关注众多视图整合上面的细节,只需要考虑视图的类型和数据的准备,这样,也就可以不必在沉浸在杂乱的构造视图的代码中。
     
     
    ActionProxy ----执行环境
    有了拦截器Interceptor,有了Action本身,也有了Action的执行结果Result.我们就需要一个类似调度器的产品,将这些元素整合起来,进行调度执行,在上面的action lifecly的图中,我们可以看到,Interceptor、Action和Result都处于ActionProxy中,所以,ActionProxy就成为了所有这些元素的执行环境。
     
     
    ActionInvocation  ----调度者
    ActionInvocation就是Action的调用者,ActionInvocation在这个Action的执行过程中,负责Interceptor、Action和result等一系列元素的调度。
     
     
     

    参考:http://www.cnblogs.com/yan5lang/archive/2009/07/23/1529407.html

     

  • 相关阅读:
    3d角色模型 制作 全过程 。3d max 。3d role model making process.3d Max
    Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial
    unity3d 给游戏添加音源 Unity3d adds a sound source to the game
    安卓 运行、调试 配置 android Run/debug configurations
    Gradle 同步 已经开始 Gradle sync started
    更新 是 可用的 针对 安卓 软件开发包和工具 Updates are available for android software development packages and tools
    [Educational Codeforces Round 16]A. King Moves
    他们在军训,我在搞 OI(一)
    [POJ1383]Labyrinth
    [POJ1157]LITTLE SHOP OF FLOWERS
  • 原文地址:https://www.cnblogs.com/nin-w/p/6080878.html
Copyright © 2011-2022 走看看