Java JSF中MVC的矛盾解释
我想开始学习JSF,但首先我想了解它作为MVC框架的总体情况 有很多答案解释了JSF中的MVC层是什么,但它们通常自相矛盾 巴卢斯克的回答是: 在总体架构图中,您自己的JSF代码是V: M-业务域/服务层(如EJB/JPA/DAO)Java JSF中MVC的矛盾解释,java,jsf,model-view-controller,Java,Jsf,Model View Controller,我想开始学习JSF,但首先我想了解它作为MVC框架的总体情况 有很多答案解释了JSF中的MVC层是什么,但它们通常自相矛盾 巴卢斯克的回答是: 在总体架构图中,您自己的JSF代码是V: M-业务域/服务层(如EJB/JPA/DAO) V-您的JSF代码 C-FacesServlet 在开发者图片中,架构V依次可划分 详情如下: M-实体 V-Facelets/JSP页面 C-托管bean Jigar Joshi用同样的思路回答: Model将是您的ManagedBean V视图将是jsp,XH
V-您的JSF代码
C-FacesServlet 在开发者图片中,架构V依次可划分 详情如下: M-实体
V-Facelets/JSP页面
C-托管bean Jigar Joshi用同样的思路回答: Model将是您的
ManagedBean
V视图将是jsp
,XHTML
(您可以在这里容纳各种视图)
C控制器将是FacesServlet
,对这个问题的另一种看法:
在JSF中,您没有实现控制器。因此,支持bean
或者任何其他类型的托管bean不是控制器
,这次不是从Stackoverflow:
在JSF中,主控制器总是FacesServlet。
子控制器包含在各种控制元件标签中
实现。您几乎从不使用JSF编写控制器代码,
因为都是预先准备好的。因此,您只需提供视图
模板(xhtml)和模型(支持bean)
很多人认为支持bean中的动作逻辑
他们是控制器。这是不正确的。控制器是一个组件,其
生命中唯一的目的就是同步模型和视图。在JSF中,
该任务由FacesServlet和控件执行。你可以
让验证器和转换器执行附加功能,但
实际同步(更新)是JSF核心的一部分
我知道MVC有很多变体,这取决于它是否是桌面应用程序、web应用程序等。因此很难定义MVC(尝试找到两个对MVC有相同解释的源代码)
我最关心的是这里的托管bean。他们是M还是C?托管bean显然用于从模型层(最高抽象级别上的模型层——如BalusC的回答中所示的大架构图,即EJB、JPA和DAO)检索数据,并存储视图使用的结果。MVC中的控制器层负责处理来自视图的命令、与模型层通信以及从模型层检索数据。托管bean是否用于与模型层通信?是的,它还使检索到的数据可用于视图。对我来说,它属于控制器层,而不是模型,因为它不包含用于检索数据或数据本身的逻辑,只调用适当的模型层方法(请看一看)
那么,我困惑的根源是什么?有人能一劳永逸地解释一下这一点,让JSF初学者明白吗
我最关心的是这里的托管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.
}
}
// ...
}
但是人们认为他们看起来像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设计)
另见:
M=managedbean(数据),V=Page(视图),C=FacesServlet(呈现控制器)
,而从应用程序的角度来看,您可以说M=application model,例如EJBs+实体,V=Page,C=managedbean,它在模型和视图之间进行调解
-实际上,您甚至可以在系统级别及更高级别应用MVC,例如M=数据库,V=用户界面,C=应用程序逻辑
。我认为主要问题在于MVC没有一个明确的定义:MVC有多种方法,根据上下文的不同,您的每一次引用都是正确的。@Thomas注意到您提供了两个答案,基于两种不同的观点,他们都不同意我所联系到的任何答案!这就是我想指出的:如果你有不同的观点,你会得到不同的答案和映射。在这种情况下,观点就是“Web应用程序”的观点。然后MVC指的是Web/Presentación层。V代表页面,C代表FacesServlet,M代表Web层中管理的数据。关于M:它可以是来自业务层的实体或纯表示数据,例如,支持bean中的两个整数属性定义了搜索页面中业务实体bean字段的搜索间隔。因此,托管bean最好是控制器。呃,你说的扁平化实体的属性是什么意思?这是您的第一个代码示例吗?用户可能有用户名和密码属性,但不是保留用户,而是提取属性并存储为字段?但不管怎样,这句话怎么说:“很多人认为,支持bean的操作逻辑使它们成为控制器。这是不正确的。这是错误的吗?扁平化是向bean添加委托getter,比如公共字符串getUsername(){return user.getName()}
,并使用{bean.username}
而不是{bean.user.name}
。至于这句话,从技术上讲确实是正确的。在真正的MVC方法中,是否总是希望或期望创建新实体()