我将开始学习JSF,但是首先我想了解它作为MVC框架的概况。
有很多答案,其中有很多赞扬解释了JSF中的MVC层,但是它们通常是矛盾的。
BalusC的答案: JSF MVC框架中的MVC是什么组件?
在总体架构图中,您自己的JSF代码是 V : M- 业务域/服务层(例如EJB / JPA / DAO) V- 您的JSF代码 C -FacesServlet 在开发人员图中,体系结构 V 可以如下划分: M- 实体 V -Facelets / JSP页面 C- 托管bean
在总体架构图中,您自己的JSF代码是 V :
M- 业务域/服务层(例如EJB / JPA / DAO) V- 您的JSF代码 C -FacesServlet
在开发人员图中,体系结构 V 可以如下划分:
M- 实体 V -Facelets / JSP页面 C- 托管bean
Jigar Joshi在同一主题中的答案:
中号 奥德尔将是你的ManagedBean V iew是jsp,XHTML(那么您可以在此处容纳各种视图) ç ontroller会FacesServlet
中号 奥德尔将是你的ManagedBean
ManagedBean
V iew是jsp,XHTML(那么您可以在此处容纳各种视图)
jsp
XHTML
ç ontroller会FacesServlet
FacesServlet
在这里,关于该问题的另一种观点:
在JSF中,您无需实现控制器。因此,后备bean或任何其他类型的托管bean 都不 是控制器。
另一个不是这次的Stackoverflow:
在JSF中,主控制器始终是FacesServlet。子控制器已合并到各种控制元素标签实现中。您几乎永远不会在JSF中编写控制器代码,因为它们都是预先提供的。因此,您只需要提供View模板(xhtml)和Models(支持bean)。 许多人认为,支持bean的动作逻辑使它们成为Controller。这是不正确的。控制器是其生命中唯一的目的是同步模型和视图的组件。在JSF中,该任务由FacesServlet和控件执行。您可能让Validator和Converters执行辅助功能,但是实际的同步(更新)是JSF核心的一部分。
在JSF中,主控制器始终是FacesServlet。子控制器已合并到各种控制元素标签实现中。您几乎永远不会在JSF中编写控制器代码,因为它们都是预先提供的。因此,您只需要提供View模板(xhtml)和Models(支持bean)。
许多人认为,支持bean的动作逻辑使它们成为Controller。这是不正确的。控制器是其生命中唯一的目的是同步模型和视图的组件。在JSF中,该任务由FacesServlet和控件执行。您可能让Validator和Converters执行辅助功能,但是实际的同步(更新)是JSF核心的一部分。
我知道MVC有很多变体,具体取决于它是桌面应用程序,Web应用程序等。因此,很难定义MVC(尝试找到两个对MVC的解释相同的资源)。
我在这里最关心的是Managed bean。他们是M还是C?显然,托管bean用于从模型层(最高抽象层的模型层- 像BalusC的回答中那样是EJB,JPA和DAO的大体系结构图)检索数据,并存储结果以供视图使用。MVC中的控制器层是负责从视图中处理命令,与模型层进行通信并从模型层检索数据的层。受管bean是否用于与模型层通信?是的,它还使检索到的数据可用于视图。对我而言,它属于控制器层,而不是模型,因为它不包含用于检索数据或数据本身的逻辑,而仅调用适当的模型层方法。
那么,我困惑的根源是什么?任何人都可以一劳永逸地解释这一点,以便JSF初学者很清楚吗?
我在这里最关心的是Managed 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. } } } } // ... }
但是,当他们看起来像这样时,他们会认为它们是C:
@ManagedBean public class Bean { private User user // +getter @EJB private UserService userService; public void login() { if (userService.find(user) != null) { // Login. } } // ... }
您发现的MVC答案中也提到了这一点:
请注意,一些入门者,甚至某些(非常基础的)教程都将受管Bean中的实体属性混合/复制/展平,这将有效地使控制器成为模型。不用说这是较差的设计(即不是干净的MVC设计)。