struts的教程

概述

本文主要讲解什么是Struts Framework,它的框架结构,组件结构,以及简单的配置讲解。

文章的包括了如下七大部分:

Framework的概念和体系简介

Struts的概念和体系结构

Struts的工作原理和组件

Struts配置文件简介

Struts高级特性

Struts标记库

一个简单的示例

Framework概念

一直以来我们都说Struts是一个Web Framework。那么让我么先来看看什么是Framework

Framework概念并不是很新了,伴随着软件开发的发展,在多层的软件开发项目中,可重用、易扩展的,而且是经过良好测试的软件组件,越来越为人们所青睐。这意味着人们可以将充裕的时间用来分析、构建业务逻辑的应用上,而非繁杂的代码工程。于是人们将相同类型问题的解决途径进行抽象,抽取成一个应用框架。这也就是我们所说的Framework

Framework的体系提供了一套明确机制,从而让开发人员很容易的扩展和控制整个Framework开发上的结构。 通常,Framework的结构中都有一个“命令和控制”组件("command and control" component)——Framework Factory and Manager

Framework体系

通过基于请求响应(Request-Response)模式的应用Framework,基本上有如下几个表现逻辑结构组成。

控制器Controller)——控制整个Framework中各个组件的协调工作。

业务逻辑层Business Logic)——对Framwork本身来说,这里仅仅只是概念和几个提够服务的基础组件,真正的实现与客户的业务逻辑接轨,还需要开发人员在Framework上再次扩展。

数据逻辑层Data Logic)——绝大应用系统都需要涉及到数据交互,这一层次主要包括了数据逻辑和数据访问接口。对于数据逻辑来说,如果你了解数据建模(Data Modeling)可能就很容易理解。

Struts的概念和体系结构

Struts有一组相互协作的类、Serlvet以及Jsp TagLib组成。基于Struts构架的web应用程序基本上符合JSP Model2的设计标准,可以说是MVC设计模式的一种变化类型。根据上面对framework的描述,我们很容易理解为什么说Struts是一个web framwork,而不仅仅是一些标记库的组合。但 Struts 也包含了丰富的标记库和独立于该框架工作的实用程序类。

Struts有其自己的控制器(Controller),同时整合了其他的一些技术去实现模型层(Model)和视图层(View)。在模型层,Struts可以很容易的与数据访问技术相结合,包括EJB,JDBCObject Relation Bridge。在视图层,Struts能够与JSP, Velocity Templates,XSL等等这些表示层组件想结合。

Struts的与Web App的关系


既然struts叫做web framework,那么其肯定主要基于web层的应用系统开发。按照J2EE Architecture的标准,struts应当和jsp/servlet一样,存在于web container一层。

StrutsWebApp的关系

Struts的体系结构

我们说struts frameworkMVC 模式的体现,下面我们就从分别从模型、视图、控制来看看struts的体系结构(Architecture)。下图显示了struts framework的体系结构响应客户请求时候,各个部分工作的原理。


Struts体系结构

从视图角度(View

首先,Struts提供了Javaorg. apache.struts.action.ActionFormJava开发者将该类细分来创建表单bean。在运行时,该bean有两种用法:

JSP准备相关的HTML,表单以进行显示时,JSP将访问该

bean(它保存要放入表单中的值)。那些值是从业务逻辑或者是从先前的用户输入来提供的。

当从Web浏览器中返回用户输入时,该bean将验证并保存该输入以供业务逻辑或(如果验证失败的话)后续重新显示使用。

其次,Struts提供了许多定制JSP标记,它们的使用简单,但是它们在隐藏信息方面功能强大。例如,除了bean名称和给定bean中每个段的名称之外,页面设计者不需要知道有关表单bean的更多信息。

从模型角度(Model

Struts虽然不直接有助于模型开发。Struts中,系统模型的状态主要由ActiomForm Bean和值对象体现。

从控制器角度(Controller

Struts framework中, Controller主要是ActionServlet,但是对于业务逻辑的操作则主要由ActionActionMappingActionForward这几个组件协调完成(也许这几个组件,应该划分到模型中的业务逻辑一块)。其中,Action扮演了真正的控制逻辑的实现者,而ActionMappingActionForward则指定了不同业务逻辑或流程的运行方向。

Struts的基本组件包

整个struts大约有15包,近200个类所组成,而且数量还在不断的扩展。在此我们不能一一介绍,只能列举几个主要的简要的介绍一下。下表说明了目前struts api中基本的几个组件包,包括action,actions,config,util,taglib,validator。下图则显现了这几个组件包之间的关系。其中action是整个struts framework的核心

org.apache.struts.action

基本上,控制整个struts framework的运行的核心类、组件都在这个包中,比如我们上面提到的控制器ActionServlet。已经Action,ActionForm,ActionMapping等等。struts1.11.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 PoolMessage Source。详细信息请参考

http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html

org.apache.struts.taglib

这不是一个包,而是是一个客户标签类的集合。下面包括Bean TagsHTML TagsLogic TagsNested TagsTemplate Tags这几个用于构建用户界面的标签类。

org.apache.struts.validator

Struts1.1 framework中增加了validator framework,用于动态的配置from表单的验证。详细信息请参阅 http://home.earthlink.net/~dwinterfeldt/

Struts的基本组件关系图

Struts framework的工作原理和组件

对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServletAction ClassesAction Mapping(此处包括ActionForward),ActionFrom Bean

Struts ActionServlet控制器对象

ActionServlet继承自javax.servlet.http.HttpServlet类,其在Struts framework中扮演的角色是中心控制器。它提供一个中心位置来处理全部的终端请求。控制器ActionServlet主要负责将HTTP的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。

按照Servelt的标准,所有得Servlet必须在web配置文件(web.xml)声明。同样,ActoinServlet必须在Web Application配置文件(web.xml)中描述,有关配置信息如下。

action

org.apache.struts.action.ActionServlet

全部的请求URI*.do的模式存在并映射到这个servlet,其配置如下:

action

*.do

一个该模式的请求URI符合如下格式:

http://www.my_site_name.com/mycontext/actionName.do

中心控制器为所有的表示层请求提供了一个集中的访问点。这个控制器提供的抽象概念减轻了开发者建立公共应用系统服务的困难,如管理视图、会话及表单数据。它也提供一个通用机制如错误及异常处理,导航,国际化,数据验证,数据转换等。

当用户向服务器端提交请求的时候,实际上信息是首先发送到控制器ActionServlet,一旦控制器获得了请求,其就会将请求信息传交给一些辅助类(help classes)处理。这些辅助类知道如何去处理与请求信息所对应的业务操作。在Struts中,这个辅助类就是org.apache.struts.action.Action。通常开发者需要自己继承Aciton类,从而实现自己的Action实例。

Struts Action Classes

ActionServlet全部提交的请求都被控制器委托到RequestProcessor对象RequestProcessor使用struts-config.xml文件检查请求URI找到动作Action标示符。

一个Action 类的角色,就像客户请求动作和业务逻辑处理之间的一个适配器(Adaptor),其功能就是将请求与业务逻辑分开。这样的分离,使得客户请求和Action类之间可以有多个点对点的映射。而且Action类通常还提供了其它的辅助功能,比如:认证(authorization)、日志(logging)和数据验证(validation)。

public ActionForward execute(ActionMapping mapping, ActionForm form, javax.servlet.ServletRequest request, javax.servlet.ServletResponse response) throws java.io.IOException,javax.servlet.ServletException
Action最为常用的是execute()方法。(注意,以前的perform方法在struts1.1中已经不再支持),还有一个execute()方法,请参考apidoc,在此不在说明。

Controller收到客户的请求的时候,在将请求转移到一个Action实例时,如果这个实例不存在,控制器会首先创建,然后会调用这个Action实例的execute()方法。Struts Framework为应用系统中的每一个Action类只创建一个实例。因为所有的用户都使用这一个实例,所以你必须确定你的Action 类运行在一个多线程的环境中。下图显示了一个execute()方法如何被访问:

Action实例的execute()方法

注意,客户自己继承的Action子类,必须重写execute()方法,因为Action类在默认情况下是返回null的。

Struts Action Mapping

上面讲到了一个客户请求是如何被控制器转发和处理的,但是,控制器如何知道什么样的信息转发到什么样的Action类呢?这就需要一些与动作和请求信息相对应的映射配置说明。在struts 中,这些配置映射信息是存储在特定的XML文件(比如struts-config.xml)。

这些配置信息在系统启动的时候被读入内存,供struts framework在运行期间使用。在内存中,每一个元素都与org.apache.struts.action.ActionMapping类的一个实例对应。下表就显示了一个登陆的配置映射。


上面的配置表示:当可以通过/logonAction.do(此处假设配置的控制器映射为*.do)提交请求信息的时候,控制器将信息委托com.test.LogonAction处理。调用LogonAction实例的execute()方法。同时将Mapping实例和所对应的LogonForm Bean信息传入。其中name=LogonForm,使用的form-bean元素所声明的ActionForm Bean。有关form-bean的申明如下显示。

使用ActionForward导航

元素则表示了当Action实例的execute()方法运行完毕或,控制器根据Mapping可将响应信息转到适当的地方。如上面现实,如果客户登陆成功,则调用welcome forward,将成功信息返回到/welcome.jsp页面。在你的execute()方法的结尾可以使用下面的实例代码而返回welcome forward。当然你的welcome forward必须在action元素属性中定义,正如上面所声明的那样。

return (mapping.findForward("welcome"));

ActionForward对象是配置对象。这些配置对象拥有独一无二的标识以允许它们按照有意义的名称如“success”,“failure”等来检索。ActionForward对象封装了向前进的URL路径且被请求处理器用于识别目标视图。ActionForward对象建立自元素位于struts-config.xml。下面是一个Struts元素例子,属于元素范围。

type="packageName.EditCustomerProfileAction"

name="customerProfileForm" scope="request">

基于执行请求处理器的execute(…)方法的结果,当传递一个值匹配指定于元素中name属性的值的时候,下一个视图可以在execute(…)方法中被开发者用方便的方法org.apache.struts.action.ActionMapping.findForward(…)选择。ActionMapping.findForward(…)方法既从它的本地范围又从全局范围提供一个ActionForward对象,该对象返回至RequestProcessorRequestDispatcher.forward(…)response.sendRedirect(…)调用下一个视图。当元素有redirect=false属性或redirect属性不存在的时候,RequestDispatcher.forward(…)被执行;当redirect=“true”是,将调用sendRedirect(…)方法。下例举例说明了redirect属性的用法:

如果redirect=true, URL建立如/contextPath/path因为HttpServletResponse.sendRedirect(…)中解释URL采用”/”开头相对于servlet容器根目录。

如果redirect=false, URI建立如/path因为ServletContext.getRequestDisptacher(…)采用虚拟目录相关URL

在此稍稍说一下有关global-forwards的概念。其在配置文件中描述了整个应用系统可以使用的ActionForward,而不是仅仅是一个特定的Action

Struts ActionForm Bean捕获表单数据

在上面讲解ActionServletAction ClassesAction Mapping的时候,我们都提到了ActionForm Bean的概念。一个应用系统的消息转移(或者说状态转移)的非持久性数据存储,是由ActionForm Bean的负责保持的。

ActionForm派生的对象用于保存请求对象的参数,因此它们和用户紧密联系。

一个ActionForm类被RequestProcessor建立。这是发生在已完成向前进到一个URL,该URL为映射到控制器servlet而不是JSP和相应的动作映射指定的表单属性的。在这个情况下,如果没有在指定的活动范围内找到,RequestProcessor将尝试寻找可能导致创建一个新ActionForm对象的表单bean。该ActionForm对象在指定的活动范围内被用元素的name属性找到;

RequestProcessor将随后重新安排表单属性,用请求时参数填充表单,随即调用表单对象的validate(…)方法以履行服务器端用户输入验证。仅当ActionMapping对象中validate属性被设为true时,validate(…)方法被调用;这就是默认的行为。request.getParameterValues(parameterName)被用于得到一个String[]对象,它用来表单填充;验证的结果应该是一个ActionErrors对象,用org.apache.struts.taglib.html.ErrorsTag来显示验证错误给用户。ActionForm也可以被用于为当前用户保存即将被一个视图引用的中间模型状态。

当一个表单对象被RequestProcessor找到,它被传递到请求处理器的execute(…)方法。一个ActionForm对象也可以被请求处理器建立。表单对象建立目的是提供中间模型状态给使用请求范围JSP;这将确保对象不会在有效性过期后仍然存在。默认的,所有的表单都被保存为会话范围。会话中表单对象脱离有效性的存在可能导致浪费内存,同样的,请求处理器必须跟踪保存在会话中的表单对象的生命周期。一个好的捕获表单数据的实践是为横跨多用户交互的相关表单用一个单独的表单bean表单bean也可以在反馈的时候用来储存能够被自定义标签改变的中间模型状态。在视图中标签用法避免结合Java代码,因此要成一个好的任务划分,web生产组主要处理标志,而应用开发组主要处理Java代码。标签因素退出访问中间模型状态的逻辑;当访问嵌套的对象或当通过聚集列举时这个逻辑可能很复杂。

注意:在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)检查Actionformbean的使用范围,确定在此范围下,是否已经有此form bean的实例。

(4)假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,那么就重用。

(5)否则,就重新构建一个form bean的实例

(6)form beanreset()方法备调用

(7)调用对应的setter方法,对状态属性赋值

(8)如果validatede的属性北设置为true,那么就调用form beanvalidate()方法。

9)如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行。

注意:直接从ActionFrom类继承的reset()validate()方法,并不能实现什么处理功能,所以有必要自己重新覆盖。

Struts的其他组件

Struts framework本身提供了很多可扩展的组件或sub framework,方便的开发人员在其构架上构建web层的应用系统。比如upload,collections ,logging等等。让我们来看看两个比较重要的组件:validationg frameworkstruts taglib。有关其他组件请参考Struts用户手册(http://jakarta.apache.org/struts/userGuide)。

Validation Framework for Struts

struts1.1中,新增了validation framework。增加了对form数据提交的验证。将原本需要在ActionFrom Beanvalidate()进行的验证通过配置文件的描述进行验证。

有关其详细信息,请参考http://home.earthlink.net/~dwinterfeldt 。个人建议对于小型应用系统可以采用这种配置方式,但是对于应用系统中有大量web层表单应用的系统,并且业务需求变动比较大的,使用validation framework 可能会加重开发难度、系统维护难度。可以借鉴validation frameworkJavascript Validator Tag

Struts TagLib

struts提供了一组可扩展的自定义标签库(TagLib),可以简化创建用户界面的过程。目前包括:Bean TagsHTML TagsLogic TagsNested TagsTemplate Tags 这几个Taglib。有关Struts Taglib的结构和使用,可以参考前面有关Cutomer Tag Lib的介绍,有关起详细资料,请参考

BeanUtils

这个组件的全称是Bean Introspection Utilites。是属于Jakarta Commons项目组的。主要是帮助构建javabean的属性操作的(getter,setter),已经提供一种动态定义和访问bean的属性。有关详细信息,请参考。

http://jakarta.apache.org/commons/beanutils.html

如果各位对这方面有很兴趣,可以参考一些有关java反射(Reflectio)方面的资料。

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

Digester

这个组件翻译成中文的意思是“汇编”。其主要功能是根据xml配置文件,初始化系统的一些java类对象。Digester帮助你指定XMLjava对象之间映射模型,而且允许客户话定制映射规则(rules)。详细资料请参考

http://jakarta.apache.org/commons/digester.html

Struts配置文件简介

Struts framework根据配置文件使得ServletAction,ActionMapping,Action , ActionForm这几个不同层次的组件相互交互,协调的工作。这些配置文件是在系统启动的时候,读入导内存中,供控制器使用的。

Struts framework主要包括三部分的配置描述,一个是指定有关Struts Controller及其相关的的配置描述(Initialization Parameters),一个对struts tag lib的描述,一个是struts组件(ActionMapping,ActionActionForm)之间相互映射协调的关系

有关Struts Controller及其相关的的配置描述

因为Struts Controller的主要类ActionServlet是继承自HttpServlet,所以必须像配置一个Servlet那样在部署描述符(Web.xml)配置ActionServlet类及其访问映射。

当您第一次创建基于StrutsWeb应用程序时,将为您创建一个部署描述符,这通常就足够了。该文件包括下列条目:

l 条目定义用于Web应用程序的servlet(在本例中,这是唯一的servlet)

指示ActionServlet (标识为“操作”)接收HTTP请求并确定如何响应。

表示servlet初始化参数.

- “config”指示ActionServlet的行为由指定的配置文件来指导,该配置文件通常具有以下名称:

WEB-INFstruts-config.xml

- “debug”具有整数值,它指示将有关处理的详细信息写至控制台的程度。

- ”detail”具有整数值,它指示将“映射”详细信息(如后面所述)写至控制台的程度。

导致在启动应用程序时装入servlet

l 元素标识这样的命名模式:当命名模式由URL进行匹配时,Web服务器就将控制权移交给ActionServlet。考虑下面各种情况:

访问了ActionServlet,原因是“操作”(中的元素的内容)与“操作”(中的元素的内容)相匹配。

元素指定URL的结尾的命名模式。每个URL的开头都是应用程序上下文路径。按照惯例,ActionServlet调用对象以响应与命名模式“*do(其中“*”是通配符)一致的URL

l 元素指示获得初始控制权的特定于应用程序的代码;在本例中,Web服务器直接从Web Content目录中调用index.jsp

l 元素指示显示哪个JSP来响应错误;在本例中,错误为如下所示:

― 404 (找不到资源)

― 500 (Web服务器内部发生错误)

l 每个元素都使相对URL(相对于Web.xml)与标记库描述符(相对于Web应用程序根目录)相关联。每个JSP都可以使用同一个URL来表示给定的标记库,而Web.xml确定引用了哪个文件。

有关struts tag lib的配置描述

如果你的web application打算使用Strutstaglib,那么你有必要在web.xml中对struts taglib进行配置描述。

有关Struts Action Mapping的配置描述

  作为先前描述的web.xml设置的结果,Web应用程序服务器将请求的一个子集按路径发送至ActionServlet,它通常调用一系列操作和JSPActionServlet的响应是基于配置文件struts-config.xml的内容的。有关其DTD文档的描述,请参考http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12706879/viewspace-1000564/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12706879/viewspace-1000564/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值