图1-1展示了在经典MVC中的事件流。用户与视图(View)进行交互,填入数据并点击按钮,控制器(Controller)接收到来自视图的事件并对模型(Model)进行操作,根据用户提供的数据更新模型(Model)。视图也会接到“模型改变”的事件通知,因此它会随着模型而更新,将模型更新的结果显示给用户。我们通过注册更多的事件监听器对多个视图和控制器进行配置,以便让它们使用相同的共享模型。这种模式在单机且实时更新的应用程序中可以起到很好的作用。但是,在Web世界中,这种经典的MVC模式就失效了。在Web世界中,视图是在客户端的浏览器中生成的,而控制器和模型则是在服务器端,图1-1很清楚地展示了设计的方法。但糟糕的是,这在HTTP和HTML的世界里是行不通的。因此,使用HTTP请求/响应模式的Web应用程序需要一个与MVC截然不同的设计,这个设计借用了MVC的名称和一些方式。
在Web版本的MVC中,视图是不能如图1-1所示的那样直接调用控制器的,但是可以基于Web请求映射成不同的URL。视图不是一个可以被更新的对象,而是在客户端发出一个新请求的时候随之重新呈现的Web页面。同时,模型也不能将自身的改变通知视图,因为视图呈现于另外一台计算机的用户浏览器中。因此,视图每次都需要依照最新的数据重新生成。
图1-2 Web应用程序中的MVC事件流图1-2展示了应用在Web应用程序的MVC事件流。
在Web世界中的经典MVC应用程序是通过使用前端控制器模式来实现的。这个模式包含了一个分发器(在Java的Web MVC实现中,通过Servlet来实现分发器),而分发器将请求URL映射至需要被执行的命令实例(Command Instance),命令实例在WebWork或者Struts中就是action。action与系统后端的服务进行交互,通常这些服务会组合在一起作为模型。命令实例在处理完业务逻辑之后返回一个码值,而这个返回码会映射到某一个视图(通常是一个Web页面模板,譬如JSP)。最后,结合控制器和模型,视图将会呈现给用户。通常视图会使用标签库,以便更简单地访问数值。
图1-3和图1-4展示了控制面板的两种实现——前端控制器实现和页面控制器实现之间的区别。由于X、Y和Z部分职责的分离,页面控制器可能看起来更加模块化一些,但是良好的面向对象设计也可以实现一个模块化的前端控制器。如果你熟悉Struts,前端控制器模式看起来会更熟悉。即使你不熟悉其他的Web框架,前端控制器模式也应该是收集并呈现数据的最直接的方式了。尽管如此,一些框架则因为页面控制器模式鼓励封装而应用之,如图1-4所示。幸运的是,WebWork同时支持这两种实现,将两者的优点都呈现于你的面前
根据我们的经验,框架可以极大地提高开发效率。为了能够满足用户的需求并且应对来自不断改变的商业世界的挑战,我们强烈推荐你在构建Web应用程序的时候充分发挥MVC设计模式的优势。事实上,绝大多数的开发人员并不会自己从零开始写一个MVC框架,而是在已有框架(譬如WebWork)的基础上进行改进。
使用前端控制器MVC模式设计的控制面板的实现
使用页面控制器MVC模式设计的控制面板的实现
posted on 2007-01-09 21:45
JavaCoffe 阅读(391)
评论(0) 编辑 收藏 所属分类:
Struts&&WebWork