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将是jspXHTML (你可以在这里容纳各种视图)

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页面