JSF中MVC的矛盾解释

时间:2015-09-24 08:49:18

标签: java jsf model-view-controller

我开始学习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将是jspXHTML(您可以在此处提供各种观点)

     

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的初学者明白这一点吗?

1 个答案:

答案 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设计)。

另见: