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