- 浏览: 138463 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
nishwd123:
受益匪浅,多谢楼主细心讲解.
Hibernate、Spring和Struts工作原理及使用理由 -
doublelcf:
写得真好。全面,流畅。清晰
Hibernate、Spring和Struts工作原理及使用理由
Struts的体系结构
(Struts Framework Architecture)
胡长城(银狐999)
关键字
Struts,Framework,Architecture,Componennt,MVC
预备知识
在开始学习Struts以前,以下的知识点,需要有所了解: 模型-视图-控制的软件构架模式,JSP/Servlet的web层应用,J2EE体系结构。如果对客户标签类(Customer TagLib)有所了解也许更容易理解Struts本身的TagLib。
概述
本文主要从概念上讲解什么是struts framework,它的框架结构,组件结构,以及简单的配置讲解。对于其应用请参考后面的“struts安装及应用”和“struts实用案例分析”。
文章的包括了如下四大部分:
一、 Framework的概念和体系简介 (Framework Conception and Architecture)
二、 Struts的概念和体系结构(Struts Conception and Architecture)
三、 Struts的工作原理和组件(Struts Componennts)
四、 Struts配置文件简介(Struts Deployment Description)
一、 Framework概念
一直以来我们都说struts是一个web framework。那么让我么先来看看什么是Framework。(我想用“框架”一词来翻译framework,可是后来越来越发现不太理想和完备,所以就直接用Framework一词)
Framework概念并不是很新了,伴随着软件开发的发展,在多层的软件开发项目中,可重用、易扩展的,而且是经过良好测试的软件组件,越来越为人们所青睐。这意味着人们可以将充裕的时间用来分析、构建业务逻辑的应用上,而非繁杂的代码工程。于是人们将相同类型问题的解决途径进行抽象,抽取成一个应用框架。这也就是我们所说的Framework。
Framework的体系提供了一套明确机制,从而让开发人员很容易的扩展和控制整个framework开发上的结构。 通常,framework的结构中都有一个“命令和控制”组件("command and control" component)——Framework Factory and Manager。
图片(2):Framework体系
通过基于请求响应(Request-Response)模式的应用framework,基本上有如下几个表现逻辑结构组成。
(1)控制器(Controller)——控制整个framework中各个组件的协调工作。
(2)业务逻辑层(Business Logic)——这是framework所希望解决问题的关键。当然对framwork本身来说,这里仅仅只是概念和几个提够服务的基础组件,真正的实现与客户的业务逻辑接轨,还需要开发人员在framework上再次扩展。
(3)数据逻辑层(Data Logic)——绝大应用系统都需要涉及到数据交互,这一层次主要包括了数据逻辑和数据访问接口。对于数据逻辑来说,如果你了解数据建模(Data Modeling)可能就很容易理解。
下面就进入我们的正题——Struts的结构
二、 Struts的概念和体系结构
Struts有一组相互协作的类(组件)、Serlvet以及jsp tag lib组成。基于struts构架的web应用程序基本上符合JSP Model2的设计标准,可以说是MVC设计模式的一种变化类型。根据上面对framework的描述,我们很容易理解为什么说Struts是一个web framwork,而不仅仅是一些标记库的组合。但 Struts 也包含了丰富的标记库和独立于该框架工作的实用程序类。
Struts有其自己的控制器(Controller),同时整合了其他的一些技术去实现模型层(Model)和视图层(View)。在模型层,Struts可以很容易的与数据访问技术相结合,包括EJB,JDBC和Object Relation Bridge。在视图层,Struts能够与JSP, Velocity Templates,XSL等等这些表示层组件想结合。
2.1 Struts的与Web App的关系
既然struts叫做web framework,那么其肯定主要基于web层的应用系统开发。按照J2EE Architecture的标准,struts应当和jsp/servlet一样,存在于web container一层。如图片(3)所显示
图片(3): Struts与WebApp的关系
2.2 Struts的体系结构
我们说struts framework是MVC 模式的体现,下面我们就从分别从模型、视图、控制来看看struts的体系结构(Architecture)。图片(4)显示了struts framework的体系结构响应客户请求时候,各个部分工作的原理。
图片(4):Struts体系结构
2.2.1从视图角度(View)
主要由JSP建立,struts自身包含了一组可扩展的自定义标签库(TagLib),可以简化创建用户界面的过程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 这几个Taglib。有关它们的详细资料请参考struts用户手册
2.2.2从模型角度(Model)
模型主要是表示一个系统的状态(有时候,改变系统状态的业务逻辑操作也也划分到模型中)。在Struts中,系统的状态主要有ActiomForm Bean体现,一般情况下,这些状态是非持久性的。如果需要将这些状态转化为持久性数据存储,Struts本身也提供了Utitle包,可以方便的与数据库操作
2.2.3 从控制器角度(Controller)
在Struts framework中, Controller主要是ActionServlet,但是对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成(也许这几个组件,应该划分到模型中的业务逻辑一块)。其中,Action扮演了真正的业务逻辑的实现者,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。
2.3 Struts的基本组件包
整个struts大约有15包,近200个类所组成,而且数量还在不断的扩展。在此我们不能一一介绍,只能列举几个主要的简要的介绍一下。下表说明了目前struts api中基本的几个组件包,包括action,actions,config,util,taglib,validator。图片(5)则显现了这几个组件包之间的关系。其中action是整个struts framework的核心
org.apache.struts.action
基本上,控制整个struts framework的运行的核心类、组件都在这个包中,比如我们上面提到的控制器ActionServlet。已经Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 类。增加了动态扩展生成FormBean功能
org.apache.struts.actions
这个包是主要作用是提供客户的http请求和业务逻辑处理之间的特定适配器转换功能,而1.0版本中的部分动态增删FromBean的类,也在struts1.1中被Action包的DynaActionForm组件所取代
org.apache.struts.config
提供对配置文件struts-config.xml元素的映射。这也是sturts1.1中新增的功能
org.apache.struts.util
Strtuts为了更好支持web application的应用,体统了一个些常用服务的支持,比如Connection Pool和Message Source。详细信息请参考
http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html
org.apache.struts.taglib
这不是一个包,而是是一个客户标签类的集合。下面包括Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags这几个用于构建用户界面的标签类。
org.apache.struts.validator
Struts1.1 framework中增加了validator framework,用于动态的配置from表单的验证。详细信息请参阅 http://home.earthlink.net/~dwinterfeldt/
三、 Struts framework的工作原理和组件
对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServlet。Action Classes,Action Mapping(此处包括ActionForward),ActionFrom Bean。
3.1 Struts ActionServlet
ActionServlet继承自javax.servlet.http.HttpServlet类,其在Struts framework中扮演的角色失控制器,参看上面的“Struts体系图”。控制器ActionServlet主要负责将HTTP的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。(在Struts1.1中新增了org.apache.struts.action.Action.RequestProcessor类,将处理请求的功能从控制器功能中分离。
按照Servelt的标准,所有得Servlet必须在web配置文件(web.xml)声明。同样,ActoinServlet必须在Web Application配置文件(web.xml)中描述,有关配置信息,后面将会介绍。
当用户向服务器端提交请求的时候,实际上信息是首先发送到控制器ActionServlet,一旦控制器获得了请求,其就会将请求信息传交给一些辅助类(help classes)处理。这些辅助类知道如何去处理与请求信息所对应的业务操作。在Struts中,这个辅助类就是org.apache.struts.action.Action。通常开发者需要自己继承Aciton类,从而实现自己的Action实例。
3.2 Struts Action Classes
一个Action 类的角色,就像客户请求动作和业务逻辑处理之间的一个适配器(Adaptor),其功能就是将请求与业务逻辑分开。这样的分离,使得客户请求和Action类之间可以有多个点对点的映射。而且Action类通常还提供了其它的辅助功能,比如:认证(authorization)、日志(logging)和数据验证(validation)。
Action最为常用的是execute()方法。(注意,以前的perform方法在struts1.1中已经不再支持),还有一个execute()方法,请参考apidoc,在此不在说明。
当Controller收到客户的请求的时候,在将请求转移到一个Action实例时,如果这个实例不存在,控制器会首先创建,然后会调用这个Action实例的execute()方法。Struts Framework为应用系统中的每一个Action类只创建一个实例。因为所有的用户都使用这一个实例,所以你必须确定你的Action 类运行在一个多线程的环境中。下图显示了一个execute()方法如何被访问:
图片(6): Action实例的execute()方法
注意,客户自己继承的Action子类,必须重写execute()方法,因为Action类在默认情况下是返回null的。
3.3 Struts Action Mapping
上面讲到了一个客户请求是如何被控制器转发和处理的,但是,控制器如何知道什么样的信息转发到什么样的Action类呢?这就需要一些与动作和请求信息相对应的映射配置说明。在struts 中,这些配置映射信息是存储在特定的XML文件(比如struts-config.xml)。
这些配置信息在系统启动的时候被读入内存,供struts framework在运行期间使用。在内存中,每一个<action>元素都与org.apache.struts.action.ActionMapping类的一个实例对应。下表就显示了一个登陆的配置映射。
上面的配置表示:当可以通过/logonAction.do(此处假设配置的控制器映射为*.do)提交请求信息的时候,控制器将信息委托com.test.LogonAction处理。调用LogonAction实例的execute()方法。同时将Mapping实例和所对应的LogonForm Bean信息传入。其中name=LogonForm,使用的form-bean元素所声明的ActionForm Bean。有关form-bean的申明如下显示。
元素<forward>则表示了当Action实例的execute()方法运行完毕或,控制器根据Mapping可将响应信息转到适当的地方。如上面现实,如果客户登陆成功,则调用welcome forward,将成功信息返回到/welcome.jsp页面。在你的execute()方法的结尾可以使用下面的实例代码而返回welcome forward。当然你的welcome forward必须在action元素属性中定义,正如上面所声明的那样。
在此稍稍说一下有关global-forwards的概念。其在配置文件中描述了整个应用系统可以使用的ActionForward,而不是仅仅是一个特定的Action。
3.4 Struts ActionForm Bean
在上面讲解ActionServlet,Action Classes和Action Mapping的时候,我们都提到了ActionForm Bean的概念。一个应用系统的消息转移(或者说状态转移)的非持久性数据存储,是由ActionForm Bean的负责保持的。
ActionForm的主要功能就是为Action的操作提供与客户表单相映射的数据(如果在客户指定的情况下,还包括对数据进行校验)。Action负责对系统数据状态的保持,而Action则负责根据业务逻辑的需要,对数据状态进行修改,在改变系统状态后,ActionForm则自动的回写新的数据状态并保持。
注意:在struts1.1中,ActionForm的校验功能,逐渐被剥离出来(当然依然可以使用)。使用了validator framework对整个应用系统的表单数据验证进行统一管理。相信信息请参考:http://home.earthlink.net/~dwinterfeldt
在ActionForm的使用中,Struts提倡使用到值对象(Value Object)。这样将客户或开发人员,对数据状态与对象状态能够更加清晰的理解和使用。
对于每一个客户请求,Struts framework在处理ActionForm的时候,一般需要经历如下几个步骤:
(1)检查Action的映射,确定Action中已经配置了对ActionForm的映射
(2)根据name属性,查找form bean的配置信息
(3)检查Action的formbean的使用范围,确定在此范围下,是否已经有此form bean的实例。
(4)假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,那么就重用。
(5)否则,就重新构建一个form bean的实例
(6)form bean的reset()方法备调用
(7)调用对应的setter方法,对状态属性赋值
(8)如果validatede的属性北设置为true,那么就调用form bean的validate()方法。
注意:直接从ActionFrom类继承的reset()和validate()方法,并不能实现什么处理功能,所以有必要自己重新覆盖。
如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行。
有必要提一下有关org.apache.struts.action.DynaActionForm。这是struts1.1新增的特性。其继承自ActionForm,在struts早先版本中,我们必须人为的构造特定的ActionFrom子类,但是利用DynaActionForm,可以依据属性集而动态的创建from bean。有关其详细资料,请参考•••
四、Struts的其他组件
Struts framework本身提供了很多可扩展的组件或sub framework,方便的开发人员在其构架上构建web层的应用系统。比如upload,collections ,logging等等。让我们来看看两个比较重要的组件:validationg framework和struts taglib。有关其他组件请参考Struts用户手册(http://jakarta.apache.org/struts/userGuide)。
在stuts1.0中有些很不错的概念和组件,比如benaUtils,Collections等等,后来被Jakarta Commons项目组吸收而独立处struts framework。但是struts依然需要依赖这些组件才能正常的工作。
4.1 Validation Framework for Struts
在struts1.1中,新增了validation framework。增加了对form数据提交的验证。将原本需要在ActionFrom Bean的validate()进行的验证通过配置文件的描述进行验证。
有关其详细信息,请参考http://home.earthlink.net/~dwinterfeldt 。个人建议对于小型应用系统可以采用这种配置方式,但是对于应用系统中有大量web层表单应用的系统,并且业务需求变动比较大的,使用validation framework 可能会加重开发难度、系统维护难度。可以借鉴validation framework的Javascript Validator Tag。
4.2 Struts TagLib
struts提供了一组可扩展的自定义标签库(TagLib),可以简化创建用户界面的过程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 这几个Taglib。有关Struts Taglib的结构和使用,可以参考前面有关Cutomer Tag Lib的介绍,有关起详细资料,请参考
4.3 BeanUtils
这个组件的全称是Bean Introspection Utilites。是属于Jakarta Commons项目组的。主要是帮助构建javabean的属性操作的(getter,setter),已经提供一种动态定义和访问bean的属性。有关详细信息,请参考。
http://jakarta.apache.org/commons/beanutils.html
如果各位对这方面有很兴趣,可以参考一些有关java反射(Reflectio)方面的资料。
4.4 Collections
这个组件主要是提供了一些集合或列表对象,在原有的java collections framework的基础上进行了扩展。详细资料请参考:
http://jakarta.apache.org/commons/collections.html 以及
http://cvs.apache.org/viewcvs/~checkout~/jakarta-commons/collections/STATUS.html?rev=1.13
4.5 Digester
这个组件翻译成中文的意思是“汇编”。其主要功能是根据xml配置文件,初始化系统的一些java类对象。Digester帮助你指定XML与java对象之间映射模型,而且允许客户话定制映射规则(rules)。详细资料请参考
http://jakarta.apache.org/commons/digester.html
4.6 其他相关组件
由于篇幅问题,还有一些组件就不一一介绍了,包括Database Connection Pool,Upload,Logging,Pool,Services。基在struts用户手册都有详细介绍,请参考。
五、 Struts配置文件简介(Deployment Description)
struts framework根据配置文件指定(更确切的说,是控制器),才使得ServletAction,ActionMapping,Action , ActionForm这几个不同层次的组件相互交互,协调的工作。前面也提到了,这些配置文件是在系统启动的时候,读入导内存中,供控制器使用的。
Struts framework主要包括三部分的配置描述,一个是指定有关Struts Controller及其相关的的配置描述(Initialization Parameters),一个时对struts tag lib的描述,一个是struts组件(ActionMapping,Action,ActionForm)之间相互映射协调的关系
5.1有关Struts Controller及其相关的的配置描述
因为Struts Controller的主要类ActionServlet是继承自HttpServlet,所以必须像配置一个Servlet那样配置ActionServlet类及其访问映射。详细信息请参考:
http://jakarta.apache.org/struts/userGuide/building_controller.html#dd_config
5.2 有关struts tag lib的配置描述
如果你的web application打算使用Struts的taglib,那么你有必要在web.xml中对struts taglib进行配置描述。有关详细的描述和说明请参考
http://jakarta.apache.org/struts/userGuide/building_controller.html#dd_config_taglib
5.3 有关Struts Action Mapping的配置描述
Struts本身有一个配置文件,通常情况为struts-config.xml。有关其DTD文档的描述,请参考http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd
(或struts-config_1_0.dtd)
一般struts-config(version1.1)包含了如下几个部分:
(1)form-bean
(2)global-forwards
(3)action-mappings
(4)data-sources
有关详细信息请参阅
http://jakarta.apache.org/struts/userGuide/building_controller.html#config
有必要提一下的是,在struts1.1中,提出了对Multiple Application Support。在struts的早先版本中,只有一个struts配置文件,一般叫struts-config.xml。但是,对于越来越复杂的应用系统的发展,只有一个地方存放这个一个文件,对大型项目来说,使用和修改这个配置文件,使其成为了一个应用的瓶颈问题。在struts1.1中,你可以定义多了配置文件协同工作。
总结
希望通过以上的对Struts Framework的讲解,读者可以对Struts的整体结构有个比较清晰的认识,对其如何处理客户请求,如何进行业务逻辑的处理和自动流转能够有个概念上的认识。
Resource
① Struts的官方网站:
http://jakarta.apache.org/struts/
② Struts用户手册(User Guide)
http://jakarta.apache.org/struts/userGuide
③ ARTICLE --- Framework save the day
http://www.javaworld.com/jw-09-2000/jw-0929-ejbframe.html
④ ARTICLE --- Building a Java servlet framework using reflection
http://www.javaworld.com/javaworld/jw-11-1999/jw-11-servlet.html
⑤ Validation Framework
http://home.earthlink.net/~dwinterfeldt/
http://cvs.apache.org/viewcvs/jakarta-commons/validator/
⑥ ARTICLE --- Struts1.1,Should I upgrade?
http://www.theserverside.com/resources/article.jsp?l=Struts1_1
(Struts Framework Architecture)
胡长城(银狐999)
关键字
Struts,Framework,Architecture,Componennt,MVC
预备知识
在开始学习Struts以前,以下的知识点,需要有所了解: 模型-视图-控制的软件构架模式,JSP/Servlet的web层应用,J2EE体系结构。如果对客户标签类(Customer TagLib)有所了解也许更容易理解Struts本身的TagLib。
概述
本文主要从概念上讲解什么是struts framework,它的框架结构,组件结构,以及简单的配置讲解。对于其应用请参考后面的“struts安装及应用”和“struts实用案例分析”。
文章的包括了如下四大部分:
一、 Framework的概念和体系简介 (Framework Conception and Architecture)
二、 Struts的概念和体系结构(Struts Conception and Architecture)
三、 Struts的工作原理和组件(Struts Componennts)
四、 Struts配置文件简介(Struts Deployment Description)
一、 Framework概念
一直以来我们都说struts是一个web framework。那么让我么先来看看什么是Framework。(我想用“框架”一词来翻译framework,可是后来越来越发现不太理想和完备,所以就直接用Framework一词)
Framework概念并不是很新了,伴随着软件开发的发展,在多层的软件开发项目中,可重用、易扩展的,而且是经过良好测试的软件组件,越来越为人们所青睐。这意味着人们可以将充裕的时间用来分析、构建业务逻辑的应用上,而非繁杂的代码工程。于是人们将相同类型问题的解决途径进行抽象,抽取成一个应用框架。这也就是我们所说的Framework。
Framework的体系提供了一套明确机制,从而让开发人员很容易的扩展和控制整个framework开发上的结构。 通常,framework的结构中都有一个“命令和控制”组件("command and control" component)——Framework Factory and Manager。
图片(2):Framework体系
通过基于请求响应(Request-Response)模式的应用framework,基本上有如下几个表现逻辑结构组成。
(1)控制器(Controller)——控制整个framework中各个组件的协调工作。
(2)业务逻辑层(Business Logic)——这是framework所希望解决问题的关键。当然对framwork本身来说,这里仅仅只是概念和几个提够服务的基础组件,真正的实现与客户的业务逻辑接轨,还需要开发人员在framework上再次扩展。
(3)数据逻辑层(Data Logic)——绝大应用系统都需要涉及到数据交互,这一层次主要包括了数据逻辑和数据访问接口。对于数据逻辑来说,如果你了解数据建模(Data Modeling)可能就很容易理解。
下面就进入我们的正题——Struts的结构
二、 Struts的概念和体系结构
Struts有一组相互协作的类(组件)、Serlvet以及jsp tag lib组成。基于struts构架的web应用程序基本上符合JSP Model2的设计标准,可以说是MVC设计模式的一种变化类型。根据上面对framework的描述,我们很容易理解为什么说Struts是一个web framwork,而不仅仅是一些标记库的组合。但 Struts 也包含了丰富的标记库和独立于该框架工作的实用程序类。
Struts有其自己的控制器(Controller),同时整合了其他的一些技术去实现模型层(Model)和视图层(View)。在模型层,Struts可以很容易的与数据访问技术相结合,包括EJB,JDBC和Object Relation Bridge。在视图层,Struts能够与JSP, Velocity Templates,XSL等等这些表示层组件想结合。
2.1 Struts的与Web App的关系
既然struts叫做web framework,那么其肯定主要基于web层的应用系统开发。按照J2EE Architecture的标准,struts应当和jsp/servlet一样,存在于web container一层。如图片(3)所显示
图片(3): Struts与WebApp的关系
2.2 Struts的体系结构
我们说struts framework是MVC 模式的体现,下面我们就从分别从模型、视图、控制来看看struts的体系结构(Architecture)。图片(4)显示了struts framework的体系结构响应客户请求时候,各个部分工作的原理。
图片(4):Struts体系结构
2.2.1从视图角度(View)
主要由JSP建立,struts自身包含了一组可扩展的自定义标签库(TagLib),可以简化创建用户界面的过程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 这几个Taglib。有关它们的详细资料请参考struts用户手册
2.2.2从模型角度(Model)
模型主要是表示一个系统的状态(有时候,改变系统状态的业务逻辑操作也也划分到模型中)。在Struts中,系统的状态主要有ActiomForm Bean体现,一般情况下,这些状态是非持久性的。如果需要将这些状态转化为持久性数据存储,Struts本身也提供了Utitle包,可以方便的与数据库操作
2.2.3 从控制器角度(Controller)
在Struts framework中, Controller主要是ActionServlet,但是对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成(也许这几个组件,应该划分到模型中的业务逻辑一块)。其中,Action扮演了真正的业务逻辑的实现者,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。
2.3 Struts的基本组件包
整个struts大约有15包,近200个类所组成,而且数量还在不断的扩展。在此我们不能一一介绍,只能列举几个主要的简要的介绍一下。下表说明了目前struts api中基本的几个组件包,包括action,actions,config,util,taglib,validator。图片(5)则显现了这几个组件包之间的关系。其中action是整个struts framework的核心
org.apache.struts.action
基本上,控制整个struts framework的运行的核心类、组件都在这个包中,比如我们上面提到的控制器ActionServlet。已经Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 类。增加了动态扩展生成FormBean功能
org.apache.struts.actions
这个包是主要作用是提供客户的http请求和业务逻辑处理之间的特定适配器转换功能,而1.0版本中的部分动态增删FromBean的类,也在struts1.1中被Action包的DynaActionForm组件所取代
org.apache.struts.config
提供对配置文件struts-config.xml元素的映射。这也是sturts1.1中新增的功能
org.apache.struts.util
Strtuts为了更好支持web application的应用,体统了一个些常用服务的支持,比如Connection Pool和Message Source。详细信息请参考
http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html
org.apache.struts.taglib
这不是一个包,而是是一个客户标签类的集合。下面包括Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags这几个用于构建用户界面的标签类。
org.apache.struts.validator
Struts1.1 framework中增加了validator framework,用于动态的配置from表单的验证。详细信息请参阅 http://home.earthlink.net/~dwinterfeldt/
三、 Struts framework的工作原理和组件
对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServlet。Action Classes,Action Mapping(此处包括ActionForward),ActionFrom Bean。
3.1 Struts ActionServlet
ActionServlet继承自javax.servlet.http.HttpServlet类,其在Struts framework中扮演的角色失控制器,参看上面的“Struts体系图”。控制器ActionServlet主要负责将HTTP的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。(在Struts1.1中新增了org.apache.struts.action.Action.RequestProcessor类,将处理请求的功能从控制器功能中分离。
按照Servelt的标准,所有得Servlet必须在web配置文件(web.xml)声明。同样,ActoinServlet必须在Web Application配置文件(web.xml)中描述,有关配置信息,后面将会介绍。
当用户向服务器端提交请求的时候,实际上信息是首先发送到控制器ActionServlet,一旦控制器获得了请求,其就会将请求信息传交给一些辅助类(help classes)处理。这些辅助类知道如何去处理与请求信息所对应的业务操作。在Struts中,这个辅助类就是org.apache.struts.action.Action。通常开发者需要自己继承Aciton类,从而实现自己的Action实例。
3.2 Struts Action Classes
一个Action 类的角色,就像客户请求动作和业务逻辑处理之间的一个适配器(Adaptor),其功能就是将请求与业务逻辑分开。这样的分离,使得客户请求和Action类之间可以有多个点对点的映射。而且Action类通常还提供了其它的辅助功能,比如:认证(authorization)、日志(logging)和数据验证(validation)。
Action最为常用的是execute()方法。(注意,以前的perform方法在struts1.1中已经不再支持),还有一个execute()方法,请参考apidoc,在此不在说明。
当Controller收到客户的请求的时候,在将请求转移到一个Action实例时,如果这个实例不存在,控制器会首先创建,然后会调用这个Action实例的execute()方法。Struts Framework为应用系统中的每一个Action类只创建一个实例。因为所有的用户都使用这一个实例,所以你必须确定你的Action 类运行在一个多线程的环境中。下图显示了一个execute()方法如何被访问:
图片(6): Action实例的execute()方法
注意,客户自己继承的Action子类,必须重写execute()方法,因为Action类在默认情况下是返回null的。
3.3 Struts Action Mapping
上面讲到了一个客户请求是如何被控制器转发和处理的,但是,控制器如何知道什么样的信息转发到什么样的Action类呢?这就需要一些与动作和请求信息相对应的映射配置说明。在struts 中,这些配置映射信息是存储在特定的XML文件(比如struts-config.xml)。
这些配置信息在系统启动的时候被读入内存,供struts framework在运行期间使用。在内存中,每一个<action>元素都与org.apache.struts.action.ActionMapping类的一个实例对应。下表就显示了一个登陆的配置映射。
上面的配置表示:当可以通过/logonAction.do(此处假设配置的控制器映射为*.do)提交请求信息的时候,控制器将信息委托com.test.LogonAction处理。调用LogonAction实例的execute()方法。同时将Mapping实例和所对应的LogonForm Bean信息传入。其中name=LogonForm,使用的form-bean元素所声明的ActionForm Bean。有关form-bean的申明如下显示。
元素<forward>则表示了当Action实例的execute()方法运行完毕或,控制器根据Mapping可将响应信息转到适当的地方。如上面现实,如果客户登陆成功,则调用welcome forward,将成功信息返回到/welcome.jsp页面。在你的execute()方法的结尾可以使用下面的实例代码而返回welcome forward。当然你的welcome forward必须在action元素属性中定义,正如上面所声明的那样。
在此稍稍说一下有关global-forwards的概念。其在配置文件中描述了整个应用系统可以使用的ActionForward,而不是仅仅是一个特定的Action。
3.4 Struts ActionForm Bean
在上面讲解ActionServlet,Action Classes和Action Mapping的时候,我们都提到了ActionForm Bean的概念。一个应用系统的消息转移(或者说状态转移)的非持久性数据存储,是由ActionForm Bean的负责保持的。
ActionForm的主要功能就是为Action的操作提供与客户表单相映射的数据(如果在客户指定的情况下,还包括对数据进行校验)。Action负责对系统数据状态的保持,而Action则负责根据业务逻辑的需要,对数据状态进行修改,在改变系统状态后,ActionForm则自动的回写新的数据状态并保持。
注意:在struts1.1中,ActionForm的校验功能,逐渐被剥离出来(当然依然可以使用)。使用了validator framework对整个应用系统的表单数据验证进行统一管理。相信信息请参考:http://home.earthlink.net/~dwinterfeldt
在ActionForm的使用中,Struts提倡使用到值对象(Value Object)。这样将客户或开发人员,对数据状态与对象状态能够更加清晰的理解和使用。
对于每一个客户请求,Struts framework在处理ActionForm的时候,一般需要经历如下几个步骤:
(1)检查Action的映射,确定Action中已经配置了对ActionForm的映射
(2)根据name属性,查找form bean的配置信息
(3)检查Action的formbean的使用范围,确定在此范围下,是否已经有此form bean的实例。
(4)假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,那么就重用。
(5)否则,就重新构建一个form bean的实例
(6)form bean的reset()方法备调用
(7)调用对应的setter方法,对状态属性赋值
(8)如果validatede的属性北设置为true,那么就调用form bean的validate()方法。
注意:直接从ActionFrom类继承的reset()和validate()方法,并不能实现什么处理功能,所以有必要自己重新覆盖。
如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行。
有必要提一下有关org.apache.struts.action.DynaActionForm。这是struts1.1新增的特性。其继承自ActionForm,在struts早先版本中,我们必须人为的构造特定的ActionFrom子类,但是利用DynaActionForm,可以依据属性集而动态的创建from bean。有关其详细资料,请参考•••
四、Struts的其他组件
Struts framework本身提供了很多可扩展的组件或sub framework,方便的开发人员在其构架上构建web层的应用系统。比如upload,collections ,logging等等。让我们来看看两个比较重要的组件:validationg framework和struts taglib。有关其他组件请参考Struts用户手册(http://jakarta.apache.org/struts/userGuide)。
在stuts1.0中有些很不错的概念和组件,比如benaUtils,Collections等等,后来被Jakarta Commons项目组吸收而独立处struts framework。但是struts依然需要依赖这些组件才能正常的工作。
4.1 Validation Framework for Struts
在struts1.1中,新增了validation framework。增加了对form数据提交的验证。将原本需要在ActionFrom Bean的validate()进行的验证通过配置文件的描述进行验证。
有关其详细信息,请参考http://home.earthlink.net/~dwinterfeldt 。个人建议对于小型应用系统可以采用这种配置方式,但是对于应用系统中有大量web层表单应用的系统,并且业务需求变动比较大的,使用validation framework 可能会加重开发难度、系统维护难度。可以借鉴validation framework的Javascript Validator Tag。
4.2 Struts TagLib
struts提供了一组可扩展的自定义标签库(TagLib),可以简化创建用户界面的过程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 这几个Taglib。有关Struts Taglib的结构和使用,可以参考前面有关Cutomer Tag Lib的介绍,有关起详细资料,请参考
4.3 BeanUtils
这个组件的全称是Bean Introspection Utilites。是属于Jakarta Commons项目组的。主要是帮助构建javabean的属性操作的(getter,setter),已经提供一种动态定义和访问bean的属性。有关详细信息,请参考。
http://jakarta.apache.org/commons/beanutils.html
如果各位对这方面有很兴趣,可以参考一些有关java反射(Reflectio)方面的资料。
4.4 Collections
这个组件主要是提供了一些集合或列表对象,在原有的java collections framework的基础上进行了扩展。详细资料请参考:
http://jakarta.apache.org/commons/collections.html 以及
http://cvs.apache.org/viewcvs/~checkout~/jakarta-commons/collections/STATUS.html?rev=1.13
4.5 Digester
这个组件翻译成中文的意思是“汇编”。其主要功能是根据xml配置文件,初始化系统的一些java类对象。Digester帮助你指定XML与java对象之间映射模型,而且允许客户话定制映射规则(rules)。详细资料请参考
http://jakarta.apache.org/commons/digester.html
4.6 其他相关组件
由于篇幅问题,还有一些组件就不一一介绍了,包括Database Connection Pool,Upload,Logging,Pool,Services。基在struts用户手册都有详细介绍,请参考。
五、 Struts配置文件简介(Deployment Description)
struts framework根据配置文件指定(更确切的说,是控制器),才使得ServletAction,ActionMapping,Action , ActionForm这几个不同层次的组件相互交互,协调的工作。前面也提到了,这些配置文件是在系统启动的时候,读入导内存中,供控制器使用的。
Struts framework主要包括三部分的配置描述,一个是指定有关Struts Controller及其相关的的配置描述(Initialization Parameters),一个时对struts tag lib的描述,一个是struts组件(ActionMapping,Action,ActionForm)之间相互映射协调的关系
5.1有关Struts Controller及其相关的的配置描述
因为Struts Controller的主要类ActionServlet是继承自HttpServlet,所以必须像配置一个Servlet那样配置ActionServlet类及其访问映射。详细信息请参考:
http://jakarta.apache.org/struts/userGuide/building_controller.html#dd_config
5.2 有关struts tag lib的配置描述
如果你的web application打算使用Struts的taglib,那么你有必要在web.xml中对struts taglib进行配置描述。有关详细的描述和说明请参考
http://jakarta.apache.org/struts/userGuide/building_controller.html#dd_config_taglib
5.3 有关Struts Action Mapping的配置描述
Struts本身有一个配置文件,通常情况为struts-config.xml。有关其DTD文档的描述,请参考http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd
(或struts-config_1_0.dtd)
一般struts-config(version1.1)包含了如下几个部分:
(1)form-bean
(2)global-forwards
(3)action-mappings
(4)data-sources
有关详细信息请参阅
http://jakarta.apache.org/struts/userGuide/building_controller.html#config
有必要提一下的是,在struts1.1中,提出了对Multiple Application Support。在struts的早先版本中,只有一个struts配置文件,一般叫struts-config.xml。但是,对于越来越复杂的应用系统的发展,只有一个地方存放这个一个文件,对大型项目来说,使用和修改这个配置文件,使其成为了一个应用的瓶颈问题。在struts1.1中,你可以定义多了配置文件协同工作。
总结
希望通过以上的对Struts Framework的讲解,读者可以对Struts的整体结构有个比较清晰的认识,对其如何处理客户请求,如何进行业务逻辑的处理和自动流转能够有个概念上的认识。
Resource
① Struts的官方网站:
http://jakarta.apache.org/struts/
② Struts用户手册(User Guide)
http://jakarta.apache.org/struts/userGuide
③ ARTICLE --- Framework save the day
http://www.javaworld.com/jw-09-2000/jw-0929-ejbframe.html
④ ARTICLE --- Building a Java servlet framework using reflection
http://www.javaworld.com/javaworld/jw-11-1999/jw-11-servlet.html
⑤ Validation Framework
http://home.earthlink.net/~dwinterfeldt/
http://cvs.apache.org/viewcvs/jakarta-commons/validator/
⑥ ARTICLE --- Struts1.1,Should I upgrade?
http://www.theserverside.com/resources/article.jsp?l=Struts1_1
- Struts体系结构.rar (769.5 KB)
- 下载次数: 1
相关推荐
struts体系结构与工作原理 想学struts吗?这个文档你可以参考一下。
Struts体系结构下的工作流模型和应用研究 Struts体系结构下的工作流模型和应用研究
浅析Struts 体系结构与工作原理.doc
华为招聘Java面试题:概念题:1. 描述Struts体系结构?对应各个部分的开发工作主要包括哪些?2. JSP有哪些内置对象和动作?它们的作用分别是什么?……
Struts2体系结构图例详解 MVC框架
Struts的体系结构.doc
书中还介绍了如何同时使用JSP标签和Velocity模板,并仔细介绍了Struts体系结构以及Struts控制流,同时也说明了如何扩展Struts框架结构。 书中还明确指出了Struts 1.0和1.1版本间的区别,同时还通过实例说明了Struts ...
Struts的体系结构与工作原理,学习struts
1.2 Struts体系结构 4 1.3 Struts框架中的组件 5 1.3.1 Struts配置文件 5 1.3.2 ActionServlet类 8 1.3.3 ActionMapping类 10 1.3.4 Action类 10 1.3.5 ActionForm类 11 1.3.6 ActionForward类 12 1.3.7 错误处理 12...
1.2. Struts 体系结构1 1.2.1. 模型.2 1.2.2. 视窗.2 1.2.3. 控制器.2 1.3. Struts 框架中的组件.3 1.3.1. Struts配置文件.3 1.4. ActionServlet类6 1.4.1. ActionServlet配置6 1.4.2. ActionServlet方法7 1.5. ...
Struts的体系结构[归类].pdf
2. struts体系结构(模型-视窗-控制器)…………………………………………………3 3. struts框架的组件………………………………………………………………………4 3.1 struts配置文件…………………………………………...
文章的包括了如下七大部分: Framework的概念和体系简介 Struts的概念和体系结构 Struts的工作原理和组件 Struts配置文件简介 Struts高级特性 Struts标记库 一个简单的示例
§1.2.2 Struts体系结构 4 §1.3 Hibernate框架 6 §1.3.1 ORM(对象关系映射) 6 §1.3.2 Hibernate简介 6 §1.3.3 Hibernate体系结构 6 §1.4 Hibernate框架 8 §1.4.1 Spring简介 8 §1.4.2 Spring 核心技术 8 §...
Struts的体系结构, Struts framework的工作原理和组件 Struts配置文件简介 Struts高级特性(Struts Advanced Feature)
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为...
其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为...
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为...
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为...