Servlet教程(四) 基于Servlet的MVC设计模式
什么是MVC
在程序设计中,我们把采用模型(Model)、视图(View)、视图(Controller)三层分离的设计方式称为MVC设计模式。
MVC设计模式由以下三部分组成:
- 模型(Model):对应的组件是JavaBean(Java类)。
模型可以分为业务逻辑和数据模型,它们代表应用程序的业务逻辑和状态。 - 视图(View):对应的组件是JSP或HTML文件。
视图提供了可交互的客户界面,向客户显示模型数据。 - 控制器(Controller):对应的组件是Servlet。
控制器响应客户的请求,根据客户的请求来操作模型,并且把模型的响应结果由视图展示给客户。
MVC设计模型的优点和好处
- 各司其职、互不干涉
如果某一层的需求发生了变化,就只需要更改相应层中的代码,而不会影响到其他层。 - 有利于在开发中的分工
由于按层把系统分开,那么就能更好地实现开发中的分工。
网页设计人员可以开发JSP页面,对于业务熟悉的开发人员可以开发模型中相关业务处理的方法,而其他开发人员可开发控制器,以进行程序控制。 - 有利于组件的重用
如控制层可独立成一个通用的组件,视图层也可做成通用的操作界面。把显示与数据分离,这样就增加了各个模块的可重用性。
Servlet的MVC编程模式
由Servlet接收客户端请求,调用相应的模型处理业务逻辑和数据,再由Servlet根据处理的结果,选择相应的JSP或HTML文件响应客户端。
以一个加法计算器的例子,说明一下MVC的编程模式:
项目结构
核心控制器 PlusServlet.java
package com.etc.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.etc.model.PlusModel;
import com.etc.service.PlusService;
public class PlusServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// ### 控制器得到请求参数
String a = request.getParameter("a");
String b = request.getParameter("b");
// ### 请求参数,字符串转为整数
int inta = Integer.valueOf(a);
int intb = Integer.valueOf(b);
// ### 初始化Model
PlusModel model = new PlusModel();
model.setA(inta);
model.setB(intb);
// ### 调用Service业务逻辑
new PlusService().doit(model);
// ### 向View(JSP)传递Model
request.setAttribute("model", model);
// ### 控制器跳转到View
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
}
JSP视图 success.jsp
<%@ page language="java" import="java.util.*,com.etc.model.*" %>
<html>
<head></head>
<body>
<%-- 得到控制台Servlet传递的Model --%>
<% PlusModel model = (PlusModel)request.getAttribute("model"); %>
<%-- 显示结果 --%>
<%=model.getA() %>+<%=model.getB() %> =<%=model.getResult() %>
</body>
</html>
模型类,PlusModel
package com.etc.model;
public class PlusModel {
private int a;
private int b;
private int result;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
}
简单的加法业务 PlusService
package com.etc.service;
import com.etc.model.PlusModel;
public class PlusService {
public void doit(PlusModel model) {
model.setResult(model.getA() + model.getB());
}
}