这取决于观点(既有双关语的意味)。
在大的架构视角下,您自己的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方法:
在书籍Java EE 8中的JSF权威指南第8章“Backing Beans”,第276页和Jakarta EE 10中的Jakarta Faces权威指南第8章“Backing Beans”,第288页中,使用下面的维恩图来说明在JSF开发人员相关的MVC范例中,后备Bean在MVC范例中的位置。版权声明:以上书籍均由我编写,并由我创建了此图片。
模型将是您的ManagedBean
视图将是jsp
,XHTML
(您可以在此处适应各种视图)
控制器将是FacesServlet
更新,希望这张图片能更好地帮助你理解
FacesServlet
是一个控制器,那么我就不能扩展它。我不能有自己的控制器... 我同意 Shervin 的看法,Managed Beans 就是控制器。Shervin,你考虑发表自己的替代答案吗? - yegor256FacesServlet
,但它是隐蔽的。 - jmj面孔servlet管理面孔生命周期,因此在这个意义上它是控制器,结合您自己的代码,在每个生命周期阶段可能会被调用。
Java Server Faces是一个MVC Web框架,其中MVC组件如下:
模型 - 它是使用@ManagedBean注释的托管bean类,具有保存数据和相应getter和setter的属性。托管bean类还可以包含业务逻辑。这些也称为支持bean,可以具有不同的范围,如请求、会话、应用程序。
视图 - 显示给客户端的用户界面,即.xhtml文件。它从托管bean获取数据,并呈现为响应。
控制器 - javax.servlet.webapp.FacesServlet是集中式控制器类,基本上是一个servlet。任何请求首先进入JSF,然后进入FacesServlet控制器。与我们在JSP中编写自己的控制器类不同,在JSF中,控制器servlet是框架的固定部分,我们不编写它。
MVC流程-
<h:inputText value="#{register.username}">
而不是<h:inputText value="#{register.user.name}">
。 - BalusC