[英]Contradictory explanations of MVC in JSF
我开始学习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
V IEW将
jsp
,XHTML
(当然,你可以在这里容纳各种观点)C ontroller将是
FacesServlet
这里 ,关于问题的另一种观点:
在JSF中,您没有实现控制器。 因此,支持bean或任何其他类型的托管bean 不是控制器。
还有一个 ,这次不是来自Stackoverflow:
在JSF中,主控制器始终是FacesServlet。 子控制器包含在各种控制元件标签实现中。 你几乎从不在JSF中编写控制器代码,因为它都是预先提供的。 因此,您只需提供视图模板(xhtml)和模型(支持bean)。
很多人认为支持bean的动作逻辑使它们成为控制器。 这是不正确的。 Controller是一个组件,其唯一目的是同步Model和View。 在JSF中,该任务由FacesServlet和控件执行。 您可能有验证器和转换器执行辅助功能,但实际的同步(更新)是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设计)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.