MVC体系结构

简单介绍

MVC(Model-View-Controller)结构即模型-视图-控制器

  • View主要是呈现模型的状态数据,提供用户交互操作界面
  • Controller处理用户输入(调控视图,访问模型的业务功能),控制业务流程(例如:输入密码后跳转到成功或失败界面)
  • Model包含核心数据和业务功能,状态变更时,发送通知
  • MVC逻辑结构示意图
    Alt text

MVC结构涉及设计模式的使用

  1. 策略模式
    Alt text
    View委托Controller处理用户动作,对于View来说,Controller就是策略,多个Controller代表多个不同的处理策略,想换另一种策略即更换Controller
  2. 组合模式
    Alt text
    视图是各类组件的组合(如标签,窗口,文本输入等),顶层组件包含其他组件。
  3. 观察者模式
    Alt text
    View和Controller充当观察者,注册到Model;Model充当被观察者,Model状态变更时,发送变更通知给View和Controller
  • 基于Observer的MVC设计类图
    Alt text
  1. Model
  • 系统的核心数据coreData,代表模型的状态
  • 业务逻辑和计算功能service(),Controller根据用户需求调用提供的数据处理功能
  • View或Controller获取数据 -> getData()
  • attach(),detach(),供视图注册注销
  • notify()当Model状态改变时,发送通知,使View同步Model的状态数据
  1. Controller
  • 初始化对应的模型、视图
  • handleEvent(),调用Model业务类型,更新Model数据,执行对View的调整和控制操作
  1. View
  • display()呈现Model数据
  • activate()激活控制方法,供Controller实施调控操作

MVC应用

Swing中的MVC

Alt text
Swing组件使用了 MVC 变体,视图与控制器合成一个UI-delegate。UI Delegate定义了组件应该如何绘制,以及事件如何响应。

Swing的组件都包含一个JavaBean形式的属性model,它用于设置和获取模型。比如说,JSlider的模型是BoundRangeModel类定义的.Swing各个组件的模型在某一点上是共通的:如果开发者不自定义模型的话,组件会自己创建一个默认的模型,并且把这个模型安装在组件的内部。这些默认的组件有特定的命名方法,都是在模型名前增加前缀 Default。比如 JSlider默认的模型类是 DefaultBoundedRangeModel。组件调用 setModel方法可以把默认的模型替换掉。对于一些模型比较复杂的组件,比如 JTable和 JList,Swing提供了对应的模型抽象类,避免从0开始开发。这些类的前缀是 Abstract。比如说,JList的模型类有 ListModel, DefaultListModel和 AbstractListModel。

Struts中的MVC

Alt text

SpringMVC中的MVC

Alt text
SpringMVC实现Controller的方式

  • 实现Controller接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Controller1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("lck","faker");
mv.setViewName("forward:/WEB-INF/pages/show.jsp");
return mv;
}
}
<bean id="/test" class="com.yuan.controllers.Controller1"></bean>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Controller1</title>
</head>
<body>
<h1>Hello JSP!</h1>
<h2>Hello ${lck }</h2>
</body>
</html>
  • 实现HttpRequestHandler接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Controller2 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//共享数据到request
request.setAttribute("msg", "我是数据");
//请求转发
request.getRequestDispatcher("/WEB-INF/pages/show2.jsp").forward(request, response);
}
}
<bean id="/test2" class="com.yuan.controllers.Controller2"></bean>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Controller2</title>
</head>
<body>
<h1>Hello Controller2!</h1>
<h2>Hello ${msg }</h2>
</body>
</html>