Model view controller MVC中模型与控制器的混淆

Model view controller MVC中模型与控制器的混淆,model-view-controller,Model View Controller,因此,我目前正在使用模型-视图-控制器体系结构实现一个java应用程序,但在从服务器检索数据时,在决定模型和控制器之间存在问题 如果我要为该服务器创建一个包含数据的客户机,那么模型是否负责从服务器检索数据,或者在这种情况下是控制器 例如,在GUI中,假设我输入了一个患者ID 453,我想让应用程序查找ID为453的患者的详细信息,在这种情况下,搜索操作是由模型执行还是由控制器执行?在我当前的实现中,我在模型中有一个从服务器检索数据的方法。以最简单的形式,您可以说模型负责数据的表示。MVC模式本身

因此,我目前正在使用模型-视图-控制器体系结构实现一个java应用程序,但在从服务器检索数据时,在决定模型和控制器之间存在问题

如果我要为该服务器创建一个包含数据的客户机,那么模型是否负责从服务器检索数据,或者在这种情况下是控制器


例如,在GUI中,假设我输入了一个患者ID 453,我想让应用程序查找ID为453的患者的详细信息,在这种情况下,搜索操作是由模型执行还是由控制器执行?在我当前的实现中,我在模型中有一个从服务器检索数据的方法。

以最简单的形式,您可以说模型负责数据的表示。MVC模式本身的定义并没有区分模型是否应该只充当数据结构,还是应该包含算法/逻辑来检索/更新/创建数据存储(例如数据库)中的数据表示形式

不同来源之间的
模型的定义肯定存在歧义。例如,如果您在wikipedia中查找MVC设计模式,您将看到以下模型定义:

图案的中心部分。它是应用程序的动态数据结构,独立于用户界面,直接管理应用程序的数据、逻辑和规则

然后,如果你看一个不同的来源,比如,它在某种程度上与维基百科的定义相矛盾,它说它没有逻辑,只是数据的一种表示

虽然我不打算评论哪个定义是正确的,但根据我在企业应用程序上的工作经验,我可以告诉您,当我们在谈论
MVC
体系结构时,几乎总是说
Model
,人们大多将其视为数据的表示。换句话说,他们谈论的是数据的结构。我相信这是思考模型对象的正确方式

以您的
患者
模型为例,这将是一个POJO,它以最简单的形式具有
私有字段
获取者
设置者

public class Patient {
    private int id;
    private String name;
    ...
    // more properties

    public int getId() {
        return this.id;
    }

    public String getName() {
        return this.name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }
因为您提到要从服务器检索数据,所以我假设数据存储在某个数据库中。因此,根据您用于将域模型(也称为模型对象)连接/映射到它们在数据库中的表示方式的技术,例如,您将向模型类添加注释,以告知对象关系映射器(ORM),模型对象中的特定字段映射到数据库表中的特定列。或者,根据库的不同,您也可能最终使用XML配置来进行映射。 这样,您就在
MVC
应用程序中创建了
模型

那么,您将在该模型上执行CRUD操作所需的所有逻辑/算法放在哪里?比如在您的示例中检索ID为453的
Pateint
?欢迎使用存储库模式。因此,
存储库模式
包含了用于检索数据的逻辑。在您的示例中,对患者的搜索(等同于从数据库检索患者数据)将位于存储库层或更常见的数据访问层

在Java世界(至少是w.r.t web技术)中,定义了由几个提供者(如Hibernate、OpenJPA)实现的查询模型。这就是存储库层中使用的内容。正是在这一层中,您添加了搜索逻辑

JPA规范的大多数实现已经附带了一些默认API,用于对模型对象执行简单的CRUD操作。我使用过Spring,在您的患者示例中,存储库如下所示:

public interface PatientRepository extends JpaRepository<Patient, Long> {
}
以及REST控制器的实现:

@Component
public class PatientControllerImpl implements PatientController {

    @Autowired
    PatientRepository pateintRepository;

    @Override
    public Patient getPatient(int id) {
        Patient patient = patientRepository.findById(id);
        return pateint;
    }
}
因此,如果您调用在服务器上运行的应用程序以获取患者ID 453的患者详细信息,它将类似于:

http://localhost:8080/patients/453

然后,控制器接收该信息,并调用
getPatient
方法。然后调用
PateintRepository
findById
方法,该方法将与数据库对话,获取ID=453的患者详细信息,构建
Patient
模型对象并返回控制器

然后,控制器将此模型对象绑定到视图,并以请求的任何形式将其传递回客户端

当然,这并不是所有的最佳实践。但是,它应该能让你很好地了解所有的部分在哪里以及如何组合在一起

有很多关于构建MVC应用程序的文章。我建议您从演示Spring MVC应用程序开始。
我还建议阅读构建web应用程序的经典三层体系结构。一旦您了解了这一点,您将能够了解更多关于MVC的信息。

因此,另一个模型需要访问类似的搜索功能,您是否将您的模型与搜索一起引用到一个新的模型?我的印象是模型可以装饰但不包含任何功能,但我可能错了。@RossBush那么在这种情况下,所有搜索和检索数据的操作都是由控制器执行的?在这种情况下,模型将只是患者的对象创建者,包含控制器检索到的详细信息?这是我阅读它的方式。模型可以跨技术边界重用,并在它们所建模的实体发生更改(如乒乓球)时更新。也许我的观点有点简单化,但唯一的答案是我们
@Component
public class PatientControllerImpl implements PatientController {

    @Autowired
    PatientRepository pateintRepository;

    @Override
    public Patient getPatient(int id) {
        Patient patient = patientRepository.findById(id);
        return pateint;
    }
}