C : controller 控制层
V:视图成(html,jsp,vue)
M:模型层(分两种:第一种service,dao业务模型,第二种entity实体类模型)
有现成前端页面(类似或者可以借鉴的)
创建项目,导包或配置maven,基本框架搭建的工作准备(实体,工具类,配置文件)
V:前端视图
C:servlet
M:service(serviceimp)
M:dao(daoimp)
M:entity
没有可借鉴的页面
创建项目,导包或配置maven,基本框架搭建的工作准备(实体,工具类,配置文件)
C:servlet
M:service(serviceimp)
M:dao(daoimp)
M:entity
V:前端视图
系统架构是指,整合应用系统程序大的结构。
经常提到的系统结构有两种:三层架构和MVC
他们这两种结构既有区别,又有联系。但这两种结构的使用,均是为了降低系统模块间的耦合度。
三层架构是指:视图层 View、服务层 Service,与持久层 Dao。它们分别完成不同的功能。
View 层:用于接收用户提交请求的代码在这里编写。
Service 层:系统的业务逻辑主要在这里完成。
Dao 层:直接操作数据库的代码在这里编写。
为了更好的降低各层间的耦合度,在三层架构程序设计中,采用面向抽象编程。 即上层对下层的调用,是通过接口实现的。 而下层对上层的真正服务提供者,是下层接口的实现类。 服务标准(接口)是相同的,服务提供者(实现类)可以更换。 这就实现了层间解耦合。
MVC,即 Model 模型、View 视图,及 Controller 控制器。
View:视图,为用户提供使用界面,与用户直接进行交互。
Model:模型,承载数据,并对用户提交请求进行计算的模块。其分为两类: 一类称为数据承载 Bean:实体类,专门用户承载业务数据的,如 Student、User 等 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理用户提交请求的。
Controller:控制器,用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。
MVC 架构程序的工作流程: (1)用户通过 View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等 (2)服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的 Model 对用户请求进行处理 (3)Model 处理后,将处理结果再交给 Controller (4)Controller 在接到处理结果后,根据处理结果找到要作为向客户端发回的响应 View 页面。页面经渲染(数据填充)后,再发送给客户端。
SSM,即 SpringMVC、Spring 与 MyBatis 三个框架。它们在三层架构中所处的位置是不同的,即它们在三层架构中的功能各不相同,各司其职。
SpringMVC:作为 View 层的实现者,完成用户的请求接收功能。SpringMVC 的 Controller作为整个应用的控制器,完成用户请求的转发及对用户的响应。
MyBatis:作为 Dao 层的实现者,完成对数据库的增、删、改、查功能。
Spring:以整个应用大管家的身份出现。整个应用中所有 Bean 的生命周期行为,均由Spring 来管理。即整个应用中所有对象的创建、初始化、销毁,及对象间关联关系的维护,均由 Spring 进行管理。
三层架构就是把整个软件系统分为三个层次
表现层,业务逻辑,层数据访问层
方便团队分工,一个程序员单独完成一个软件产品不是不可以,但遇到大型软件需要团队配合的时候问题就来了,由于每个程序员风格不一样,而开发软件大量的代码风格不统一就会造成后期调试和维护出现问题,然而软件分层后,每个层合理分工这样的问题便迎刃而解。规范代码,在开发软件时对每个层的代码进行规范,固定开发语言的风格。忽略数据库差异,当软件系统要换数据库时,只要将数据访问层的代码修改就好了。实现"高内聚、低耦合"。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。
表现层(Presentation layer):表现层可以说是距离用户最近的层,主要是用于接收用户输入的数据和显示处理后用户需要的数据。一般表现为界面,用户通过界面输入查询数据和得到需要的数据。
业务逻辑层(Business Logic Layer):业务逻辑层是处于表现层和数据访问层之间,主要是从数据库中得到数据然后对数据进行逻辑处理。
数据访问层(Data access layer):数据访问层是直接和数据库打交道的,对数据进行“增、删、改、查”等基本的操作。
例如:食客;(食客通过服务员点单)表现层对应为:服务员;(服务员负责食客的点单和上菜)业务逻辑层对应为:主厨;(主厨从服务员那获得通知,向助手要原材料,并将原材料绘制成成品交给服务员)数据访问层对应为:助手;(助手从主厨那获得通知,提交给主厨原材料)
一般来说都是通过实体层(entity layer)贯穿三个层次之间。实体层不属于三层架构中的任意一层。
1、实体层:首先我们需要实体层来对应数据库中的表。(封装)
public class Student{ String id;//学生的学号 String name; //学生的姓名 String password; //学生的登录密码 public String getId() {return id;}public void setId(String id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getPassword() {return password;} public void setPassword(String password) {this.password = password;}}
2、数据访问层:这一层主要是利用sql语言直接对数据库进行最基础的操作如:“增,删,改,查”等等。不涉及更深一步的逻辑上的处理。
public class StudentDAO extends DAOsupport{public Student student; //对用户类进行数据库的操作前,先要获取用户对象public StudentDAO(Student student){super();this.student=student;} //返回实参 public Student get_Stu(){ retrun student; }//增加用户student public void save(){String sql="insert into student(id,name,password,)"+"values(?,?,?)";PreparedStatement pStatement;try {pStatement = connection.prepareStatement(sql);//为SQl参数赋值pStatement.setString(1, student.getId());pStatement.setString(2, student.getName());pStatement.setString(3, student.getPassword());//向user表插入记录pStatement.executeUpdate();//关闭pStatement.close();} catch (SQLException e) {System.out.println("保存用户时出错");e.printStackTrace();}}//删除用户student public void delete() throws SQLException{String sql="delete from user where id=?";PreparedStatement pStatement=connection.prepareStatement(sql);pStatement.setString(1, student.getId());pStatement.executeUpdate();pStatement.close();}//更新用户student public void update(){// TODO Auto-generated method stubString sql="update user set password=? where id="+student .getId();try {PreparedStatement preparedStatement=(PreparedStatement)connection.prepareStatement(sql);preparedStatement.setString(1,student.getPassword());preparedStatement.executeUpdate();} catch (SQLException e) {System.out.println("更新用户时出错");e.printStackTrace();}}//通过学号查找用户public Student getStuById() {Student student =new Student ();String sql="select * from student where id="+id;try {PreparedStatement preparedStatement=connection.prepareStatement(sql);ResultSet rs=preparedStatement.executeQuery();rs.next();student.setId(id);student.setName(rs.getString(2));student.setPassword(rs.getString(3));} catch (SQLException e) {System.out.println("通过ID查询用户时出错");e.printStackTrace();}return student ;}}
3、业务逻辑层
public class StudentService {public StudentDAO studentDAO;public StudentService(StudentDAO studentDAO){this.studentDAO=studentDAO;} //注册就是将student对象加入数据库public void rgister(){studentDAO.save();} //登录就是查看登录时填写的账号和密码是否和数据库中的账号和密码一致。public boolean login() throws Exception{boolean flag=false; //获取数据库中这个学生的密码 Student stu=studentDAO.getStuById(); String password=stu.getPassword();/* 实际上可以直接写成,上述代码只是为方便理解。 String password=studentDAO.getStuById().getPassword(); */if(password.equals(null)){throw new Exception("不存在");} /*studentDAO.getStu()得到的是由登录信息实例化的学生对象,不是存在数据库的记录*/else if(!password.equals(studentDAO.getStu().getPassword())){throw new Exception("密码不正确");}else if(password.equals(studentDAO.getStu().getPassword())){flag=true;}return flag;} //注销该学生public void delete(){studentDAO.delete();} //更新该学生public void updte(){studentDAO.update();}}
4.测试类test
MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。
1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。 2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。 3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。
这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。
说的直白点,很多程序员将MVC当成了三层架构在用,这看起来似乎没什么问题,毕竟三层架构也是一种和MVC齐名的架构模式。可问题在于用三成架构的思路写MVC,那么写出来的东西既不是三成架构也不是MVC,到是像一个什么都不是四不像。熟悉天龙八部的同学应该知道这样一段情节,吐蕃番僧鸠摩智强行用道家的小无相功为基础修炼少林的七十二绝技和易筋经最终导致走火入魔。其实用这个例子来形容现在一些程序员用三层架构的思想写MVC最恰当不过了,三层架构的核心思想是面向接口编程和各层之间的解耦和可替换性,MVC框架中没有这种概念,因为MVC要面对的问题本就不是三成架构要面对的问题,所以以MVC为基础写出来的三成架构是不会具备三层架构的核心要义的,换言之,这种代码是放弃了三层架构和MVC的精华,获得了它们的糟粕,是愚蠢的编码方式。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
创建模型。
Student.java
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; } }
创建视图。
StudentView.java
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); } }
创建控制器。
StudentController.java
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()); }
使用 StudentController 方法来演示 MVC 设计模式的用法。
MVCPatternDemo.java
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; } }
执行程序,输出结果:
Student: Name: Robert Roll No: 10 Student: Name: John Roll No: 10