admin 管理员组

文章数量: 887032


2023年12月23日发(作者:c语言进制转换方法)

Struts in Action 中文版

2. 深入 Struts 架构

本章内容

介绍 MVC和 Model 2应用框架 理解 Struts 原理 使用 Struts 控制流 讨论

Struts 的优缺点

Translated By: Eric Liu(铁手) :shqlau@

/steelhand

第 30 页

Struts in Action 中文版

A common mistake that people make when trying to design something

completely foolproof is to underestimate the ingenuity of complete fools.

—Douglas Adams, Mostly Harmless

2.1. Talking the talk

本 章深入探讨 Struts 框架,以及它能给你的应用开发所带来的诸多好处.我们相信,一旦 你也能"随便谈谈 "web 架构和设计,你就可以很好的在你的应用中使用 Struts. 为了能对 Struts 架构有个充分的全面印象, 我们将总体介绍

Struts 的控制流和它处理请求响应事件循环的方式.只有彻底理解这个处理原理才能最好的在应用中使用这个框架. 选择一个 web 应用框架不应该是个漫不经心的决定.很多人都可以使用这本书,特别是用 这章的内容,来评价 Struts

是否适合它们的项目.因此,我们在这章的最后部分将有一个 关于 Struts 优缺点的客观评价,并阐明其总体性能. Struts 设计来针对专业开发人员.为做出正确的决策,专业人员应该知晓工具的能力和限 制.

2.2. 为什么我们需要Struts

今 天的 web 应用基本上都是代表共同理念的关键组件.通常,开发团队需要在有限的时间 里创建应用,然后它们不得不正确的构建,并能持续构建它. Java

web 开发人员已经有一些工具可用来建立表现层, 比如 JavaServer Pages 和

Velocity 模板.也有一些机制来处理数据库—如 JDBC 和 Enterprise

JavaBean (EJB).但我们用什么 来将它们集合在一起? 我们已经有了型材和砖墙…还缺什么呢?

2.2.1. 退一进三

在上世纪 80 年代,当 GUI 被发明时,软件架构认为,应用具有 3 个主要部件:

管理数据的部件, 创建屏幕和报表的部件, 以及处理用户交互和子系统交互的

部件[Ooram]. 在 90 年代早期,ObjectWorks/Smalltalk 编程环境将这个三角结构引入为一个开发框架. 按 Smalltalk 80 的说法,数据系统称为模型 Model,表现系统称为视图 View,而交互系统 称 为 控 制 器 Controller . 许 多 现

代 开 发 环 境 , 包 括 Java 的 Swing, 都 使 用 Model/View/Controller

(MVC) 架构作为它们的基础架构.

Translated By: Eric Liu(铁手) :shqlau@

/steelhand

第 31 页

Struts in Action 中文版

图 2-1

MVC 架构

Java web 开发者已经有很多有用的工具,比如 JDBC 和 JSP, 作为 Model 和

View 的手 段,但作为控制器的工具和组件在哪?

2.2.2. 进入 Struts

Struts 的核心是一个 MVC 风格的控制器. Struts 控制器搭起了 Model 和

View 之间的桥梁. 框架也包括开发人员想用来开发可伸缩的,先进的应用系统的其他组件.Struts 是一个"隐 藏支柱"的集合,帮助开发人员将分散的材料,如数据库和页面,结合成一个整体的应用系 统.

2.2.3. Struts控制器组件

Struts 控制器组件是一个可编程的组件集,允许开发人员定义它们的应用如何准确地和用 户进行交互.这些组件在逻辑名称后面隐藏了令人讨厌的,繁琐的实现细节.开发人员可以 一次性编写这些实现细节, 然后转头考虑它们的应用应该做什么, 而不是考虑应用应该如何 做. 用户通过超链接和 HTML form 与

Web 应用程序进行交互.超链接引导页面显示数据和其 他内容,如文本和图像.表单通常通过一些定制动作向应用提交数据.

图 2-2 主要 Struts 组件

如图 5 中所示, Struts 提供了开发人员可用来定义超链接,表单,和定制动作这些交互的 相关组件.我们已经使用这些组件在第 1 章创建了一个入门程序.第 3 章,我们还要用它们 来创建另一个程序.然后,在第 4 章,我们将讨论这些组件的详细配置.随后的章节,将详 细讨论如何将每个组件以及如何用在你的程序之中. 在第 4 章, 我们将展示如何在运行的程 序上下文中使用这些组件.

但是, 因为这一章是架构性的总体介绍, 所以我们继续介绍 Struts 的主要部件.

Struts 组件是通过一个XML文件进行配置的.实践中,配置项是Struts框架的有

机组成部分.为了将它们糅合在一起,我们在讲述它们的时候,会展示每个组件

第 32 页

Translated By: Eric Liu(铁手) :shqlau@

/steelhand

Struts in Action 中文版

的XML配置项.

超链接

对 应用开发人员来说, 超链接是指向应用中某些资源的路径.这些资源可能是

web 页面, 或者是定制动作.超链接中也可以包含特殊的参数.在 Struts 中,开发人员可以将超链接 定义为一个 ActionForward. 这些对象都有个逻辑名称和一个 path 属性.这使得开发人员可以设置 path,然后通过名 称来引用

Forward 通常在一个 XML 文件中定义,这个配置文件 在

Struts 启动时载入. Struts 使用 XML 定义来创建 Struts 配置, 包括一个

ActionForward 的列表.可用来创建到欢迎页面链接的 ActionForward 对象的

XML 元素看起来可能像:

这个元素事实上是创建了一个 ActionForward JavaBean , name 属性设置为

welcome, 其 path 属性设置为/pages/. JSP 页面和其它组件就可以引用这里定义的 welcome 转发.Struts 框架将查找 welcome ActionForward

bean 并获取其 path 属性以完成这个超链接. 这样开发人员可以改变链接 的目标而不用改变所有引用该链接的相关组件.在很多 Web 应用中,象这样的细节被硬编 码到 JSP 或 Java code 中,使维护变得困难并且容易发生错误.在

Struts 应用中,这些细 节可以通过应用配置来改变,而不用触及到具体的页面和 Java 类.

HTML表单

Web 协议,即 HTTP 和 HTML,提供了一个从表单中提交数据的机制,但却把数据的接 收作为一个难题留给了开发人员.为此,Struts 框架提供了 ActionForm

类.ActionForm 设计来就是处理来自 HTML 表单的输入:校验输入,重新显示表单以供用户进行修订(如 果需要),以及伴随着相应的提示和错误信息.ActionForm 其实是具有一些用来来管理校 验和修订循环的标准方法的

JavaBean. Struts 自动匹配 JavaBean 属性和 HTML 表单控件 的属性.开发者只需定义 ActionForm 类,余下的就交给 Struts . 例如,这个类将自动用 HTML

表单中同名的属性来组装 username 域: public final class LogonForm

extends ActionForm { private String username = null; public String

getUsername() { return (me); } public void setUsername(String

username) { me = username; } } 其 它 属 性 也会 根 据 表 单中 的 每 个 输入 域 被 自 动加 入 . 这 使得 其 它 组 件可 以 从 标 准的

Translated By: Eric Liu(铁手) :shqlau@

/steelhand 第 33 页

Struts in Action 中文版

JavaBean 取得它们想要的属性.所以,完全不需要对 HTTP 请求进行详细解析.

ActionForm 是 按 通 常 的 JavaBean 类 创 建 的 . Struts 配 置 通 过

一 系 列 描 述 符 引 用 ActionForm 类: 元素. 元素是框架 用来识别和实例化 ActionForm 对象的描述符:

Struts 配置中要列出它使用的 ActionForm bean 的清单, 并给每个 bean 一个在应用中被引 用时的逻辑名(name 属性).

1.0 和 1.1

Struts 1.1中,ActionForm 可以使用Map ()来存储属性名, 而不是一个个单独定义它们.一种新的JavaBean,DynaBean,也可以在 Struts 1.1和后来的版本中使用. 你可以使用XML元素来配置DynaActionForm的属性.这使你可以使用 Struts配置文件来定义ActionForm.

定制动作

HTML 表单使用 action 参数来告诉浏览器将数据送到何处.Struts 框架提供相应的 Action 类来接收数据.框架会自动创建,组装,校验和最后处理 Action 对象所对应的 ActionForm. 这样, Action 就可以直接从 ActionForm bean 取得它需要的数据. 比如下例: public final class LogonAction extends Action {

public ActionForward perform(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) throws

IOException, ServletException { MyForm myForm = (MyForm) form; // ...

return rward("continue"); } } Action 根据返回到控制器的

ActionForward 对象作出控制流的决定.这允许 Action 选择 一个逻辑名称,比如 continue 或者 cancel,而不是具体的系统路径. 为保证可扩展性,控制器也传递当前的请求和响应对象.实际上, Action 可以做所有 Java Servlet 可以做的事情.

1.0 vs 1.1

在Struts 1.1中,新的 execute 方法应该是首选,而不是我们例子中的 perform方法.perform 已经不被推荐,但为保持向后兼容,予以支持. execute 方法体允许更好的例外处理.新的ExceptionHandler 在第9章

第 34 页

Translated By: Eric Liu(铁手) :shqlau@

/steelhand

Struts in Action 中文版

讲 述. 关于Action 对象的详细信息,见第8章. 除了 ActionForward,

ActionForm,和 Action 对象,Struts 控制器层还提供了几个特殊 的组件,包括

ActionMapping 和 ActionServlet. Struts 也提供在控制器层的应用程序的本

地化.

ActionMapping

在一个 web 应用中,每个资源都必须通过 URI 来进行引用. 资源包括 HTML 页面,JSP 页面,和定制动作.为了给定制动作一个 URI, 或者说路径,Struts 框架提供了一个 ActionMapping 对象. 象 ActionForward 和 ActionForm 一样,

ActionMapping 通常也 在 XML 配置文件中定义:

path="/logonSubmit" type="ction" name="logonForm"

scope="request" validate="true" input="/pages/" />

这也允许将同一个 Action 对象定义为不同的

ActionMapping. 例如, 其中一个映射要求校 验而另一个映射不要求校验.

ActionServlet

Struts ActionServlet 完全在幕后工作,它将其他组件绑定在一起.虽然它也可以子类化,但 大多数 Struts 1.0 的开发人员将 ActionServlet 处理为一个黑盒:他们只是配置它,然后让 它自己工作. 在 Struts 1.1 中, ActionServlet

是比较易于扩展的. 9 章将讨论 Struts 1.1 ActionServlet 第 新的扩展点和配置选项.

本地化

Web 应用也通过各种提示和信息与用户进行交互.Struts 组件均有内建的本地化特征,以 便 Struts 应用可以为国际化用户使用.我们在此书中贯穿使用本地化特征.本地化的详细 讨论见第 13 章.

2.2.4. 用Struts开发Web应用

要 使用 Struts 开发 web 应用, 开发人员将需要的超链接定义为

ActionForward, HTML 表 单定义为 ActionForm,定制的服务器端动作定义为

Action 类. 需要访问 JDBC 和 EJB 的开发人员也可通过 Action 对象进行他们的工作.这样,表现层不 需要和 Model 层打交道.Struts Action 对象将收集

View 需要的数据,然后将它们转发到 表现页面.Struts 提供 JSP 标记库,它们将和 JSP 页面一起使用,简化 HTML 表单和访 问 Action 要转发的其它数据.

其它表现机制,比如 Velocity templates, 也可用来访问 Struts 框架,以创建动态的 web 页面.这种处理流程入下图:

Translated By: Eric Liu(铁手) :shqlau@

/steelhand

第 35 页

Struts in Action 中文版

图 2-3 数据回传给视图

关于和 Struts 中如何使用各种数据系统, 见第 14 章.第 10 章和第 11 章学习如何创建 Struts 的表现页面. 在深入 Struts 架构前,让我们看看一个 Web

应用框架必须说明的问题.

2.3. 为什么需要框架

第 1 章,我们介绍了应用框架,简短讨论了为什么框架很重要.但为了真正理解一个解决方 案,我们需要了解问题所在.为 web 开发应用虽然是值得的,但也要迎接各种挑战.让我 们快速看看是什么使 web 开发富有挑战.

2.3.1. Web—永无休止的修补

Web 开发者受到两种 web 缺陷的影响.首先,我们希望使用浏览器作为客户端.其次,我 们必须使用 web 协议进行通讯. Web 浏览器通过 HTTP 协议通信,并用 HTML 显示页面.Web 浏览器发送 HTTP 请求, 并渲染和显示它收到的响应.在处理很少改变的预先编好的页面时,这是个很好的平台.但 我们大多都是编写动态程序, 页面针对不同的用户是不同的. 虽然有一些现成的动态特征的 手段,web 仍然受到 HTTP/HTML 的制约. 如下表所示: web 协议和客户端的限制,确定了如何编写 Web 程序.

表格 2-1 HTTP/HTML 的限制

限制

导致的困难 缺省情况下,HTTP接收来自于网络上各种客户端的连接.但各种服

务器间的行为是不一样的; 首先,HTTP用简单的文本域来传输数据.传输二进制文件需要复杂 的协议扩展 HTTP协议是无状态的,需要额外的努力来跟踪程序的用户 HTTP信赖并期望客户能提供正确的信息

协议

客户端

浏览器是个独立的程序,处于应用的控制之外 所有的浏览器都是不一样的,都只支持官


本文标签: 应用 框架 开发人员 组件