Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF中MVC的矛盾解释_Java_Jsf_Model View Controller - Fatal编程技术网

Java JSF中MVC的矛盾解释

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

我想开始学习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
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设计)

另见:

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方法中,是否总是希望或期望创建
新实体()