16.2 模型2介绍
16.2 模型2介绍
模型2基于模型-视图-控制器
(MVC
)模式,该模式是Smalltalk-80
用户交互的核心概念,那时还没有设计模式的说法,当时称为MVC
范式。
一个实现MVC
模式的应用包含模型
、视图
和控制器
3个模块。
视图
负责应用的展示。模型
封装了应用的数据和业务逻辑。控制器
负责接收用户输入、改变模型以及调整视图的显示。
模型2中,Servlet
或者Filter
都可以充当控制器。几乎所有现代Web
框架都是模型2的实现。
Spring MVC
和Struts 1
使用一个Servlet
作为控制器,而Struts 2
则使用一个Filter
作为控制器。- 大部分都采用
JSP
页面作为应用的视图,当然也有其他技术。 - 而模型则采用
POJO
(Plain Old Java Object
)。
不同于EJB
等,POJO
是一个普通对象。实践中会采用一个JavaBean
来持有模型状态,并将业务逻辑放到一个Action
类中。一个JavaBean
必须拥有一个无参的构造器,通过getter/setter
方法来访问参数,同时支持持久化。
一个模型2应用的架构图如下图所示:
每个HTTP
请求都发送给控制器,请求中的URI
标识出对应的action
。action
代表了应用可以执行的一个操作。一个提供了Action
的Java
对象称为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
方法不是最后一行代码,则应显式地返回。