《2022年JEE环境下各类开发架构简介 .pdf》由会员分享,可在线阅读,更多相关《2022年JEE环境下各类开发架构简介 .pdf(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 JEE环境下各类开发架构简介姓名:高伟勋电子邮件: 来源: www.javathinker.org 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 43 页 - - - - - - - - - 2 中文摘要如今,各种可用的Web框架如雨后春笋般林立。把浏览器指向Java 技术网站时,常会看到新版的 Web框架发布的消息,这些新框架意图改变现代世界。虽然有些人认为这是坏事,把 Java群体分解得支离破碎,但事实是,不断冒出的新框架只是演化的过程而已。通过这样的演化过程,
2、有些框架成为目前几种主流的Web框架。本文着重讨论几种主流框架的原理,尤其详细讲解Structs框架,各框架之间的比较,及这些框架在未来发展的趋势。它们包括 Structs框架, JavaServer Faces(JSF)框架, Spring框架。这些框架几乎都是Model-View-Controller(MVC )模式的实现,所以本文先介绍了MVC的工作模式及其原理。Struts框架实质上就是在JSP Model2 的基础上实现的一个MVC框架。在下面的章节中将详细介绍Struts框架的工作原理及流程。JSF 是对Struts的升级。不过不同于Struts的开放源代码模式,它是Sun 制定的
3、一个规范。本文除了介绍JSF 的工作原理,还有很大的篇幅对JSF,Struts的模式应用进行比较。Spring是另一个解决了许多在J2EE开发中常见的问题的强大框架。Spring的架构基础是基于使用JavaBean 属性的 Inversion of Control容器。然而,这仅仅是完整图景中的一部分:Spring在使用 IoC 容器作为构建所有架构层的完整解决方案方面是独一无二的。 Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他 O/R mapping 解决方案。关键词:
4、MVC ,Struts,JSF, Spring 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 43 页 - - - - - - - - - 3 目录中文摘要 . 2目录 . 3第 1 章绪论 . 51.1引言 . 51.2MVC 模式简介 . . 51.3基于 J2EE 的几种设计框架简介. 61.3.1Struts框架 . 61.3.2 JavaServer Face(JSF)框架 . 61.3.3 Spring框架 . 7第 2 章 MODEL-VIEW-CONTR
5、OLLER(MVC )模式. 82.1MVC 的概念 . . 82.2视图 . 92.3控制器 . 92.4模型 . 102.5MVC 的优点 . . 10第 3 章 STRUCTS 框架 . 113.1JAVAWEB应用结构的发展. 113.1.1 Model 1结构 . 113.1.2 Model 2结构 . 123.2STRUTS概述 . . 123.3STRUTS的各组件 . . 133.3.1 Struts控制器组件 . 133.3.2 Struts模型组件 . 193.3.3 Struts视图组件 . 193.4配置 STRUTS应用 . 213.4.1 创建 Web应用的配置文件
6、web.xml . 213.4.2 Struts配置文件 struts-config.xml与 org.apache.struts.config包. 223.5STRUTS的国际化 . . 233.5.1 Locale类 . 243.5.2 ResourceBundle类 . 25第 4 章 JAVASERVER FACE (JSF)框架 . 274.1JSF 基于组件的MODEL-2 MVC 策略 . . 274.1.1 Controller . . 274.1.2 Model . . 284.1.3 View . . 284.2JSF 事件 . . 294.2.1 UI事件 . 29名师资
7、料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 43 页 - - - - - - - - - 4 4.2.2 侦听器 . . 294.2.3 阶段标识 . . 304.2.4 时间排队和广播 . . 304.3标准 JSF 请求处理流程. 304.5.1 恢复视图 . . 304.5.2 应用请求值 . . 314.5.3 处理验证 . . 314.5.4 更新 Model 数值 . . 314.5.5 调用应用 . . 324.5.6 渲染响应 . . 32第 5 章 SPR
8、ING 框架概述. 335.1SPRING 框架总览 . 335.2IOC 和 AOP简介 . 355.2.1面向方面的编程( AOP ) . 355.2.2 IOC 容器. . 365.2.3 BeanFactory 接口 . . 365.3SPRING MVC框架 . 375.3.1 Spring MVC 框架简介 . . 375.3.2 配置 Spring MVC . . 375.3.3 配置应用程序的 URL . . 385.3.4 装入配置文件 . . 385.4HIBERNATE 与 SPRING. 395.4.1Hibernate 简介 . 395.4.2 Spring 中的 H
9、ibernate . 40第 6 章总结和展望 . . 42参考文献 . 43名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 43 页 - - - - - - - - - 5 第 1 章绪论过去几年来,万维网的发展已经到了一个很重要的转折点。Java开发人员必须辛苦地在一个 JSP 页面里塞进表示逻辑、通过SQL存取数据库以及导航智能的日子过去了。Java Web 开发人员已从那些失败的经验吸取了教训,付出了除错和维护的时间,继续向前挺进。1.1 引言如今,各种可用的We
10、b框架如雨后春笋般林立。把浏览器指向Java 技术网站时,常会看到新版的 Web框架发布的消息,这些新框架意图改变现代世界。虽然有些人认为这是坏事,把 Java群体分解得支离破碎,但事实是,不断冒出的新框架只是演化的过程而已。当今重要的Web应用程序的设计和结构把开发人员推进到逻辑和实际可能的极限。这些应用程序所面临的问题有各式各样的解决办法。有些解决办法历经岁月的考验,在新一代软件中依然能传达相当有价值的观点。有些解决办法就做不到了,既然无法满足用户和增值的需求,往往只能靠边站了。通过这样的演化过程,有些框架成为目前几种主流的Web框架。本文着重讨论几中主流框架的原理,他们之间的比较,及这些
11、框架在未来发展的趋势。它们包括Structs框架, JavaServer Faces(JSF)框架, Spring框架。1.2 MVC 模式简介MVC 是 Model-View-Controller的简称,即模型- 视图 -控制器,它把应用程序分成三个核心模块:模型、视图、控制器,它们各自处理自己的任务。视图是用户看到并与之交互的界面,作用如下:视图向用户显示相关的数据;接受用户的输入;不进行任何实际的业务处理;视图向模型查询业务状态,但不能改变模型;视图接受模型发出的数据更新事件,从而对用户界面进行同步更新。模型是应用程序的主体部分,模型表示业务数据和业务逻辑。一个模型能为多个视图提供数据。
12、应用于模型的代码只需写一次就可以被多个视图重用,提高了代码的可重用性。控制器接受用户的输入并调用模型和视图去完成用户的需求。当Web用户单击Web页面中的递交按钮来发送HTML表单时,控制器本身不输出任何东西或处理任何业务数据。控制器接收名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 43 页 - - - - - - - - - 6 请求并决定调用哪个模型组件去处理请求,然后决定调用哪个视图来显示模型处理返回的数据。1.3 基于 J2EE的几种设计框架简介本节简单介绍一些
13、设计框架和基本概念。这些框架都说MVC 模式的具体实现,或者包含MVC模式的实现。1.3.1 Struts框架Struts 实质上就是在JSP Model2 的基础上实现的一个MVC框架。模型: JavaBean、EJB 组件。控制器:ActionServlet、Action 。视图: JSP、Struts客户化标签。从视图角度 (View) 。 首先,Struts提供了 Java 类 org. apache.struts.action.ActionForm,Java 开发者将该类细分来创建表单bean。在运行时,该bean 有两种用法:当JSP 准备相关的HTML ,表单以进行显示时,JSP
14、将访问该bean( 它保存要放入表单中的值) 。那些值是从业务逻辑或者是从先前的用户输入来提供的;当从Web浏览器中返回用户输入时,该bean 将验证并保存该输入以供业务逻辑或( 如果验证失败的话) 后续重新显示使用。其次, Struts提供了许多定制JSP标记, 它们的使用简单,但是它们在隐藏信息方面功能强大。例如,除了bean 名称和给定bean 中每个段的名称之外,页面设计者不需要知道有关表单bean 的更多信息。从模型角度(Model )。 Struts虽然不直接有助于模型开发。在Struts中,系统模型的状态主要由ActiomForm Bean和值对象体现。从控制器角度(Contro
15、ller)。在 Struts框架中, Controller主要是 ActionServlet,但是对于业务逻辑的操作则主要由Action 、ActionMapping、 ActionForward这几个组件协调完成。其中, Action扮演了真正的控制逻辑的实现者,而ActionMapping和 ActionForward则指定了不同业务逻辑或流程的运行方向。1.3.2 JavaServer Face(JSF)框架JSF 框架和那些常用来创建Web应用程序的MVC框架并没有多大的差异。不过JSF 在很多地方都添加了功能,那是Struts所欠缺的,而且把接口和实现相分离。由于 JSF 是围绕着M
16、VC 概念而设计出来的,当然会看到JSF 中有模型、视图和控制器。虽然这些部分在JSF 中都有, 但 Web会对 MVC 模型有一些特别的限制。浏览器不太会坐在那里等着时间来到,相反的,浏览器在发出需要某种信息的请求后,就会期待信息被返回来,并不会专门监名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 43 页 - - - - - - - - - 7 听事件发生。JSF 的 做 法 是 提 供 组 件 来 处 理 应 用 程 序 中 属 于 控 制 器 那 部 分 的 工
17、作 , 其 中 包 括FrontController(类似于Struts的 ActionServlet)、 NavigationHandler、转换和格式化组件、拦截命令的ActionListeners以及验证表示数据。JSF 也为视图提供了组件,这些组件的实现方式是做成客户特有的输出显示工具,也就是输出生成器,这些输出生成器知道如何在浏览器中生成按钮或文本字段。JSF 的目标是提供一种构建UI 的方式, 这种方式独立于客户类型。其做法就是利用一种输出显示工具,使其内含跟客户类型有关的UI 部分。输出显示工具会检测所使用的客户类型,再据此显示图形部件。JSF 也允许自定义图形不见,这很类似于J
18、ava Swing。事实上,如果输出显示工具不支持某种客户类型,你也可以创建全新的输出显示工具。1.3.3 Spring框架Spring是什么呢?首先它是一个开源的项目,而且目前非常活跃;它是一个基于IoC 和 AOP的构架多层j2ee 系统的框架,但它不强迫你必须在每一层中必须使用Spring ,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的MVC ,对不同的数据访问技术提供了统一的接口,采用IoC 使得可以很容易的实现bean 的装配,提供了简洁的AOP并据此实现Transcation Managment,等等 ,Spring 是一个开源框架,是为了解决企
19、业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架。Spring 框架是一个分层架构,由7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理bean 的方式。组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。Spring 框架的功能可以用在任何J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE 环
20、境(Web 或 EJB)、独立应用程序、测试环境之间重用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 43 页 - - - - - - - - - 8 第 2 章 Model-View-Controller(MVC )模式MVC 最初是随Smalltalk开始流行的,如今用于许多现代设计框架。MVC主要的好处之一,是为交互性用户界面提供了可重用组件。MVC模式旨在将交互性应用分成三个单独的组件:Model、View、Controller。Model 代表核心的应用数据
21、与功能性逻辑,View 渲染数据并显示给应用的用户,Controller处理用户的交互或输入。三个组件均通过变更传播机制来通信,以保持彼此间的通信。2.1 MVC 的概念MVC 是 Model-View-Controller的简称, 即模型 - 视图 - 控制器。 它把应用程序分成三个核心模块:模型、视图、控制器,它们各自处理自己的任务。首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理。然后模型根据用户请求进行相应的业务逻辑处理,并返回数据。 最后控制器调用相应的视图格式化模型返回的数据,并通过视图呈现给用户。图 2.1.1 MVC结构图MVC 模式各模块的功能如下表:名师资料总结
22、- - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 43 页 - - - - - - - - - 9 图 2.1.2 MVC模块的功能图2.2 视图视图是用户看到并与之交互的界面,作用如下: 视图向用户显示相关的数据;接受用户的输入;不进行任何实际的业务处理;视图向模型查询业务状态,但不能改变模型;视图接受模型发出的数据更新事件,从而对用户界面进行同步更新。视图指的是把领域模型以某种用户接口显示出来。相同的领域模型可以有多种视图。领域模型包含了业务实体,并由业务实体保存与应用程序相关的状态
23、。比方说,视图是一个窗口,客户可以通过窗口来查看模型的状态,而客户所见到的外观将随窗口而异。由于业务对象本身无法对外展现自己,因此必须交由视图组件向客户呈现领域模型的信息。这种视图的表示可能是XML和 XSLT的形式, 并将 SOAP 信息返回给Web服务客户。 尽管可以对不同类型的客户提供不同的视图,但是所使用的仍然是相同的模型。模型是用来表示应用程序的状态,而视图则是用来表示模型或模型的一部分给客户看的。2.3 控制器控制器接受用户的输入并调用模型和视图去完成用户的需求。当 Web用户单击 Web页面中的递交按钮来发送HTML表单时,控制器本身不输出任何东西或处理任何业务数据。J2EE 前
24、端控制器设计模式使用一个控制器作为中控点来接收所有客户请求,这个模式除了具有其他优点外,它对于应用程序功能的影响是:应用程序可以把安全机制、国际化以及获得相同的服务。 当这些服务的行为需要修改时,对那些可能会影响整个程序的修改而言,只需要在程名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 43 页 - - - - - - - - - 10 序中某个很小的、几乎隔绝的区域内进行修改即可。2.4 模型模型是应用程序的主体部分,模型表示业务数据和业务逻辑。一个模型能为多个视图提
25、供数据。应用于模型的代码只需写一次就可以被多个视图重用,提高了代码的可重用性。应用程序的模型组件可以视为一个组织中最有价值的软件部件。模型包括了业务数据以及存取和修改这些数据的法则。把模型放在某个位置是很重要的,如此才可以维持数据的有效性和完整性、减少冗余,并增加重用性。模型应该知道跟使用业务对象及其相关法则的客户类型无关。事实上,模型中的组件应该不知道是哪个类型的客户或框架正在使用它。请记住这个原理: “依赖性往下走,数据往上走” 。其基本思想是,当你使用分层结构时,较上层的总是会依赖较下层的,但较下层的不应该依赖其上的层次。2.5 MVC 的优点首先,最重要的一点是多个视图能共享一个模型。
26、同一个模型可以被不同的视图重用,大大提高了代码的可重用性。由于 MVC的三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的松偶合的构件。此外,控制器提高了应用程序的灵活性和可配置性。控制器可以用来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 43 页 - - - - - - - - - 11 第 3 章 Structs框架Struts作为一个开放原代码的应
27、用框架,在最近几年得到了飞速的发展,在JSP Web应用开发中应用得非常广泛,有的文献上说它已经成为JSP Web应用框架的事实上的标准。那么,究竟什么是Struts呢?要回答这个问题还得从JSP Web 应用的两种基本的结构模式: Model 1和 Model 2说起3.1 JavaWeb 应用结构的发展3.1.1 Model 1结构图 3.1.1 model 1应用结构model 1是一个以JSP 文件为中心的模式,在这种模式中JSP 页面不仅负责表现逻辑,也负责控制逻辑。 专业书籍上称之为逻辑耦合在页面中,这种处理方式, 对一些规模很小的项目如:一个简单的留言簿,也没什么太大的坏处,实际
28、上, 人们开始接触一些对自己来说是新的东西的时候,比如,用JSP 访问数据库时,往往喜欢别人能提供一个包含这一切的单个JSP 页面,因为这样在一个页面上他就可以把握全局,便于理解。但是,用Model 1模式开发大型时,程序流向由一些互相能够感知的页面决定,当页面很多时要清楚地把握其流向将是很复杂的事情,当您修改一页时可能会影响相关的很多页面,大有牵一发而动全身的感觉,使得程序的修改与维护变得异常困难; 还有一个问题就是程序逻辑开发与页面设计纠缠在一起,既不便于分工合作也不利于代码的重用,这样的程序其健壮性和可伸缩性都不好。Grady Booch等人在 UML 用户指南一书中,强调建模的重要性时
29、,打了一个制作狗窝、私人住宅、和大厦的形象比喻来说明人们处理不同规模的事物时应该采用的合理方法一样,人们对不同规模的应用程序也应该采用不同的名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 43 页 - - - - - - - - - 12 模式。3.1.2 Model 2结构图 3.1.2 model 2应用结构为了克服Model 1的缺陷,人们引入了Model 2,它引入了 控制器 这个概念,控制器一般由 servlet来担任,客户端的请求不再直接送给一个处理业务逻辑
30、的JSP 页面,而是送给这个控制器,再由控制器根据具体的请求调用不同的事务逻辑,并将处理结果返回到合适的页面。因此,这个servlet控制器为应用程序提供了一个进行前-后端处理的中枢。一方面为输入数据的验证、 身份认证、 日志及实现国际化编程提供了一个合适的切入点;另一方面也提供了将业务逻辑从 JSP 文件剥离的可能。业务逻辑从JSP 页面分离后,JSP 文件蜕变成一个单纯完成显示任务的东西,这就是常说的View 。而独立出来的事务逻辑变成人们常说的Model, 再加上控制器 Control本身,就构成了MVC 模式。实践证明,MVC 模式为大型程序的开发及维护提供了巨大的便利。3.2 Str
31、uts概述其实, MVC 开始并不是为Web应用程序提出的模式,传统的MVC 要求 M 将其状态变化通报给 V,但由于Web浏览器工作在典型的拉模式而非推模式,很难做到这一点。因此有些人又将用于Web应用的 MVC 称之为 MVC2 。正如上面所提到的MVC 是一种模式,当然可以有各种不同的具体实现,包括您自己就可以实现一个体现MVC 思想的程序框架,Struts就是一种具体实现MVC2 的程序框架。它的大致结构如图3.2 所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12
32、页,共 43 页 - - - - - - - - - 13 图 3.2 Struts应用结构图 3.2基本勾勒出了一个基于Struts的应用程序的结构,从左到右,分别是其表示层(view )、控制层 (controller)、和模型层 (Model)。其表示层使用Struts标签库构建。来自客户的所有需要通过框架的请求统一由叫ActionServlet的 servlet接收( ActionServlet Struts已经为我们写好了,只要您应用没有什么特别的要求,它基本上都能满足您的要求),根据接收的请求参数(struts-config.xml中) Struts配置 ActionMapping
33、, 将请求送给合适的Action去处理,解决由谁做的问题,它们共同构成Struts的控制器。 Action则是 Struts应用中真正干活的组件,开发人员一般都要在这里耗费大量的时间,它解决的是做什么的问题,它通过调用需要的业务组件(模型)来完成应用的业务,业务组件解决的是如何做的问题,并将执行的 结 果 返 回 一 个 代 表 所 需 的 描 绘 响 应 的JSP ( 或Action) 的ActionForward对 象 给ActionServlet以将响应呈现给客户。3.3 Struts的各组件3.3.1 Struts控制器组件3.3.1.1 多应用模块多应用模块指同一个应用包含多个子应用
34、,每个子应用可以处理相关的一组功能。例如,对于网上购物应用,可以由一个子应用来处理商品和商品目录信息,再由另一个子应用处理购物车和订单信息。把应用划分成多个模块,可以简化应用的并行开发过程,缩短开发周期。所有的子应用都共享同一个ActionServlet实例,但每个子应用有单独的配置文件和RequestProcessor实例。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 43 页 - - - - - - - - - 14 图 3.3.1.1 Struts的多应用模块3
35、.3.1.2 ActionServlet组件ActionServlet组件充当Struts框架的中央控制器,Servlet容器会在ActionServlet被加载后立即执行它的init()方法,以下是ActionServlet的 init()方法完成的初始化操作:(1)调用initInternal()方法,初始化Struts框架内在的消息资源,如与系统日志相关的通知、警告和错误消息。(2)调用 initOther()方法,从 web.xml 文件中加载ActionServlet的初始化参数,如config参数。(3)调用 initServlet()方法,从web.xml 文件中加载Action
36、Servlet的 URL映射信息。此外,还会注册web.xml 和 Struts配置文件所使用的DTD文件。这些DTD文件用来验证web.xml和Struts配置文件的语法。(4)调用initModuleConfig()方法,加载并解析默认子应用模块的Struts配置文件,创建ModuleConfig对象,把它存储在ServletContext中。(5)调用 initModuleMessageResources()方法,加载并初始化默认子应用模块的消息资源,创建 MessageResources 对象,把它存储在ServletContext中。名师资料总结 - - -精品资料欢迎下载 - -
37、- - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 43 页 - - - - - - - - - 15 (6)调用initModuleDataSources()方法,加载并初始化默认子应用模块的数据源。如果在Struts配置文件中没有定义元素,就忽略这一步骤。(7)调用 initModulePlugins()方法,加载并初始化默认子应用模块的所有插件。(8)当默认子应用模块被成功的初始化后,如果还包括其他子应用模块,将重复步骤(4)到步骤( 7),分别对其他子应用模块进行初始化。图 3.3.1.2 Struts控制器初始化
38、流程当 ActionServlet实例接收到HTTP请求后,在 doGet() 或 doPost()方法中都会调用process()方法来处理请求。以下是ActionServlet的 process()方法的源代码:protected void process(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException ModuleUtils.getInstance().selectModule(request, getServletContext(); getReq
39、uestProcessor(getModuleConfig(request).process(request, response); 我们再来看Struts控制器是如何响应客户请求的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 43 页 - - - - - - - - - 16 图 3.3.1.3 Struts控制器响应客户请求的工作流程Struts框架响应客户请求的工作流程如下:(1)如果 ActionMapping实例不存在,就创建一个ActionMapping
40、对象,它包含了把请求转发给哪个Action的信息。(2)如果 ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到 ActionForm对象中。(3) 根据配置信息决定是否需要表单验证。如果需要验证, 就调用 ActionForm的 validate()方法。(4)如果ActionForm的 validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
41、 - - - - - 第 16 页,共 43 页 - - - - - - - - - 17 (5)ActionServlet根据配置信息决定将请求转发给哪个Action 。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的 execute 方法。(6)Action的 execute 方法返回一个ActionForward对象, ActionServlet再把客户请求转发给 ActionForward对象指向的JSP 组件。(7)ActionForward对象指向的JSP组件生成动态网页,返回给客户。对于以上流程的步骤(4),如果ActionForm的 validate(
42、)方法返回一个包含一个或多个ActionError的 ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含客户提交表单的JSP 组件。在这种情况下,不会再创建Action对象并调用Action的 execute方法。3.3.1.3 RequestProcessor组件RequestProcessor的 process()方法:(1) 调用 processMultipart()方法。如果 HTTP请求方式为POST , 并且请求的contentType属性以“ multipart/form- data”开头 , 标准的 HttpServletRe
43、quest对象将被重新包装, 以方便处理“ multipart”类型的HTTP 请求。如果请求方式为GET ,或者contentType属性不是“multipart”,就直接返回原始的HttpServletRequest对象。(2)调用 processPath()方法,获得请求URI 的路径,这一信息可用于选择合适的Struts Action组件。(3)调用 processLocale()方法,当ControllerConfig对象的 locale属性为 true ,将读取用户请求中包含的Locale信息,然后把Locale 实例保存在session范围内。(4)调用 processConte
44、nt()方法,读取ControllerConfig对象的 contentType属性,然后调用 response.setContentType(contentType)方法,设置响应结果的文档类型和字符编码。(5)调用processNoCache() 方法,读取ControllerConfig对象的nocache 属性,如果nocache 属性为 true ,在响应结果中加入特定的头参数: Pragma 、 Cache-Control和 Expires ,防止页面被存储在客户浏览器的缓存中。(6)调用 processPreprocess()方法。该方法不执行任何操作,直接返回true 。子类可
45、以覆盖这个方法,执行客户化的预处理请求操作。(7)调用 processMapping()方法,寻找和用户请求的URI 匹配的 ActionMapping。如果不存在这样的ActionMapping,向用户返回恰当的错误消息。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 43 页 - - - - - - - - - 18 (8)调用 processRoles()方法,先判断是否为Action配置了安全角色。如果配置了安全角色,就调用isUserInRole()方法判断当
46、前用户是否具备必需的角色。如果不具备,就结束请求处理流程,向用户返回恰当的错误消息。(9)调用 processActionForm()方法,先判断是否为ActionMapping配置了 ActionForm 。如果配置了ActionForm ,就先从ActionForm的存在范围内寻找该ActionForm实例,如果不存在, 就创建一个实例。 接下来把它保存在合适的范围中,保存时使用的属性key 为 ActionMapping的 name属性。(10)调用 processPopulate()方法。如果为ActionMapping配置了ActionForm ,就先调用 ActionForm的 r
47、eset()方法,再把请求中的表单数据组装到ActionForm中。(11)调用processValidate()方法,如果为ActionMapping配置了ActionForm ,并且ActionMapping的 validate属性为 true , 就调用 ActionForm的 validate()方法。如果 validate()方法返回的ActionErrors对 象 中 包 含ActionMessage对象,说明表单验 证 失败,就把ActionErrors对象存储在request范围内,再把请求转发到ActionMapping的 input属性指定的 Web组件。如果ActionF
48、orm的 validate()方法执行表单验证成功,就继续执行下一步请求处理流程。(12)调用 processForward()方法,判断是否在ActionMapping中配置了forward属性。如果配置了这个属性,就调用RequestDispatcher的 forward()方法,请求处理流程结束,否则继续下一步。(13)调用 processInclude()方法,判断是否在ActionMapping中配置了include属性。如果配置了这个属性,调用 RequestDispatcher的 include()方法, 请求处理流程结束,否则继续下一步。(14)调用 processAction
49、Create()方法, 先判断是否在Action缓存中存在这个Action实例,如果不存在,就创建一个Action实例,把它保存在Action缓存中。(15)调用 processActionPerform()方法,该方法再调用Action实例的 execute()方法。execute()方法位于try/catch代码中,以便捕获异常。( 16 ) 调 用processActionForward()方 法 , 把Action的execute()方 法 返 回 的ActionForward对象作为参数传给它。processActionForward()根据 ActionForward对象包含的请求
50、转发信息来执行请求转发或重定向。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 43 页 - - - - - - - - - 19 3.3.1.4 Action组件Action类的 execute()方法:public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws