在 JSF 和许多其他 Web 框架中通常不完全清楚它的哪些部分对应于 MVC 的哪个部分的部分原因是 MVC 模式最初是为桌面应用程序设计的。
在桌面应用程序中,节点 M、V 和 C 是最大连通图,这意味着每个部分都可以相互通信。例如,如果模型发生变化,它可以将此变化推送到视图。这在桌面应用程序中有多个视图表示的情况下尤其明显。更改一个,并实时查看另一个更新。
由于 Web 应用程序的客户端/服务器和请求/响应性质,经典 MVC 不会 1:1 映射到大多数 Web 框架。
具体来说,在 JSF 中,映射如下:
- 模型- 服务/DAO 以及它们生产和消费的实体。入口点是托管 bean,但在 Java EE(JSF 是其中的一部分)中,这些工件通常分别由 EJB 和 JPA 实现。
- 视图- 将 UI 组件及其组合成一个完整的页面。这完全属于 JSF 领域,分别由 JSF
UIComponent
和 Facelets 实现。
- 控制器- 处理来自用户的命令和传入数据的交通警察,将其路由到正确的部分并选择要显示的视图。在 JSF 中没有编写此控制器,但它已经由框架提供(它是
FacesServlet
.
尤其是最后一部分通常不是很容易理解:在 JSF 中,您不实现控制器。因此,支持 bean 或任何其他类型的托管 bean不是控制器。
第一部分(模型)也不总是被清楚地理解。业务逻辑可以由 EJB 和 JPA 实现,但从 JSF 的角度来看,值绑定所引用的一切都是模型。这也是 JSF 生命周期阶段之一的名称的来源:Update Model
. 在这个阶段,JSF 将数据从 UI 组件推送到模型中。从这个意义上说,(JSF)托管 bean 就是模型。
尽管 JSF 本身并没有明确定义这个概念,但托管 bean 有一个经常重复使用的特定用法,称为支持 bean。
对于 JSF,支持 bean 仍然是模型,但实际上它是位于模型、视图和控制器中间的管道元素。因为它执行一些可能被视为一些控制器任务的任务,所以这经常被误认为是控制器。但是,如前所述,这是不正确的。它还可以执行一些模型任务,偶尔也可以执行一些视图逻辑。
也可以看看: