struts 和 tiles 辅助基于组件的开发(1)
将视图组合在一起以便于构造 web 应用程序
“模型-视图-控制器(model-view-controller,mvc)”框架对于生成有组织的模块化应用程序(这些应用程序能够清晰地划分逻辑、样式和数据),是一种经证实的和方便的方法。在 java 世界中,struts 是最著名的也是最常被谈及的 mvc 的开放源码体现之一。致力于 struts 的开发人员最近增强了该项目的核心功能,并改进了视图支持(合并了 tiles 视图组件框架来加强对基于组件开发的支持),以便增加可重用性并增强一致性。本文中,wellie chao 说明了 struts 和 tiles 组合为什么是用来创建 web 应用程序的最佳工具包,而且向您展示了如何开始使用它,这里主要讲述自 struts 0.9 以来的更改。
我开始学习如何创建软件要追溯到 80 年代中期,最初两个月的时间都花在使用线性流及嵌入式显示、逻辑和数据编写单块代码。这在那时,好象是最常用的方法。随着经验的丰富,我学会了将代码封装到对象中,将数据与逻辑分离,重构公共代码并实践其它良好的编程公认原则。
web 开发人员接受 mvc
眨眼到了 1994 年,当时主流的采用 web 应用程序的开发才刚开始。由于 web 的不成熟,只有较少的工具能帮助开发人员构建 web 软件。结果,在特定解决方案中的应用程序混合了 html 代码与应用程序逻辑。很显然,ui 设计的更改和业务逻辑的更新在大型应用程序中既困难又昂贵,因为紧耦合的表示和逻辑将这两种元素搅和在一起,进而导致错误和缓慢的进展。而且,混合的代码要求部分开发人员具备 ui 设计知识,或者要求开发人员与图形设计人员之间有紧密的工作关系,这常常会造成时间上的浪费。
jsp 技术和标记的引入稍微改善了这种更改问题,因为能够将逻辑和显示分离。ui 设计人员能够对显示进行卓有成效的工作,同时开发人员能够专注于逻辑。然而,这种方法仍存在一些缺陷。尤其是某些操作(还有公共操作)的开发仍很困难。验证表单就是典型的例子。正如很多人所知,表单验证的过程类似于这样:
- 显示表单;等待用户填写然后提交数据。
- 检查各域值是否有效;如果有错误,则重新显示表单。
- 处理用户输入的数据,可能将其存储在一个数据库中。
- 在新页面上向用户显示处理的结果或下一步(可能是另一个表单)。
如果在这一过程中只使用 jsp 页面,那么在需要再次更改代码时,您会发现,按照可管理性这条思路,将控制从一个页面“路由”至另一个页面很难。您想把第 4 步和第 3 步置于同一个页面吗?如果使用多个单独的 jsp 页面,那么如何跟踪哪个页面链接至其它页面,以及在要更改一个页面的文件名或位置时该怎么做呢?而且,在第 2 步检测到某个域中的错误时,如何重新显示带有一条错误消息的原始表单,但还要保留用户已填入的值呢?struts,一种开放源码“模型-视图-控制器”框架,通过帮助解决所有这些问题,从而使开发人员的工作更为轻松。
本文并不深入讨论 mvc 平台。有关这方面的信息,请参阅 malcolm davis 所写的标题为“ struts, an open-source mvc implementation ”的 developerworks 文章。您正在阅读的这篇文章讨论自 malcolm 的文章发表以来对 struts 所做的更改,包括 tiles 库。至于代码的安装过程,本文仅涉及 jakarta tomcat 4.0(catalina)最小安装所需的步骤。如果您没有使用 tomcat,请查阅手册以了解您的应用程序服务器。
struts 和 tiles 的背景知识
craig mcclanahan 是 apache tomcat 项目的技术主管,他创立 struts 项目以满足对这方面的渴望。它作为“模型-视图-控制器”框架首选的并经过正式认可的开放源码实现,已经越来越流行了。它以与交付产品一起分发的形式受到来自 sun 和 ibm 的支持。因为 craig 积极参与 tomcat 和 struts 的开发工作,所以 struts 将继续与 jsp 和 servlet 规范的参考实现高度兼容,进而与所有 j2ee 应用程序服务器高度兼容。
malcolm davis 的有关 struts 的 developerworks 文章涵盖了整个 struts 0.9 的功能;为了简短起见,我将只讨论对 struts 0.9 的更改以及他未涉及的 struts 主题。目前的 struts 发行版本是 1.0.2,但自 2002 年 3 月 19 日起有一个标记为 1.1-b1 的 beta 测试版可供使用。因为 beta 测试版表示编码工作已经完成,在这种情况下只进行错误修正,所以极有可能 1.1 的最终版本不久就将面市,而在 struts 邮件列表上已经有这种呼声。因此,任何利用 struts 的新项目很可能都将 1.1 代码作为基础,而这就是我将讨论的内容。
自版本 0.9 以来对 struts 框架的有用添加包括经改进的表单验证功能、可以通过 xml 声明来指定表单元素和可以动态地定义 bean 特性。然而,最重要的添加可能是将 tiles 模板库合并到 struts 分发版中。
您是否曾希望用一种更简便的方法创建一组页面(或可能是整个应用程序),并且每个页面上的用户界面保持一致 ?d 有相同的导航栏、页眉和页脚等等?在含有较多内容的页面内显示多个类 portlet 的矩形内容的方法又如何?在 tiles 框架的帮助下,您可以完成这两项任务和其它更多任务。通过定义屏幕和一组可嵌入在 jsp 页面中的标记的核心 xml 文件来插入静态和动态内容,tiles 框架允许您构建组件化的视图,并按您的希望来组装它们,从而有助于提高灵活性、可重用性、一致性和可维护性。
struts 和 tiles 之间交互良好,因为这两个项目的开发人员已经认识到这两者具有互补性,所以决定让这两者共同协作。开发人员可以指定 tiles 页面定义作为 struts 操作的目标视图(按照 struts 的说法是一个 forward )。因为 struts 和 tiles 都遵循 jsp 标记库规范,所以可以在 jsp 页面中将 struts 标记和 tiles 标记相互混合在一起。
您可能渴望尝试 tiles 框架,并确切地了解它可以做些什么。如果您希望在自己安装本文的示例前先了解这些示例的运行情况,可以看看它们在带有嵌入式 tomcat 的 jboss 服务器上 是怎样运行的 。
struts 和 tiles 是用于 web 开发的辅助工具,所以您需要设置一个 web 容器对它们进行实验;将 tomcat 设置为您的容器,然后设置 struts 和 tiles 包,我会在下一节中循序渐进地讲述这一过程。这些指导信息还向您展示了如何安装本文的样本代码。一旦完成了这一切,您就准备好继续本文。示例 1 应用程序没有利用 struts 和 tiles;它演示了以页面为中心的方法。通过将它与示例 2 比较,您会看到 struts 和 tiles 将如何极大地提高您的 web 开发的结构化程度和可管理性。最后,示例 3 演示了将功能添加到一个使用 struts 和 tiles 的、并且已经启动且正在运行的 web 应用程序中是多么地简单。
(未完待续)
闽公网安备 35060202000074号