MVC pattern
最近要做Web开发,需要按照MVC模式进行,将其记录在此。本文中介绍的MVC模式,均以Web开发为例。
MVC的概念
全名为Model-View-Controller Pattern,是模型(model)-视图(view)-控制器(controller)的缩写。它是一种软件设计典范,将一个应用的代码按照业务逻辑、数据、界面显示分成三个逻辑部分,从而实现对程序结构解耦的目的。MVC主要?被应用于输入、处理和输出功能都在一个逻辑的图形化用户界面中的结构。
内容
model是指业务模型——数据库表中的数据结构
专注于对接数据的?每一个基本功能点的实现。以功能为划分标准,将程序中会用到所有功能,以高内聚、低耦合的开发要求,划归到各个类中。举例来说,实现getUserName()的功能,那么哪一个变量是该功能应返回的呢,是name1还是name2?由本部分决定。
自认包括开发代码package中的Entity包和Dao包,如下所示。
Entity包
用于存放数据库中数据的实体类,与数据库中的属性值应基本保持一致。负责实现——数据库中数据与程序中变量间对应关系的——set和get的方法。
public class User {
/* 用户id */
private Long id;
/* 获取用户id */
public Long getId() {
return id;
}
/* 设置用户id */
public void setId(Long id) {
this.id = id;
}
}
Dao包(data access object,数据访问层)
用于封装与数据库进行联络的一些任务,负责接收最终的 sql 语句,具体到对于某个表、某个实体的增删改查。
view是指用户界面——前端
专注于与数据接收、数据展示相关的UI功能实现,主要负责数据的可视化工作,比如输入、输出功能。
Page包
controller是指控制器——后端业务处理
负责view模块与model模块间读存关系的具体实现,而非业务逻辑,从而将mode层l和view层分离。比如,model层负责getUserName,但按照程序规划,获取用户名需要验证授权码,则control层的函数在调用model层的getUserName前,还要将核对授权码一同封装在内。controller同时作用于model和view,详细见下方示例。Model类和View类均提供调用接口,Controller类通过调用这些接口来获取数据并控制两者执行相应操作。在开发过程中,直接调用controller的方法即可,而不需要使用到model和view层。更简单的说,controller本身不输出任何东西、不做任何处理,只是接收请求并决定调用哪个模型来处理,然后再确定用哪个视图来显示返回的数据,即控制数据流向model对象,并在数据变化时更新view。
自认包括开发代码package中的Entity包和Dao包,如下所示。
Controller包
负责具体的业务模块流程的控制,在此层要调用service层的接口来控制业务流程,控制的配置也同样是在Spring的配置文件里进行,针对具体的业务流程,会有不同的控制器。这样不仅使具体的业务流程程序结构变得清晰,也大大减少了代码量。
Service包(业务层)
分为两个包com.jeecg.demo.service和com.jeecg.demo.service.impl组成。
com.jeecg.demo.service
存放接口
com.jeecg.demo.service.impl
实现接口
示例
示例一
//model模块
public class Student {
private String rollNo;
private String name;
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//view模块,为了说明的直观和简明,仅实现了输出功能
public class StudentView {
public void printStudentDetails(String studentName, String studentRollNo){
System.out.println("Student: ");
System.out.println("Name: " + studentName);
System.out.println("Roll No: " + studentRollNo);
}
}
//control模块,负责控制view模块与model模块间的读存逻辑,而非业务逻辑。
public class StudentController {
private Student model;
private StudentView view;
public StudentController(Student model, StudentView view){
this.model = model;
this.view = view;
}
public void setStudentName(String name){
model.setName(name);
}
public String getStudentName(){
return model.getName();
}
public void setStudentRollNo(String rollNo){
model.setRollNo(rollNo);
}
public String getStudentRollNo(){
return model.getRollNo();
}
public void updateView(){
view.printStudentDetails(model.getName(), model.getRollNo());
}
}
//注意,本部分才是自己一开始理解的业务逻辑,与control模块的职责区分。
public class MVCPatternDemo {
public static void main(String[] args) {
//从数据库获取学生记录
Student model = retrieveStudentFromDatabase();
//创建一个视图:把学生详细信息输出到控制台
StudentView view = new StudentView();
StudentController controller = new StudentController(model, view);
controller.updateView();
//更新模型数据
controller.setStudentName("John");
controller.updateView();
}
private static Student retrieveStudentFromDatabase(){
Student student = new Student();
student.setName("Robert");
student.setRollNo("10");
return student;
}
}
示例二
特点
耦合性低
由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个。这也使得开发人员分工明确,可维护性高
重用性高
由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个