16.2 模型2介绍

16.2 模型2介绍

模型2基于模型-视图-控制器MVC)模式,该模式是Smalltalk-80用户交互的核心概念,那时还没有设计模式的说法,当时称为MVC范式。
一个实现MVC模式的应用包含模型视图控制器3个模块

  • 视图负责应用的展示。
  • 模型封装了应用的数据和业务逻辑。
  • 控制器负责接收用户输入、改变模型以及调整视图的显示。

模型2中,Servlet或者Filter都可以充当控制器。几乎所有现代Web框架都是模型2的实现。

  • Spring MVCStruts 1使用一个Servlet作为控制器,而Struts 2则使用一个Filter作为控制器
  • 大部分都采用JSP页面作为应用的视图,当然也有其他技术。
  • 而模型则采用POJOPlain Old Java Object)。

不同于EJB等,POJO是一个普通对象。实践中会采用一个JavaBean来持有模型状态,并将业务逻辑放到一个Action类中。一个JavaBean必须拥有一个无参的构造器,通过getter/setter方法来访问参数,同时支持持久化。

一个模型2应用的架构图如下图所示:

这里有一张图片

每个HTTP请求都发送给控制器,请求中的URI标识出对应的actionaction代表了应用可以执行的一个操作。一个提供了ActionJava对象称为action对象。一个action类可以支持多个actions或者一个action

看似简单的操作可能需要多个action。如,向数据库添加一个产品,需要两个action
(1)显示一个“添加产品”的表单,以便用户能输入产品信息。
(2)将表单信息保存到数据库中。
如前述,我们需要通过URI方式告诉控制器执行相应的action。例如,通过发送类似如下URI,来显示“添加产品”表单:

1
http://domain/appName/product_input

通过类似如下URI,来保存产品:

1
http://domain/appName/product_save

控制器会解析URI并调用相应的action,然后将模型对象放到视图可以访问的区域(以便服务端数据可以展示在浏览器上)。最后,控制器利用RequestDispatcher跳转到视图(JSP页面)。在JSP页面中,用表达式语言以及定制标签显示数据。
注意
调用RequestDispatcher.forward方法时,剩余的代码并不会停止执行。因此,若forward方法不是最后一行代码,则应显式地返回。