JSF中MVC的矛盾解释
我开始学习JSF,但首先我想了解它作为MVC框架的大局。
有许多答案,许多upvotes解释了JSF中的MVC层,但它们通常自相矛盾。
BalusC的回答: JSF MVC框架中的MVC是什么组件?
在大型架构图片中,您自己的JSF代码是V :
M – 业务域/服务层(例如EJB / JPA / DAO)
V – 您的JSF代码
C – FacesServlet在开发人员图片中,建筑V依次可分为如下:
M – 实体
V – Facelets / JSP页面
C – 管理的bean
Jigar Joshi在同一主题中的答案:
M
ManagedBean
将是您的ManagedBean
View将是
jsp
,XHTML
(你可以在这里容纳各种视图)C ontroller将是
FacesServlet
这里 ,关于问题的另一种观点:
在JSF中,您没有实现控制器。 因此,支持bean或任何其他类型的托管bean 不是控制器。
还有一个 ,这次不是来自Stackoverflow:
在JSF中,主控制器始终是FacesServlet。 子控制器被合并到各种控制元件标签实现中。 你几乎从不在JSF中编写控制器代码,因为它都是预先提供的。 因此,您只需提供视图模板(xhtml)和模型(支持bean)。
很多人认为支持bean的动作逻辑使它们成为控制器。 这是不正确的。 Controller是一个组件,其唯一目的是同步Model和View。 在JSF中,该任务由FacesServlet和控件执行。 您可能有validation器和转换器执行辅助function,但实际的同步(更新)是JSF核心的一部分。
我知道MVC有很多变种,取决于它是否是桌面应用程序,Web应用程序等。所以很难定义MVC(尝试找到两个具有相同MVC解释的源)。
我最关心的是托管bean。 他们是M还是C? 托管bean显然用于从Model层(最高抽象层上的Model层 – 在BalusC的答案中的大型架构图片,即EJB,JPA和DAO)中检索数据,并存储视图使用的结果。 MVC中的控制器层负责处理来自视图的命令,与模型层通信以及从模型层检索数据。 托管bean是否用于与Model层通信? 是的,它还使检索到的数据可用于视图。 对我而言,它属于控制器层,而不是模型,因为它不包含用于检索数据的逻辑或数据本身,而只调用适当的模型层方法(请参阅BalusC的代码示例 )。
那么我的困惑是什么原因呢? 任何人都可以一劳永逸地解释这一点,以便JSF的初学者明白这一点吗?
我最担心的是托管bean。 他们是M还是C?
人们认为他们M看起来像这样:
@ManagedBean public class Bean { private String username; // +getter+setter private String password; // +getter+setter @Resource private DataSource dataSource; public void login() { try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM User WHERE username = ? AND password = MD5(?)"); ) { statement.setString(1, username); statement.setString(2, password); try (ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { // Login. } } } } // ... }
但人们认为他们看起来像这样:
@ManagedBean public class Bean { private User user // +getter @EJB private UserService userService; public void login() { if (userService.find(user) != null) { // Login. } } // ... }
您在以下相同的MVC答案中也提到了这一点:
请注意,一些启动器甚至一些非常基本的教程在托管bean中混合/复制/展平实体的属性,这将有效地使控制器成为模型。 不用说这是糟糕的设计(即不是一个干净的MVC设计)。
也可以看看:
- 我们的JSF wiki页面