2

我现在在我的一个应用程序中使用 ZK 框架。ZK 框架支持 MVC 以及 MVVM 设计模式。现在对于一个新项目,我想使用 JSF。JSF 支持这两种设计模式还是只支持 MVC?

4

2 回答 2

5

不,jsf 不支持 MVVM 设计模式,仅 MVC 支持。它仅用于桌面应用程序。JSF 也称为 MVC fremework。

来自http://blog.oio.de/2011/12/05/jsf-and-mvvm/

MVVM 中的第一个 M 代表模型,它与我们在 MVC 方法中使用的模型完全相同。事实上 MVVM 并没有取代 MVC,我更愿意把它看作是 MVC 的一个补充,所以这里没有什么新东西。

MVVM 中的第一个 V 代表 View,同样,这部分没有什么新东西。它是负责客户端表示的组件。因此,我们的视图不会有任何显着变化,因为我们将继续使用 Facelets 定义它们。

MVVM 中的 VM 代表 ViewModel,我们的客户端模型。ViewModel 绑定到模型,但它只存在于客户端,尽管您可以随时与服务器端的模型自由同步。但是,更重要的是,您可以在客户端做任何您想做的事情,而无需向服务器发送回调。

首先,我们需要支持 MVVM 概念的下一代 JSF 实现。ViewModel 将由这个尚未到来的 JSF 实现创建,然后再将请求的视图交付给客户端。我们的 ViewModel 将由一个或多个构成模型的 JSF 托管 Bean 创建。我可以想到一组很好的类和字段级别的注释来告诉 JSF 我们模型的哪些部分应该构成客户端的 ViewModel。一旦视图交付给客户端,ViewModel 将在表单提交时由客户端脚本操作。然后,在请求处理生命周期的下一个迭代中,JSF 必须处理 ViewModel 和 Model 之间的重新同步。诚然,这可能是最棘手的部分,但我相信 Next-Gen JSF Impl 将设法做到这一点;-)

将 JSF 理解为 MVC 框架

节点 M、V 和 C 是最大连通图,这意味着每个部分都可以与其他部分进行通信。例如,如果模型发生变化,它可以将此变化推送到视图。这在桌面应用程序中有多个视图表示的情况下尤其明显。更改一个,并实时查看另一个更新。

由于 Web 应用程序的客户端/服务器和请求/响应性质,经典 MVC 不会 1:1 映射到大多数 Web 框架。

更多信息可以找到这个链接:http ://www.tutorialspoint.com/jsf/jsf_architecture.htm

于 2013-11-12T17:20:52.240 回答
2

我不同意 user2860053 的回答,因为它对 MVVM 做出了不必要的假设。MVVM 与客户端和服务器的职责无关。引用的博客文章仅认为涉及客户端MVVM(由 knockout.js 实现)与服务器端 MVVM 组合的特定 Web 应用程序场景不适用于 JSF。它没有说明服务器端 MVVM。

在我的理解(哪个IMO对应的原始定义也被ZK文档引用),MVVM的核心思想是:

  • a) 区分 UI 的具体结构、控件和布局(即视图)及其状态和行为(即视图模型),以及
  • b) 使用双向数据绑定链接这些。

形象地说,从“MVC”开始,a)部分添加了“VM”,b)部分删除了“C”,所以我们得到“MVVM”:

在 MVC 中,控制器是为特定的视图类/接口编写的,控制器负责从视图中读取用户输入,将其转换并写入模型,并根据用户的操作调用业务逻辑。

相比之下,MVVM 没有任何与视图或模型紧密耦合的控制器。取而代之的是一种通用机制,它使用声明性双向数据绑定来用数据填充视图转换用户输入并将其提供给模型,并将控件绑定到业务代码(或视图模型中的仅表示操作)。

那么这如何应用于 JSF 呢?

在 JSF 中,您不会为您编写的每个 Facelets 页面编写一个控制器,而是让 JSF 生命周期完成从提交的表单中填充模型元素的工作,并根据 EL 绑定根据用户的操作调用方法,所以第二个属性 b) 始终适用于 JSF。

至于第一个属性 a),由程序员在不同的类中实现高级视图状态和行为。JSF 更加关注为视图状态和行为创建组件。Viewmodels 是专门为一种视图制作的,对视图的整个抽象状态和行为进行建模,所以我认为即使是“轻量级”的复合组件也太通用了,无法充当视图模型的角色。但是没有什么可以阻止开发人员为此创建自己的类,即编写自己的视图模型类并将它们绑定到 EL 上下文中。

总之,JSF 并不是专门为 MVVM 制作的,而是包含可用于实现(服务器端)MVVM 的机制。

于 2016-05-04T16:34:42.603 回答