小编典典

JSF中MVC的矛盾解释

java

我将开始学习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

Jigar Joshi在同一主题中的答案:

中号 奥德尔将是你的ManagedBean

V iew是jspXHTML(那么您可以在此处容纳各种视图)

ç ontroller会FacesServlet

在这里,关于该问题的另一种观点:

在JSF中,您无需实现控制器。因此,后备bean或任何其他类型的托管bean 都不 是控制器。

另一个不是这次的Stackoverflow:

在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初学者很清楚吗?


阅读 223

收藏
2020-11-16

共1个答案

小编典典

我在这里最关心的是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设计)。

2020-11-16