最近在研究struts2的时候发现,这货本身就是mvc,所以为了弄清struts2的原理,就必须要弄懂mvc,以下是我额学习笔记,参考了研磨struts2这本书,感谢原作者
1.什么是mvc?
mvc是一个框架模式,它将应用程序划分为模型、视图控制器三个部分
2.模型、视图、控制器各个部分的作用:
模型负责封装应用的状态,并实现应用的功能,通常又分为数据模型和业务逻辑模型,数据模型用来存放业务数据,比如订单信息,用户信息等,而业务逻辑模型则包含应用的业务操作,比如订单的添加或者修改等。
视图:用来将模型的内容展现给用户,用户可以通过视图来请求模型进行更新,视图从模型获得要展示的数据,然后用自己的方式展现给用户。
控制器:用来控制应用程序的流程和处理视图所发出的请求,当控制器接收到用户的请求后,会将用户的数据和模型的更新相映射,即调用模型来实现用户的请求。
3.模型和视图的关系
在mvc中,模型和视图是分离的,通常视图里面不会有任何逻辑实现:而模型也是不依赖于视图的,同一个模型可能会有很多种不同的展现方式,比如window中文件夹的展现方式有很多种,大图标、小图标等。
模型负责输出的内容,视图负责输出的形式,模型与视图之间是解耦的。
4.mvc各组件的交互关系
(1)展示视图给用户,用户在这个视图上进行操作,并填写业务数据,
(2)用户提交数据,视图发送请求
(3)视图发出的用户请求会到达控制器,在请求中包含了相关的操作信息和数据。
(4)控制器处理用户请求,会把请求中的数据进行封装,然后选择并调用合适的模型,请求模型进行状态更新,然后,接着选择要展示给用户的视图。
(5)模型处理用户请求的业务功能,同时进行模型状态的维护和更新。
(6)当模型状态发生改变的时候,模型回会通知相应的视图,告诉视图,它的状态发生了改变。
(7)视图接到模型的通知后,会向模型进行状态查询,获取需要展示的数据,然后按照视图本身的展示方式,把这些数据展示出来。
5.mvc的优势
(1)低耦合性:在mvc模式中,模型和视图是解耦的,模型不会依赖于视图,而视图也仅仅是从模型中获取数据,并不会与模型的逻辑处理相关联。
(2)更低的开发成本:由于mvc模式明确的划分了各部分的职责,就可以让程序员各司其职,java程序员只关心业务逻辑实现,也就是模型部分,页面程序员只关心页面展示,也就是视图部分即可。
(3)更好的可维护性:由于其低耦合性,当软件需求发生变更的时候,就可以各自独立的改变而不会相互影响,因此程序更容易维护和扩展。
6.实现
我们将创建一个作为模型的Teacher对象。TeacherView 是一个把学生详细信息输出到控制台的视图类,TeacherController 是负责存储数据到Teacher 对象中的控制器类,并相应地更新视图 TeacherView。
创建模型
/*
* 模型
*/
public class Teacher {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}
}
创建视图
/*
* 视图
*/
public class TeacherView {
public void printTeacherInfo(String teacherName,int age){
System.out.println("教师姓名:"+teacherName);
System.out.println("教师年龄:"+age);
}
}
创建控制器
/*
*控制器
*/
public class TeacherController {
private Teacher model;
private TeacherView view;
public TeacherController(Teacher model, TeacherView view){
this.model = model;
this.view = view;
}
public void setTeacherName(String name){
model.setName(name);
}
public String getTeacherName(){
return model.getName();
}
public void setTeacherAge(int age){
model.setAge(age);
}
public int getTeacherRollNo(){
return model.getAge() ;
}
public void updateView(){
view.printTeacherInfo(model.getName(), model.getAge());
}
}
测试
public class MVCDemoTest{
public static void main(String[] args) {
//从数据可获取教师记录
Teacher model = retriveTeacherFromDatabase();
//创建一个视图:把教师详细信息输出到控制台
TeacherView view = new TeacherView();
TeacherController controller = new TeacherController(model, view);
controller.updateView();
//更新模型数据
controller.setTeacherName("John");
controller.updateView();
}
private static Teacher retriveTeacherFromDatabase(){
Teacher Teacher = new Teacher();
Teacher.setName("Robert");
Teacher.setAge(20);
return Teacher;
}
}
运行截图