MVC架构
发表日期:2020.5.12
王重阳
摘要:MVC架构将业务逻辑聚集到一个部件里面,界面设计与后台逻辑相分离,因此当用户指定界面时。不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
引 言
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
1) 最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。
2) 最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。
3) 中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。
图1:MVC架构图例
1.Model层
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果,业务模型的设计可以说MVC最主要的核心。
而在项目中对数据库的基本访问可以视为一个不可分割的最底层操作,换言之对数据库数据的增删改查可以放在Model层。在代码中我们会写DAO和DTO类型的代码,这个DAO和DTO可以理解为是Model层的代码。
- View层
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和像XHTML,XML/XSL,WML等一些标识语言和Web services.
MVC好处是它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
3.Controller层
Controller可以理解为从用户接受请求,将Model层和View层匹配在一起,共同完成用户的请求,他的作用也很明显,很直白的告诉你他就是一个分发器,选择什么样的视图,或者说完成什么样的请求,控制层并不做任何的数据处理。例如:一个用户点击一个按钮,控制层接受请求后,不处理业务信息,只把用户提供的信息转发给模型层,告诉模型需要做什么,并选择合适的视图返回给用户,因此一个模型可能对应多个视图,一个视图可能对应多个模型。
- MVC架构特点
MVC是一种框架模式。框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得*别的重用性。
框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。
耦合性低:视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
4.案例
1.在web项目webContent中新建test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body>
<a href="listAllStudentsServlet">List All Students</a>
</body> </html>
2在Java-src中新建ListAllStudentServlet.java,并对其进行配置
package com.javaweb.mvc;
import java.io.IOException; import java.util.Arrays; import java.util.List;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class ListAllStudentsServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StudentDao studentDao = new StudentDao();
List<Student> students = studentDao.getAll();
request.setAttribute("students", students);
request.getRequestDispatcher("/students.jsp").forward(request, response);
}
}
3.继续创建Student.java
package com.javaweb.mvc;
public class Student {
private Integer id;
private String studentName;
private String location;
private String telephone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public Student(Integer id, String studentName, String location, String telephone) {
super();
this.id = id;
this.studentName = studentName;
this.location = location;
this.telephone = telephone;
}
}
4.创建StudentDao.java
package com.javaweb.mvc;
import java.util.ArrayList; import java.util.List; import java.sql.*;
public class StudentDao {
public List<Student> getAll(){
List<Student> students = new ArrayList<Student>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/student?user=root&password=1234";
String user = "root";
String password = "1234";
String sql = "select * from stu";
conn = DriverManager.getConnection(url, user, password);
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
int id = rs.getInt(1);
String studentName = rs.getString(2);
String location = rs.getString(3);
String telephone = rs.getString(4);
Student student = new Student(id, studentName, location, telephone);
students.add(student);
}
}catch (ClassNotFoundException e) {
// TODO Auto-generated catch block e.printStackTrace();
}
catch (SQLException e) {
// TODO Auto-generated catch block e.printStackTrace();
}finally{
try {
if(rs != null)
rs.close();
if(ps != null)
ps.close();
if(conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block e.printStackTrace();
}
}
return students;
}
}
5.在webContent中新建students.jsp
<%-- 显示学生信息 --%> <%@page import="java.util.List"%> <%@page import="com.javaweb.mvc.Student" %> <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body>
<%
List<Student> students = (List<Student>)request.getAttribute("students");
%>
<table>
<tr>
<th>id</th>
<th>studentName</th>
<th>location</th>
<th>telephone</th>
</tr>
<%
for(Student student:students){
%>
<tr>
<td><%= student.getId() %></td>
<td><%= student.getStudentName() %></td>
<td><%= student.getLocation() %></td>
<td><%= student.getTelephone() %></td>
</tr>
<%
}
%>
</table>
</body> </html>
6.添加JDBC驱动
添加在lib文件夹,因为lib文件夹中存放支持web应用运行的JAR文件
7.接下来就可以运行了