1、MVC的概念
MVC全称为Model View Controller,即模型(Model)-视图(View)-控制器(Controller)的缩写,一种软件设计典范,用业务逻辑数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被广泛用于映射传统的输入,处理和输出功能在一个逻辑的图形化用户界面的结构设计中。MVC最早在二十世纪八十年代出现,为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用。后来成为现在的Oracle旗下的sun公司JavaEE平台的设计模式,并且得到不断的推广和普及。模型-视图-控制器模式是一个有用的工具箱,优点众多,但也有一些缺点。
小结:MVC是一种软件设计模式,目的是代码分层,用于将逻辑和视图分离。
2、模式特点
图示该模式的结构:
该模式最大的特点就是分层,如下说明:
- Model层:使用Java Bean作为模型层组件,它是应用业务数据处理核心,通常与底层存储库进行交互。
- View层:实现动态数据的视图显示组件,View视图的数据间接来源于Model模型的业务数据。
- Controller层:控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
最经典也是最简单的MVC组合: Java Bean + JSP + Servlet。
3、设计模式和框架的区分
框架、设计模式这两个概念容易混淆,框架通常是代码重用,而设计模式是设计重用,架构模式则介于两者之间,部分代码重用,部分设计重用及分析重用。框架和设计模式虽然相似,但是有本质的不同。设计模式是对在某种环境总反复出现的问题以及解决该问题的方案描述,它比框架更加抽象。框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示。设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用与于各种应用。可以说框架是软件工具,而设计模式是软件的知识方法。
- 常见的框架工具:Struts、Spring、Hibernate、Mybatis、Servlet、Webwork等。
- 常见的设计模式:工厂模式、代理模式、适配器模式、单例模式、策略模式、责任链模式等。
- 常见的框架模式:MVC、MTV、MVP、CBD、ORM等。
4、MVC模式的优缺点
- 优点:松耦合,重用性高,开发成本低,部署快,可维护性好。
- 缺点:理解使用复杂,不适用小型项目,系统复杂,效率降低,视图对业务数据访问效率低。
5、MVC模式设计Web应用
需要注意的地方:
- 选择合适的MVC模式框架构建应用。
- 依据MVC模式和系统模块设计功能。
- 按MVC模式组织分层次的目录结构。
- 使用工具开发,调试,部署应用程序。
常见的目录组织结构:基础包、模块包、控制层、数据访问层、实体类、服务器层、配置文件、通用服务组件包等。
6、例子
最经典的Java Bean + JSP + Servlet组合。
使用Java Bean作为Model层组件:
public class Person {
private String name;
private String sex;
private Integer age;
public Person() {
}
public Person(String name, String sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
使用JSP作为View视图层:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<h2>欢迎来到本应用!</h2>
<br/>
<a href="personServlet.do">请求处理</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.ycz.pojo.Person"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<%!
String name = "";
String sex = "";
Integer age = null;
%>
<%
Object obj = request.getAttribute("person");
if(obj!=null){
Person p = (Person)obj;
name = p.getName();
sex = p.getSex();
age = p.getAge();
}
%>
<body>
<h2>
姓名:【<%= name %>】<br/>
性别:【<%= sex %>】<br/>
年龄:【<%= age %>】岁<br/>
</h2>
</body>
</html>
使用Servlet作为Controller层控制器:
@WebServlet("/PersonServlet")
public class PersonServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Person p = new Person("云过梦无痕","男",25);
request.setAttribute("person", p);
request.getRequestDispatcher("show.jsp").forward(request, response);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>mvc-demo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置Servlet -->
<servlet>
<servlet-name>personServlet</servlet-name>
<servlet-class>com.ycz.servlet.PersonServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>personServlet</servlet-name>
<url-pattern>/personServlet.do</url-pattern>
</servlet-mapping>
</web-app>
启动web服务器,访问:http://localhost:8080/mvc-demo/
点击链接:
MVC作为一种经典的分层设计模式,至今仍使用广泛,Spring MVC框架采用了MVC模式,对于该模式应当做到十分熟悉。