MVC概述

MVC即 Model-View-Controller 的缩写,是按照职责划分模块一种设计模式,其中Model是核心。

  • Model:模型。负责执行实际的业务,包含数据操作,可以向视图推送数据
  • view:视图。向用户展示数据或效果并接收用户的请求
  • Controller:控制器。接收视图的请求、控制流程、选择视图展示数据

MVC适用范围

MVC适合大型应用的开发。清晰的职责划分,有利于复杂项目的开发,并提高代码健壮性和可重用性。

MVC设计模式开发Web

在请求/响应方式的Web应用中,模型无法向视图推送消息。MVC帮助Web开发实现了前后端分离,视图就是前端的页面,控制器和模型属于后端,前后端之间的数据交流使用JSON格式。

运作流程

  • 前端页面接收用户输入并向服务器发送请求
  • 服务器接收请求和请求的数据并选择适当的控制器执行服务
  • 控制根据需要调用模型完成业务
  • 控制器选择视图展示结果

​控制器可以自己实现一些简单的业务,但它主要还是用于控制业务流程,清晰的职责划分对于复杂的项目十分有益

模仿Spring MVC框架搭建一个简单的模型

后端有四个重要的部件:

  • DispatcherServlet:仅作为接收前端请求的入口,不控制业务流程,具体流程交给专门的控制器完成。

  • Controller:控制流程调用模型,得到结果后选择相应的视图展示给用户

  • JavaBean/EJB:模型,实现具体业务,例如CRUD...

  • RequestMapping:DispatcherServlet作为请求的统一入口,是如何选择适当Controller执行业务流程呢?这就要建立URL请求和Controller之间的映射关系,使用Java注解和反射来建这个映射。

伪代码

DispatcherServlet

@WebServlet(urlPatterns = "*",loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
初始化RequestMapping中的映射信息;
} @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的uri
String uri = req.getRequestURI();
Object o = 调用RequestMapping的方法将uri映射到Controller ;
Methon m = ... ;
其他 others = ...;
//调用Controller
try {
Object result = method.invoke(object, req, resp);
switch (根据映射中的信息选择) {
case 视图: 从result中获取视图地址;
case 数据: 维持请求使用的视图,仅返回数据;
... ...
}
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
} private void responseView(HttpServletRequest req, HttpServletResponse resp, String result) throws IOException {
resp.sendRedirect(result);
} private void responseText(HttpServletRequest req, HttpServletResponse resp, String result) throws IOException {
PrintWriter writer = resp.getWriter();
writer.println(result);
}
}

RequestMapping

public class RequestMapping {
//存储映射的集合
private static Map map = new HashMap<>(); //获取映射服务
public static MVCMapping get(String uri) {
return map.get(uri);
} //加载映射
public static void load() {
读取配置文件;
类加载器加载获取配置文件中Controller对象的实例;
for (循环条件) {
if (Controller的方法包含的信息) {
放入map集合建立映射关系;
}
}
}
}

Controller

public class DemoController {
@注解(信息:方法对应的url)
public T methonName(HttpServletRequest req, HttpServletResponse resp) {
控制业务流程,调用模型;
return T;
} @注解(信息:方法对应的url)
其他方法{ }
}

文章参考书籍

  • 《Tomcat与Java Web开发技术详解》孙卫琴

快速了解Web MVC设计模式的更多相关文章

  1. Java Web开发中MVC设计模式简介

    一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...

  2. 【原创翻译】认识MVC设计模式:web应用开发的基础(实际编码篇)

    原文地址:http://www.larryullman.com/2009/10/15/understanding-mvc-part-3/ 全系列INDEX [原创翻译]认识MVC设计模式:web应用开 ...

  3. 基于MVC设计模式的Web应用框架:struts2的简单搭建(一)

    Struts2的初步介绍 Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴.京东等互联网.政府.企业门户网站.虽然之前存在了很大的安全漏洞,在2013年让苹果.中国移动.中国联 ...

  4. Struts2是一个基于MVC设计模式的Web应用框架

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. Struts ...

  5. MVC设计模式与Java Web经典三层架构

    MVC设计模式 MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...

  6. [原创]java WEB学习笔记19:初识MVC 设计模式:查询,删除 练习(理解思想),小结 ,问题

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. 学习Java Web篇:MVC设计模式

    一.MVC设计模式 1.什么是MVC模式 1.1.MVC -- Model View Controller模型视图控制器 1.2.Model:模型 一个功能 一般用JavaBean 1.3.View: ...

  8. 一步步搭建自己的轻量级MVCphp框架-(一)什么是PHP框架以及MVC设计模式

    PHP框架 php框架对很多新手而言可能会觉得很难攀越,其实不然 ,只要知道一个框架的流程,明白原理了,基本类似框架都可以看懂,php框架真正的发展要从php5开始了,其实php4时代就有一些框架,但 ...

  9. Struts 2.x仍然明显落后于时代。 Struts 2.x这一类老牌Web MVC开发框架仅能用于开发瘦客户端应用,无法用来开发对于交互体验要求更高的应用。

    后来我在工作中陆续使用过Struts 1.x和Struts 2.x.我曾经把一个开源的基于Struts 1.x的自助式广告联盟应用移植到Spring MVC,还基于Struts 2.x做过网站开发.S ...

随机推荐

  1. restful风格的理解

    简而言之,就是不同的命令响应不同的操作: 关注点在url中的不同参数,是因为不同的参数才使得不同的method去对应的不同的操作.

  2. java基础学习——Swing图形化用户界面编程

    原文链接:https://blog.csdn.net/yiziweiyang/article/details/52317240 链接有详细解释,也有例子,以下是个人参照例子实验的代码. package ...

  3. 使用sun.net.ftp.FtpClient进行上传功能开发,在jdk1.7上不适用问题的解决

    问题如下图片: 之前项目上开发了一个上传文件的功能,使用的是sun.net.ftp.FtpClient这个类 连接服务器的代码大概如下: public static FtpClient ftpClie ...

  4. Python 学习笔记(3)

    Python 文件I/O 读取键盘输入: Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘: 1. raw_input #函数从标准输入读取一个行,并返回一个字符串(去掉结尾 ...

  5. 从零开始搞后台管理系统(2)——shin-server

      shin 的读音是[ʃɪn],谐音就是行,寓意可行的后端系统服务,shin-server 的特点是: 站在巨人的肩膀上,依托KOA2.bunyan.Sequelize等优秀的框架和库所搭建的定制化 ...

  6. 写了一个vue+antdv的后台管理模板

    1,项目简介 写在前面===>这是一个vue+antdv的后台管理模板 项目地址: https://github.com/BaiFangZi/vue-antd-manage 1.1,概述 ​ 最 ...

  7. SpineRuntime-Presentation - 基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画

    SpineRuntime-Presentation 基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画 Github地址 效果 可以在 Andro ...

  8. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  9. 使用 SVG transform rotate 解决画框中的数字跟随旋转的问题

    问题描述 在图片上画框标注数字,旋转画布后,数字随之旋转,可读性不强,要求修改成无论画布怎么旋转,数字都是正向显示~ 原交互图示: 解决方案 先看下 dom 的结构 然后看下下面简单的代码 // 获取 ...

  10. Docker系列——InfluxDB+Grafana+Jmeter性能监控平台搭建(一)

    在做性能测试的时候,重点关注点是各项性能指标,用Jmeter工具,查看指标数据,就是借助于聚合报告,但查看时也并不方便.那如何能更直观的查看各项数据呢?可以通过InfluxDB+Grafana+Jme ...