JSF MVC框架中的MVC组件有哪些?

101
在JSF MVC框架中,谁是模型、视图和控制器?
4个回答

158

这取决于观点(既有双关语的意味)。

在大的架构视角下,您自己的JSF代码是V

M - 业务领域/服务层(例如EJB/JPA/DAO)
V - 您的JSF代码
C - FacesServlet

在开发者视角下,架构中的V可以分解如下:

M - 实体
V - Facelets/JSP页面
C - 托管bean

在较小的客户端视角下,开发者的V可以分解如下:

M - JSF组件树
V - 渲染的HTML输出
C - 客户端(Web浏览器)

在更小的JavaScript视角下,客户端的V可以分解如下:

M - HTML DOM树
V - 可视化呈现
C - 事件监听函数(终端用户交互和Ajax)

因此,它基本上是M(M(M(MVC)C)C)C ;)

请注意,一些入门教程甚至会将实体的属性混合/复制/展开到托管bean中,这会有效地使控制器成为模型。毫无疑问,这是一种不良设计(即不是干净的MVC设计)。

以下答案中的代码片段说明了正确的MVC方法:

  • 将JSF2托管的POJO bean传递到EJB或将所需内容放入传输对象
  • 过滤器不初始化EntityManager
  • 小型Facelet应用程序中的javax.persistence.TransactionRequiredException
  • 在书籍Java EE 8中的JSF权威指南第8章“Backing Beans”,第276页和Jakarta EE 10中的Jakarta Faces权威指南第8章“Backing Beans”,第288页中,使用下面的维恩图来说明在JSF开发人员相关的MVC范例中,后备Bean在MVC范例中的位置。版权声明:以上书籍均由我编写,并由我创建了此图片。

    enter image description here


    2
    没听懂这个双关语,但我还是点了一个赞。 - Nick Russler
    @JeffLee 在我的工作中,我们认为托管的 Bean 控制 XHTML 视图。托管的 Bean 可以与模型代码交互,根据视图的需要获取和保存实体。 - djeikyb
    5
    @Jeff:只有在将模型属性混合其中时才会出现这种情况,例如使用<h:inputText value="#{register.username}">而不是<h:inputText value="#{register.user.name}"> - BalusC
    完全同意这个答案,对@Jigar的回答有所损害。在我看来,托管bean不仅仅是一个模型,它们更像是FacesServlet的扩展,所有的交互都发生在这里。此外,它们能够保存状态,但更像C而不是M。 - Aritz
    我在控制器中为什么要使用@Model注释? - K.Nicholas
    显示剩余2条评论

    36

    模型将是您的ManagedBean

    视图将是jspXHTML(您可以在此处适应各种视图)

    控制器将是FacesServlet

    更新,希望这张图片能更好地帮助你理解

    输入图片描述


    4
    +1,很有道理。尽管我可能会说您的模型是实体(如果您有任何实体),而控制器是托管Bean(除了FacesServlet之外)。 - Shervin Asgari
    @Jigar 嗯,如果 FacesServlet 是一个控制器,那么我就不能扩展它。我不能有自己的控制器... 我同意 Shervin 的看法,Managed Beans 就是控制器。Shervin,你考虑发表自己的替代答案吗? - yegor256
    1
    它是控制的 FacesServlet,但它是隐蔽的。 - jmj
    4
    卧底FacesServlet从请求、会话、应用程序上下文中接收所有数据(在上一层中称为bean),并对其进行处理。 - jmj
    图片来源 - Buhake Sindi
    显示剩余4条评论

    4

    -1

    Java Server Faces是一个MVC Web框架,其中MVC组件如下:

    1. 模型 - 它是使用@ManagedBean注释的托管bean类,具有保存数据和相应getter和setter的属性。托管bean类还可以包含业务逻辑。这些也称为支持bean,可以具有不同的范围,如请求、会话、应用程序。

    2. 视图 - 显示给客户端的用户界面,即.xhtml文件。它从托管bean获取数据,并呈现为响应。

    3. 控制器 - javax.servlet.webapp.FacesServlet是集中式控制器类,基本上是一个servlet。任何请求首先进入JSF,然后进入FacesServlet控制器。与我们在JSP中编写自己的控制器类不同,在JSF中,控制器servlet是框架的固定部分,我们不编写它。

    MVC流程-

    enter image description here


    这与获得36个赞的问题完全相同。如果您认为答案可以更清晰明了,请编辑它。 - Kukeltje
    @Kukeltje 我相信我的答案有更多的解释,而不仅仅是命名MVC组件。 - Hetal Rachh
    很少更多的解释... 1:不是真的因为“包含数据”不是最好的事情(应该在实体中),业务逻辑也不是最好的事情,因为这些应该在服务中(请参见最受欢迎答案中的其他链接),2:没有太多的东西,3:有一点更多的文本,但缺少其他答案的图像,这使得比您添加的文本更清晰... - Kukeltje
    @Kukeltje 谢谢,但我只是JSF的初学者。 - Hetal Rachh
    没问题。我已经使用它很长时间了,取得了巨大的成功。获取Bauke Scholtz和Arjan Thijms编写的Java EE 8和JSF书籍。这是一本非常好的阅读和教程,但也要阅读Stackoverflow中所有获得超过25个赞的问答,记住它们的存在,并从JSF 2.3开始学习。 - Kukeltje

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接