我们首先设想一个情景:你刚刚完成一个1.0版的Web应用程序并发布了,而你的大客户却立即提出了要求——在1.1的版本中,用户界面必须进行很大程度的修改以符合他们公司的使用标准。修改几乎涉及了所有方面:从数据录入表单上的字段数量到按钮及图像的位置,再到各种向导所包含的步骤数量,等等。而且客户要求在下个星期前完成这样的修改!
面对这样的挑战,你可能会气定神闲,不动声色,也可能想着要准备简历换东家了。这天渊之别取决于你的Web应用程序是如何构建的。在早期的Web应用程序开发当中,程序员通常会使用像Perl这样的脚本语言,通过脚本将需要显示的内容直接打印出来。同时,这些脚本中也包含了关键的商业逻辑。很明显,这种方式将核心的商业代码和表现层紧密耦合在一起了。
时至今日,像Perl、PHP、JSP、ASP这些类库和其他支持Web开发的语言都在设法解决商业逻辑代码和表现层代码之间的解耦合问题。若想满足用户的需求就像在公园里散步一样轻松,就取决于使用的类库,以及你是否能够充分发挥它的优越性了。
在本书中,你将会学到如何使用Java领域中最流行的Web框架之一:WebWork。WebWork是一个优越的框架,它的设计基于这样一个基本原理:完成通用任务应该是简单的,而构建高级的设计也应该是可行的。WebWork的开发者只想提供一个能够为你工作的框架,而不是一个与你作对的框架。
为了帮助你学习WebWork,我们将向你演示如何使用WebWork基本及高级的特性构建一个改进版本的应用程序CaveatEmptor。CaveatEmptor最初出现在《Hibernate in Action》(Manning Publications,2004年,www.manning.com/bauer)一书中。Hibernate是一个简化了数据访问方式的对象关系映射(ORM)框架。该书的作者——Christian Bauer和Gavin King通过CaveatEmptor这个在线拍卖程序展示了Hibernate的特性。虽然CaveatEmptor是一个完整的应用程序,但是它并没有任何基于Web的用户界面。
在本书中,我们将演示如何使用WebWork的特性为原来的CaveatEmptor代码增加一个Web前端。我们选择这种方式介绍WebWork及它的特性是有以下几个理由的。首先,许多WebWork的用户也使用Hibernate,所以在CaveatEmptor上进行扩展可以让大家看到集成两者的最佳方式,而许多《Hibernate in Action》的读者也可以学习如何利用WebWork给CaveatEmptor增加一个Web前端。那些精通编写后端代码却不精于前端代码编写的朋友可以通过本书来了解前端的实现。
在探究WebWork的特性和CaveatEmptor之前,我们首先了解隐含于Web应用程序框架中的通用概念。在第2章“WebWork方式的HelloWorld”中,我们将通过熟悉的 “Hello, World”指南向你展示使用WebWork的基本要领。再次提醒各位读者,我们将完全专注于WebWork的特性及如何在CaveatEmptor应用程序中使用这些特性。
在此之前,你需要明白WebWork是什么,以及它设法实现什么。言简意赅地说,WebWork解决了显示逻辑和业务域逻辑的解耦合问题。但是这句话意味着什么呢?为什么这个问题如此重要?解耦合的概念是从何而来的呢?更深入一些,WebWork所基于的MVC模式又是什么呢?
1.1 为什么MVC是重要的
从表现层中分离域对象并不是Web应用程序所特有的问题,这在GUI应用程序中同样存在。Model-View-Controller(MVC)模式最初就是由SmallTalk社区开发出来,用以解决GUI应用程序存在的这个问题的。MVC寻求一种模式将应用程序分为3个部分并且详细定义这3个部分之间的交互,从而降低它们之间的耦合度,让每一部分都专注于自己职责,无须担心其他部分。
虽然原始的MVC模式在桌面GUI应用程序中发挥了很好的作用,但是它并不能直接应用到网络世界中,因为请求/响应模式组成了超文本传输协议(HTTP),限制着Web的行为。随着开发者不断改进自己的Web开发技术,MVC的发展冲破了这个限制,而MVC的核心概念并没有因发展而有所改变。WebWork则继续延续这种发展的动力,这足以和多年前SmallTalk开发人员的经历相媲美。
MVC设法减少可复用的域模型(Domain Model)与显示相关代码之间的联系。它通过在显示层与域对象之间引入一个控制器来实现这一点。控制器处理来自显示层的事件,例如点击按钮,并将事件映射为域模型的改动。控制器也通过注册显示层以获得域模型改变的通知,从而令显示层能够更新。举例来说,应用了一个不同的显示层,并不需要改变基础的域模型和控制器层(Controller Layers)。
MVC框架已经成为在Web应用程序开发中具有统治地位的架构了。WebWork是一个MVC框架,还有另外一些基于Java的MVC Web应用程序框架,像Struts(已经不再处于快速的开发状态了)、Tapestry、RIFE和JavaServer Faces(JSF)都十分流行。在我们关注基于Web的MVC设计之前,让我们来简单回顾一下最初用于桌面GUI应用程序的MVC设计。了解最初MVC的流程将会帮助你理解MVC所经历的改进,因为这些改进已经应用到WebWork中,或者特别地说,在WebWork中已经实现了这些改进。







