我开始学习JSF,但首先我想了解它作为MVC框架的大局。
有许多答案,许多赞成票解释了JSF中的MVC层,但它们通常是矛盾的。
BalusC的回答: What components are MVC in JSF MVC framework?
在大型建筑图片中,您自己的JSF代码是 V :
M - 业务领域/服务层(例如EJB / JPA / DAO)
V - 您的JSF代码
C - FacesServlet在开发者图片中,建筑 V 又可以分割 如下:
M - 实体
V - Facelets / JSP页面
C - 托管bean
Jigar Joshi在同一主题中回答:
M odel将是您的
ManagedBean
V iew将是
jsp
,XHTML
(您可以在此处提供各种观点)C ontroller将为
FacesServlet
Here,关于问题的另一种观点:
在JSF中,您没有实现控制器。因此,一个支持bean 或任何其他类型的托管bean 不控制器。
Yet another,这次不是来自Stackoverflow:
在JSF中,主控制器始终是FacesServlet。 子控制器包含在各种控制元件标签中 实现。你几乎从不在JSF编写控制器代码, 因为它都是预先提供的。所以你只需提供视图 templates(xhtml)和Models(支持bean)。
很多人认为支持bean的动作逻辑会产生 他们控制器。这是不正确的。 Controller是一个组件 生活中唯一的目的是同步模型和视图。在JSF中, 该任务由FacesServlet和控件执行。你可以 有验证器和转换器执行辅助功能,但是 实际同步(更新)是JSF核心的一部分。
我知道MVC有很多变种,这取决于它是否是桌面应用程序,Web应用程序等等。因此很难定义MVC(尝试找到两个具有相同MVC解释的源代码)。
我最关心的是托管bean。他们是M还是C?托管bean显然用于从Model层(最高抽象层上的Model层 - 在BalusC的答案中的大型架构图片,即EJB,JPA和DAO)中检索数据,并存储视图使用的结果。 MVC中的控制器层负责处理来自视图的命令,与模型层通信以及从模型层检索数据。托管bean是否用于与Model层通信?是的,它还使检索到的数据可用于视图。对我而言,它属于控制器层,而不是模型,因为它不包含用于检索数据的逻辑或数据本身,而只调用适当的模型层方法(请查看BalusC's code sample)。
那么我混淆的原因是什么?任何人都可以一劳永逸地解释这一点,以便JSF的初学者明白这一点吗?
答案 0 :(得分:2)
我在这里主要关注托管bean。他们是M还是C?
当他们看起来像这样时,人们会认为他们是:
@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设计)。