背景

前段时间把之前写的DAO框架(手写DAO框架(一)-从“1”开始)整理了一下,重构了一版。整理过程中看以前写的代码,只是为了了解实现,只是为了实现,代码写的有点粗糙。既然已经整理了DAO框架,索性继续整理一下MVC框架(https://github.com/shuimutong/zxmvc.git),所谓温故知新也。

一、关于Servlet

1、简介

学习web的时候,一般都是先学Servlet

通过Servlet可以接受到http请求,并进行响应

这个时候,是不需要struts、SpringMVC等框架的

2、tomcat、jetty

web应用服务器

servlet容器

servlet需要运行在容器里

3、servlet生命周期

1)服务启动时加载servlet

2)第一次请求时

2.1)实例化servlet

2.2)执行init方法

3)调用service方法,判断请求的类型

3.1)get类型则调用doGet方法

3.2)post类型则调用doPost方法

4)服务重启或者关闭时,调用destroy方法

二、MVC框架

Model(模型)

应用程序中用于处理应用程序数据逻辑的部分

View(视图)

应用程序中处理数据显示的部分

Controller(控制器)

应用程序中处理用户交互的部分

三、SpringMVC

1、概述

Controller接收请求,然后返回ModelAndView

2、请求处理流程

1)SpringMVC将所有的请求提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理

2)DispatcherServlet查询HandleMapping,找到处理请求的Controller

3)DispatcherServlet将请求提交到目标Controller

4)Controller进行业务逻辑处理后,返回一个ModelAndView

5)DispatcherServlet查询ViewResolver视图解析器,找到ModelAndView对象指定的视图对象

6)将页面渲染到浏览器端

3、思考

1)关于视图解析器

之前的页面经常用到freeMarker、jsp等,需要经过视图解析器解析成Html

个人觉得上面两种方式,还不如直接html,通过js刷页面来的直观

自己写MVC框架,可以先实现MC,V暂时用html

2)主要功能

封装了servlet

IOC:实例管理

AOP:动态代理、cglib

四、实现思路

1、如何接收请求,分发请求

类似DispatcherServlet

服务初始时扫描所有URI,并放入一个URIMAP中

定义一个Servlet来接收所有请求

根据请求URL匹配URIMAP中对应的Controller

将请求分发给对应的Controller

2、IOC如何实现

注解形式

定义需要的注解

服务启动时,扫描注解的类

将注解的类根据依赖(通过反射)进行实例化

3、AOP

暂缓实现

五、实现概述

1、实现注解

1)各层注解

Controller、Service、Repository、Component

2)自动注入注解

Autowired

3)URI注解

RequestMapping

2、扫描注解类

扫描填写的URI

3、实现DispatcherServlet

1)接收请求

2)分发请求

附脑图:

下篇:手写MVC框架(二)-代码实现和使用示例

手写MVC框架(一)-再出发的更多相关文章

  1. 手写MVC框架(二)-代码实现和使用示例

    --------上一篇:手写MVC框架(一)-再出发----- 背景 书接上文,之前整理了实现MVC框架需要写哪些东西.这周粗看了一下,感觉也没多少工作量,所以就计划一天时间来完成.周末的时间,哪会那 ...

  2. 手写MQ框架(一)-准备启程

    一.背景 很久以前写了DAO框架和MVC框架,前段时间又重写了DAO框架-GDAO(手写DAO框架(一)-从“1”开始,源码:https://github.com/shuimutong/gdao.gi ...

  3. 手写MQ框架(二)-服务端实现

    一.起航 书接上文->手写MQ框架(一)-准备启程 本着从无到有,从有到优的原则,所以计划先通过web实现功能,然后再优化改写为socket的形式. 1.关于技术选型 web框架使用了之前写的g ...

  4. 源码分析系列 | 从零开始写MVC框架

    1. 前言 2. 为什么要自己手写框架 3. 简单MVC框架设计思路 4. 课程目标 5. 编码实战 5.1 配置阶段 web.xml配置 config.properties 自定义注解 5.2 初始 ...

  5. 手写MQ框架(四)-使用netty改造梳理

    一.背景 书接上文手写MQ框架(三)-客户端实现,前面通过web的形式实现了mq的服务端和客户端,现在计划使用netty来改造一下.前段时间学习了一下netty的使用(https://www.w3cs ...

  6. 手写SpringMVC 框架

    手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现 ...

  7. 手写SpringMVC框架(三)-------具体方法的实现

    续接前文 手写SpringMVC框架(二)结构开发设计 本节我们来开始具体方法的代码实现. doLoadConfig()方法的开发 思路:我们需要将contextConfigLocation路径读取过 ...

  8. 手写 jQuery 框架

    1.测试页面; <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  9. 手写DAO框架(三)-数据库连接

    -------前篇:手写DAO框架(二)-开发前的最后准备--------- 前言 上一篇主要是温习了一下基础知识,然后将整个项目按照模块进行了划分.因为是个人项目,一个人开发,本人采用了自底向上的开 ...

随机推荐

  1. LeetCode 722. Remove Comments

    原题链接在这里:https://leetcode.com/problems/remove-comments/ 题目: Given a C++ program, remove comments from ...

  2. chart.xkcd 可绘制粗略,开通,手绘样式的图表库

    chart.xkcd 可以用来绘制手绘样式的图表,使用简单,样式也挺好看 简单使用 代码 index.html <!DOCTYPE html> <html lang="en ...

  3. BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 \(Description\) 用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\) ...

  4. P3327 [SDOI2015]约数个数和 莫比乌斯反演

    P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...

  5. Navicat配置跳板机连接数据库

    需求 在开发中,有时候我们会碰到这么一个情况.数据库的服务器在内网,如果想连接,必须得先ssh登陆到跳板机,然后在跳板机ssh到达数据库所在服务器,进而操作数据库.遗憾的是,如果跳板机和数据库所在服务 ...

  6. WSL调用Windows下的ParaView对OpenFOAM进行后处理

    OpenFOAM可以在windows下的Linux子系统(WSL)安装,但是很麻烦的一个问题是WSL没有图形化的界面,只有一个控制台窗口,在后处理的过程中我们就没有办法直接调用paraFoam命令启动 ...

  7. oracle 使用length()函数需要注意的坑!

      1.情景展示 筛选出指定字段字符长度既不等于18也不等于15的数据. 2.原因分析 第一步:按字符串度进行分组统计: 第二步:筛选数据. 你会发现,只将length=17统计了出来,长度不存在的数 ...

  8. 一种Winform类electron的实现

    最近看了一篇文章  Winform客户端内嵌Vue页面  使用html作为winform的界面(其实这种做法早在MFC时代就已经有了),不过感觉文章中的封装并不够彻底,所以我忍不住要发一篇博客来说说我 ...

  9. vs2017添加区域或者视图出错

    删除以下文件的信息:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files

  10. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'TableName'中的标识列指定显式值

    当某表的一个列为自动增长列,是无法直接通过insert语句向给字段写入指定值,解决方法: SET IDENTITY_INSERT TABLE_NAME ON; INSERT INTO TABLE_NA ...