繁体   English   中英

JSF中MVC的矛盾解释

[英]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将jspXHTML (当然,你可以在这里容纳各种观点)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM