JavaWeb从入门到精通(视频实战版)
上QQ阅读APP看书,第一时间看更新

3.3 Web世界中的MVC

本节将着重讲述Web世界中MVC模式是如何应用的,与传统的C/S结构中MVC模式有哪些区别。另外,以网页为视图也为MVC带来了一些变化和发展,产生了新的处理方式:前端控制器和页面控制器。

3.3.1 MVC在Web中的发展

在经典MVC的事件流中,用户与视图(View)进行交互,输入数据并单击按钮,控制器(Controller)接收到来自视图的事件并对模型(Model)进行操作,根据用户提供的数据更新模型(Model)。视图也会接到“模型改变”的事件通知,因此它会随着模型而更新,将模型更新的结果显示给用户。这种模式在单机且实时更新的应用程序中可以起到很好的作用,如图3.2所示。

图3.2 传统MVC图

但是在Web世界中这种经典的MVC模式就失效了,因为在Web世界中,视图是在客户端的浏览器中生成的,控制器和模型则是在服务器端,它们之间的交互是通过HTTP协议来完成的。因此视图是不能如图3.2所示的那样直接调用控制器的,但是可以基于HTTP请求映射成不同的URL。视图不是一个可以被更新的对象,而是在客户端发出一个新请求的时候随之重新呈现的网页页面。同时,模型也不能将自身的改变通知视图,因为视图呈现于另外一台计算机的用户浏览器中。因此,视图每次都需要依照最新的数据重新生成。

在Web世界中的经典MVC应用程序是通过使用前端控制器(Front Controller)模式来实现的。这个模式包含了一个分发器(在Java的Web MVC实现中,通过Servlet来实现分发器),而分发器将请求URL映射到需要被执行的命令实例(Command Instance),命令实例在Struts中就是Action,如图3.3所示。

图3.3 Web世界中的MVC

Action与系统后端的服务进行交互,通常这些服务会组合在一起作为模型。命令实例在处理完业务逻辑之后返回一个码值,而这个返回码会映射到某一个视图(通常是一个Web页面模板,譬如JSP)。最后,结合控制器和模型,视图将会呈现给用户。通常视图会使用标签库,以便更便捷地访问数值。

3.3.2 前端控制器和页面控制器

MVC也不是一成不变的,一种稍微有些不同的MVC实现已经通过一些框架,譬如Microsoft的ASP.NET流行起来了。在这种MVC中,并不是令分发器去寻找一个控制器并执行之,而是直接到达视图并且在继续生成视图之前调用相应的控制器。与传统的MVC模式中的前端控制器对应,这种模式称为页面控制器。图3.4和图3.5展示了控制面板的两种实现。

下面介绍前端控制器实现和页面控制器实现之间的区别。由于A、B和C部分职责的分离,页面控制器可能看起来更加模块化一些,但是良好的面向对象设计也可以实现一个模块化的前端控制器。页面控制器描述的往往是同一个页面中(如类似于控制面板那样的页面)的处理逻辑,不能用于跨多个页面对处理过程进行控制或协调。

图3.4 前端控制器实现

图3.5 页面控制器实现

注意 Struts1采用的是前端控制器模式,而Struts2两种模式都支持。