前言

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206种一棵树最好的时间是十年前,其次是现在

six-finger-web

一个Web后端框架的轮子从处理Http请求【基于Netty的请求级Web服务器】 到mvc【接口封装转发)】,再到ioc【依赖注入】,aop【切面】,再到 rpc【远程过程调用】最后到orm【数据库操作】全部自己撸一个(简易)的轮子。

github

为啥要写这个轮子

其实是这样的,小六六自己平时呢?有时候喜欢看看人家的源码比如Spring,但是小六六的水平可能不怎么样,每次看都看得晕头转向,然后就感觉里面的细节太难了,然后我就只能观其总体的思想,然后我就想我如果可以根据各位前辈的一些思考,自己撸一个简单的轮子出来,那我后面去理解作者的思想是不是简单点呢?于是呢 six-finger-web就面世了,它其实就是我的一个学习过程,然后我把它开源出来,希望能帮助那些对于学习源码有困难的同学。还有就是可以锻炼一下自己的编码能力,因为平时我们总是crud用的Java api都是那些,久而久之,很多框架类的api我们根本就不熟练了,所以借此机会,锻炼一下。

特点

  • 内置由 Netty 编写 HTTP 服务器,无需额外依赖 Tomcat 之类的 web 服务(刚好小六六把Netty系列写完,顺便用下)
  • 代码简单易懂(小六六自己写不出框架大佬那种高类聚,低耦合的代码),能力稍微强一点看代码就能懂,弱点的也没关系,小六六有配套的从0搭建教程。
  • 支持MVC相关的注解确保和SpringMVC的用法类似
  • 支持Spring IOC 和Aop相关功能
  • 支持类似于Mybatis相关功能
  • 支持类似于Dubbo的rpc相关功能
  • 对于数据返回,只支持Json格式

絮叨

此教程只适合初中级水平,因为作者本身水平不高,不喜勿喷,今天是文章的第二篇,实现一个简单的SpringMVC,参考的是Guide哥的jsoncat。 好了,下面我给大家来一一走一遍搭建流程

这边建议一边下载源码,一边来看,如果觉得有问题的话

总结的包结构

首先我们来看看写完了MVC之后的包结构,以至于大家心里有数

pom的修改

首先第一步,我先把pom文件新增的地方给大家看看

引入他们一个是反射,因为写轮子,反射肯定用的多,还有一个就是json转换工具

具体MVC的实现

这边我先把整体的思想给大家捋捋,这个只是一个简单的实现,还有很多的细节没有完成

首先,我们看看我们写业务是个怎么样的样子,如下图

好,这个就是我们最终要做到的效果,对吧,那我们浏览器请求的时候长什么样呢?

它长这样,那其实久很清晰了,SpringMVC要实现的就是不同请求走不同的方法嘛,这就是核心思想嘛。总的来说其实就三个部分

  • 一个是原有的server的改造
  • 一个是springmvc相关容器组件的初始化
  • 一个是http请求的请求流程处理

下面,我一一来讲解

改造Netty服务器的请求部分

这边我解题然后把找类 方法的流程给大家,大家自己去看源码

HttpRequestHandler->channelRead0

其实服务器这边需要改造的地方也不多,就是通过请求,来找到不同的处理器,然后再去处理我们的业务,然后根据业务的返回值,然后我们再去封装一些成功或者失败,然后这边来看看server包下面的几个类,具体的代码,大家就自己去看了,每个类基本上有注释

springmvc相关组件的初始化

首先我们再来看看我们的启动类这边, 类 ApplicationServer

然后我们就可以往下跟代码了,其实大家看源码也是这样,但是源码的话细节毕竟多,所以难懂点

类 DispatcherMethodMapper->loadRoutes

这个类的东西还比较多,基本上很多地方我写了注释,如果不懂的可以私下请教,然后我们大致来分析一下吧!

  • 第一个肯定是加载包的扫描路径,因为我这个是基于注解的,我就在配置文件中配置扫描路径
  • 之后就是遍历里面的.class文件,然后找到类上面的注解,如果有RestController 说明他这个类是用来处理请求的,然后遍历类中的方法,然后去一个个分析 PostMapping RequestMapping GetMapping 反正也就是if else 然后把这些方法,把请求的url封装到一个springmvc的容器中,等请求来的时候,就去容器中匹配,然后找到对应的方法,再填充对应的参数,就可以执行方法了,具体的呢?建议大家跟着源码来看哈

之后便是我们的主流程了,我们来看看主题流程怎么走的

还是在服务端那个类那跟起 HttpRequestHandler->channelRead0

我们来看这个方法中的

RequestHandlerFactory->create

其实就是根据不同的请求方式,找到对应的处理类

然后我们接下去看 HttpRequestHandler->channelRead0

然后大家看,这个方法,才是我们的重头戏,也就是我们处理的核心了,我们往下跟 RequestHandler 发现是一个接口

假设我们是Get请求找到他的实现类

GetRequestHandler->handle 这个就是我们真正要看的逻辑所在了,我们往下看

封装请求参数和路径参数

DispatcherMethodMapper->getMethodDetail

MethodDetail->build

这个就是核心填充的方法了,当填充完成之后我们会获得一个对象,这个对象就比较厉害了,他包含,当前要执行的方法 请求参数等,如下图 GetRequestHandler->handle

接着往下

我们来看下,里面的核心方法 ParameterResolver->resolve

根据不同的方式去填充,然后填充完成之后呢

通过反射去拿到当前要执行的对象,然后再通过反射去执行对应的方法,至此mvc的所有流程走完了

我们看看请求的结果

要执行的RestController

请求 http://localhost:8081/user/小六六写MVC

结尾

好了,我们把MVC的小小流程写完了,代码也上传了,希望大家好好学习,一起加油,后面就要撸ioc 和aop了。

日常求赞

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章

六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !

java web项目_[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)相关推荐

  1. java web 显示项目下的图片_[适合初中级Java程序员修炼手册从0搭建整个Web项目](一)...

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206种一棵树最好的时间是十年前,其次是现在 six-finger-web 一个Web后端 ...

  2. apache为什么更适合处理动态请求_[适合初中级Java程序员修炼手册从0搭建整个Web项目](一)...

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206种一棵树最好的时间是十年前,其次是现在 six-finger-web 一个Web后端 ...

  3. 【读书笔记】程序员修炼手册—实战式学习最有效(项目驱动)

    持续学习&持续更新中- 学习态度:守破离 程序员修炼手册-实战式学习最有效(项目驱动) 1.学会观察这个世界(学会思考) 2.学会学习再去学习(守破离) 守 破 离 3.要动手,实战吧(JUS ...

  4. 20200928 006.简单错误如何处理_守破离学习法_程序员修炼手册

    学习思路:守 破 离 1.守 刚开始学习,首先要做到对老师和知识的"敬畏之心".学习就要先信服老师,不服老师就别学.你服谁,就去向谁学:不服,不如不去:谁都不服,那你已经天下第一, ...

  5. Python学习_006.Python简单错误如何处理-守破离学习法_程序员修炼手册

    简单错误如何处理: 1.与老师对照 发现错误 2.百度等等搜索 3.最后请教老师或高手 守破离学习法: 守:按照老师要求的内容去学去练 破:发现问题解决问题 展开自己的思路 离:反复发现问题解决问题 ...

  6. 006.尚学堂阶段1_简单错误如何处理_守破离学习法_程序员修炼手册

    程序员修理手册https://www.bjsxt.com/xiulian.html#1F

  7. 程序员项目_您如何让程序员加入您的项目?

    程序员项目 本月在The Queue上 ,LinuxQuestions.org的josephj问: 我如何让程序员加入我们的项目? 当原始开发人员退出并且没有其他人上前时,我继承了一个用$ progr ...

  8. 读书笔记-程序员修炼之道-注重实效的哲学(二)

    石头汤与煮青蛙 村民的角度 足够好的软件 知道何时止步 石头汤与煮青蛙 三个士兵从战场返回家乡,在路上饿了.他们看见前面有村庄,就来了精神-他们相信村民会给他们一顿饭吃.但是当他们到达那里,却发现门锁 ...

  9. dos命令为java程序赋值_在DOS命令行状态下,如果源程序HelloWorld.java在当前目录下,那么编译该程序的命令是() (5.0分)_学小易找答案...

    [判断题]run方法是运行线程的主体,若run方法运行结束,线程就消亡了 [单选题]在Java 程序中,下面哪个是不合法的标识符() (5.0分) [其它]请提交实验二压缩包 [单选题]在DOS命令行 ...

最新文章

  1. Linux云自动化运维第十课
  2. mysql设置常用——修改大小写、设置sql_mode不支持功能、
  3. XP系统下建立WIFI热点让手机、电脑能上网
  4. Windows API GetVersionEx()判断系统版本详解
  5. c语言int转字符串_C语言零基础入门-指针-05
  6. 信息学奥赛一本通 1001:Hello,World | OpenJudge NOI 1.1 01:Hello, World
  7. NodeJS 使用官方oracledb库连接数据库教程
  8. 从发起请求到收到响应,各个阶段的时间损耗是怎么样的?
  9. java怎么让遮罩层下面滚动_vue项目弹出层后禁止body底层的滚动事件
  10. LeetCode Can I Win
  11. Linux内核入门(三)—— C语言基本功
  12. 在浏览器用域名访问发现跳转到IIS Windows 界面
  13. 爬取中国地震网地震数据
  14. 人脸识别系统_设计说明书
  15. 利用U盘安装win2008r2系统的步骤
  16. 华为鸿蒙参与者,一起来搞机 篇二十四:不止有鸿蒙,参加华为开发者大会是一种怎样的体验...
  17. Linux(信号,进程间通信)共享内存,信号量,消息队列
  18. 计算机应用基础课程的评价方法,对计算机应用基础课程评价方法探讨.doc
  19. Apache Calcite 论文翻译
  20. jsp未正确拼写字 mysql_JAVA字符编码

热门文章

  1. 基于Element ui 实现输入框只能输入数字并支持千分位
  2. Flask 中内置的 Session
  3. 【2】信息的表示和处理
  4. js 对已知数组数据的导出EXCEL
  5. 自己整理的openresty安装步骤
  6. 一篇需要膜拜的文篇--Javascript异步编程模型进化(转)
  7. 数据库常用增删改查记录等语句
  8. Ubuntu16.04安装nginx
  9. Jan 12 - Delete Node in a Linked List; Data Structure; Linked List; Pointer;
  10. 计算机图形学方向投稿国外期刊