JSF是否支持MVVM设计模式?

时间:2013-11-12 09:28:42

标签: jsf design-patterns jsf-2

我现在在我的一个应用程序中使用ZK Framework。 ZK Framework支持MVC以及MVVM设计模式。现在我想用一个新项目来使用JSF。 JSF是支持设计模式还是只支持MVC?

2 个答案:

答案 0 :(得分:5)

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

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

  

MVVM中的第一个M代表Model,它与我们在MVC方法中使用的模型完全相同。事实上MVVM并没有取代MVC,我宁愿把它视为MVC的附加组件,所以这里没有什么新东西。

     

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

     

MVVM中的VM代表我们的客户端模型ViewModel。 ViewModel绑定到Model,但它只在客户端存在,尽管您可以随时在服务器端使用Model同步它。但更重要的是,您可以在客户端执行任何操作,而无需将回调发送到服务器。

     

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

来自Understanding JSF as a MVC framework

  

节点M,V和C是最大连通图,意味着每个部分可以与每个其他部分通信。例如。如果模型更改,它可以将此更改推送到视图。如果桌面应用程序中存在多个视图表示,则尤其可见。更改一个,并实时查看其他更新。

     

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

更多信息,请参阅此链接:http://www.tutorialspoint.com/jsf/jsf_architecture.htm

答案 1 :(得分:2)

我不同意user2860053的回答,因为它对MVVM做出了不必要的假设。 MVVM与客户端和服务器职责无关。引用的博客文章只是认为,涉及客户端 MVVM(作为knockout.js的实现)与服务器端MVVM的组合的特定Web应用程序场景与JSF不能很好地协作。它没有说服务器端MVVM的任何内容。

根据我的理解(哪个IMO对应original definition所引用的ZK documentation),MVVM的核心思想是:

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

形象地说,从" MVC"开始,部分a)添加" VM",部分b)删除" C"所以我们屈服于" MVVM":

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

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

那么这如何适用于JSF?

在JSF中,您不必为您编写的每个Facelets页面编写控制器,但让JSF生命周期完成使用提交的表单中的数据填充模型元素并根据用户调用方法的工作。根据EL绑定的动作,因此第二个属性b)始终适用于JSF。

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

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