欢迎光临
我们一直在努力

Struts的体系结构-JSP教程,资料/其它

建站超值云服务器,限时71元/月

预备知识
在开始学习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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Struts的体系结构-JSP教程,资料/其它
分享到: 更多 (0)