将JSF理解为一个MVC框架

我正在阅读JSF,我感到相当困惑,为什么JSF是一个MVC框架(或至less哪些部分属于哪个“字母”)。

我看了这个问题: JSF MVC框架中的MVC是什么组件?

我在那里阅读,如果你不看它在一个聚合的看法模型是你的实体,视图是你的XHTML代码和控制器是托pipe的bean。 嗯…好吧,但是这个视图往往不依赖于进一步的业务逻辑调用,例如返回一组实体,这个描述是否合适呢?

我读过的一本书描述为托pipebean是Faces Servlet(Controller)用来调用业务层(Model),然后XHTML代码是视图的某种“消息”使者。

有太多的解释和分歧,所以我不知道该怎么理解。

JSF和许多其他部分对应于MVC的哪一部分的Web框架中,通常不完全清楚的部分原因是,MVC模式最初是为桌面应用程序devise的。

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

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

具体来说,在JSF中映射如下:

  • 模型 – 服务/ DAO加上他们生产和消费的实体。 入口点是托pipebean,但在Java EE(其中JSF是其中的一部分)中,这些工件通常分别由EJB和JPA实现。
  • 查看 – 将UI组件及其组成整个页面。 这完全在JSF的领域,分别由JSF UIComponent和Facelets实现。
  • 控制器 – 处理命令和来自用户的input数据的交通警察,将其路由到正确的部分并select一个视图进行显示。 在JSF中,不会写这个控制器,但它已经由框架提供(这是FacesServlet )。

特别是最后一部分经常不是很好理解:在JSF中,你没有实现一个控制器。 因此,支持bean或任何其他types的pipe理bean 不是控制器。

第一部分(模型)也并不总是清楚的理解。 业务逻辑可以由EJB和JPA来实现,但是从JSF的angular度来看,所有被值绑定引用的东西都是模型。 这也是其中一个JSF生命周期阶段的名称来自: Update Model 。 在这个阶段,JSF将来自UI组件的数据推送到模型中。 从这个意义上说,(JSF)托pipe的bean就是这个模型。

虽然JSF本身并没有明确定义这个概念,但是被称为backing bean的被pipe理bean经常被重复使用。

对于JSF来说,支持bean仍然是模型,但实际上它是位于模型,视图和控制器中间的一个pipe道元素。 因为它执行一些可能被看作是一些控制器任务的任务,所以这经常被误认为是控制器。 但是,如前所述,这是不正确的。 它也可以执行一些模型任务,偶尔也可以执行一些视图逻辑。

也可以看看:

  • MVC模式相对于老式的三层模式有什么主要优势?
  • JavaServer Faces的MVC架构(第4.3章)

以简约的forms,它是:

  • 模型:任何你用于持久化(Hibernate,JPA等)和数据build模(Java Beans)。
  • 查看:xhtml,jsp等
  • 控制器:Mananaged豆。

JSF为您提供了控制请求/响应的能力。 您创build模型/视图的方式并不直接连接到框架MVC概念。 这只是一个select的问题。 MVC概念与代码组织有关。

类似的Struts是一个MVC框架,但它主要作为一个控制器。

我想我帮助你更好地阐明你的想法。

关于托pipebean想法的一个有趣的事情是它既可以用作模型(MVC模式),也可以用作控制器( 调解控制器MVC模式 ,也称为模型视图适配器),其中模型和视图不会交互直。

在后一种情况下,路由机制不是控制器,因为业务逻辑包含在托pipebean中,并且模型是严格的域模型。 然后我们有:

  • 模型 – 包含域模型,在大多数情况下代表数据库中的表,通过DAO持久化。

  • 查看 – 连接到bean的ui组件;

  • Controller(控制器) – 包含业务逻辑并处理视图和模型之间通信的托pipebean。

我认为有些人将中介控制器MVC混淆为普通的MVC,导致遇到不同的解释。

我认为,这里的所有船员都是正确的。 但混淆的主要原因是将来自框架(这里是JSF)的mvc组件的定义与您在应用程序devise中定义的模型和控制器组件混合在一起:

假设您从JSF更改为业务应用程序中的任何其他Web UI框架:您仍将拥有“业务模型”和“业务控制器”。 (在我们的项目中,我们将这些组件称为“模型”和“过程”。)

这意味着什么:或者你不能使用mvc来描述整个应用程序体系结构,而只能用于UI,或者你可能不得不接受许多控制器,像完整应用程序堆栈中的组件那样的模型。