java - 将 JSF 理解为 MVC 框架

标签 java jsf jakarta-ee model-view-controller

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

我看了这个问题:What components are MVC in JSF MVC framework?

如果您不在聚合 View 中查看它,我会读到那里,模型是您的实体, View 是您的 XHTML 代码, Controller 是托管 bean。嗯...好吧,但是 View 不是经常依赖于执行进一步的业务逻辑调用,例如返回一组实体,描述是否仍然合适?

我读过的一本书将其描述为托管 bean 是 Faces Servlet( Controller )用来调用业务层(模型)的某种“消息”传递器,然后 XHTML 代码就是 View 。

有太多的解释和不同之处,所以我不知道是哪一个或如何理解它。

最佳答案

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

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

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

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

  • 模型 - 服务/DAO 以及它们生产和消费的实体。入口点是托管 bean,但在 Java EE(JSF 是其中的一部分)中,这些工件通常分别由 EJB 和 JPA 实现。
  • View - 将 UI 组件及其组合成一个完整的页面。这完全属于 JSF 领域,分别由 JSF UIComponents 和 Facelets 实现。
  • Controller - 处理来自用户的命令和传入数据的交通警察,将其路由到正确的部分并选择要显示的 View 。在 JSF 中没有编写此 Controller ,但它已经由框架提供(它是 FacesServlet)。

尤其是最后一部分通常不太好理解:在 JSF 中,您不实现 Controller 。因此,支持 bean 或任何其他类型的托管 bean 不是 Controller 。

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

虽然 JSF 本身并没有明确定义这个概念,但托管 bean 有一个经常重复使用的特定用法,称为 backing bean

对于 JSF,支持 bean 仍然是模型,但实际上它是位于模型、 View 和 Controller 中间的管道元素。因为它执行一些可能被视为一些 Controller 任务的任务,所以这经常被误认为是 Controller 。但是,如前所述,这是不正确的。它还可以执行一些模型任务,偶尔也可以执行一些 View 逻辑。

另见:

关于java - 将 JSF 理解为 MVC 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10111387/

相关文章:

java - 如何将嵌入元素类型从 PDF 流切换到文本流

java - 使用 Ant 的 Jacoco 覆盖和报告任务

java - Maven 选择了错误的资源路径

java - @LazyCollection(LazyCollectionOption.FALSE) 和@OneToMany(fetch = FetchType.EAGER) 之间的区别

javascript - 仅阻止 $ 和 的退格键和删除

jakarta-ee - 使用 maven-surefire-plugin 或 maven-failsafe-plugin 运行 Selenium 测试?

java - 使用 Java 库的 Scala 不指定集合的​​类型参数

java - 在类文件中查找对其他类的引用的简单方法

java - 循环语句后未调用代码

JavaEE CDI 和 JAXRS 注入(inject) @Provider 会产生 UnsatisfiedDependencyException