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

前言

文本已收录至我的GitHub仓库,欢迎Star: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了。

日常求赞

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MapReduce操作HBase

运行HBase时常会遇到个错误,我就有这样的经历。 ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times 检查日志:org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocol versio…

转 ABAP_ALV_Function方式与OO方式(较为简单、普通的ALV)

ABAP_ALV_Function方式与OO方式(较为简单、普通的ALV) 分类: SAP ABAP2013-01-31 09:58 1511人阅读 评论(0) 收藏 举报目录 一、ALV简介 1、简介 2、ALV_GRID介绍 3、其它描述 二、开发ALV的基本流程 三、ALV相关开发细节 1、标准ALV与对象ALV的共同开发细节 2、标准…

MAC OS X 1.1 El Capitan安装方法与步骤

2019独角兽企业重金招聘Python工程师标准>>> 苹果公司发布了最新的Mac系统El Capitan,我也跟风安装了, 昨天试了一天终于算是安装成功了. ###电脑配置: CPU: E3-1230 v2 主板: 技嘉B75M D3V 显卡: 微星6850 声卡: Realtek ALC887 键盘: Noppoo 84键机械键盘 ###下载…

vp与vs联合开发-网口通信(socket)

Socket通信是一种在网络中进行进程间通信的机制。它使用了一种称为套接字(Socket)的编程接口,通过该接口可以创建、连接、发送和接收数据等操作。 Socket通信中,有两个主要的角色:服务器和客户端。服务器负责监听指定…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波8 - 直方图处理 - 直方图均衡化(全局直方图均衡化)

直方图均衡化 灰度映射函数: sT(r),0≤r≤L−1(3.8)s T(r), \quad 0\leq r \leq L -1 \tag{3.8}sT(r),0≤r≤L−1(3.8) 假设: (1) T(r)T(r)T(r)在区间0≤r≤L−10 \leq{r} \leq{L-1}0≤r≤L−1 上是一个单调递增函数。 (2) 对于0≤r≤L−10 \leq{r} …

python 元组和列表区别_Python干货整理:一分钟了解元组与列表使用与区别

元组是 Python 对象的集合,跟列表十分相似。下面进行简单的对比。列表与元组1、python中的列表list是变量,而元组tuple是常量。列表:是使用方括号[],元组:则是使用圆括号()2、两者都可以使用索引读取值列表1.列表中的a…

JS拖拽,移动与拉伸

上次做的简单的拖拽:javascript简单拖拽练习(鼠标事件 mousedown mousemove mouseup) 这次增加了一些相关的功能,增加四个角的拉伸改变宽度,主要还是用到一些简单的坐标位置计算,没有什么技术难度,熟练了一下自己对拖拽…

关于release后retainCount还是1的问题

转自:http://www.cocoachina.com/bbs/read.php?tid175523 realse之后再调用还能调用的的问题,我做了这么多年也是经常遇到,也曾经试图寻找原因, 就像6楼说的,很多时候都会出现realse过后还能调用的现象。而且对象不是…

Maven for Eclipse 第二章 ——安装 m2eclipse插件

m2eclipse 是一个提供了 Maven 与 Eclipse 整合的插件。它的意图是桥接上 Maven 和 Eclipse 之间的缺口。通过 Maven 原型提供的简单直白的接口创建项目,它使 Maven 在 IDE 中非常容易使用。下面是m2eclipse 提供的一些特性。 创建和导入 Maven 项目在 Eclipse 运行…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波9 - 直方图处理 - 直方图匹配(规定化)灰度图像,彩色图像都适用

直方图匹配(规定化) 连续灰度 sT(r)(L−1)∫0rpr(w)dw(3.17)s T(r) (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.17} sT(r)(L−1)∫0r​pr​(w)dw(3.17) 定义关于变量zzz的一个函数GGG,它具有如下性质: G(z)(L−1)∫0zpz(v)d…

C#委托之就是跟委托过不去…

在上一篇博文当中,我们例举了一个机房自动化系统的逻辑控制程序,其中用到了Lambda表达式,因此方便了我们程序功能的实现.然而,我们不能仅仅为实现功能,完成任务而奋斗,应该知其然,知其所以然,也就是说,知道了Lambda表达式能够带来这样的方便,也应该知道为什么能够带来这样的方便…

closewait一直不释放_机床为什么要释放应力?怎么释放应力才好?

在机床行业内一直有种说法,就是机床需要释放应力,而且越是高精密的机床就越要注意应力的释放,最近就有机床粉向小编询问应力是什么?为什么要释放应力?如果释放要释放多久?怎么释放应力才好等一系列关于机床…

HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

点我看题目 题意 :两条平行线上分别有两种城市的生存,一条线上是贫穷城市,他们每一座城市都刚好只缺乏一种物资,而另一条线上是富有城市,他们每一座城市刚好只富有一种物资,所以要从富有城市出口到贫穷城市…

表单元素选择器

无论是提交还是传递数据,表单元素在动态交互页面的作用是非常重要的。jQuery中专门加入了表单选择器,从而能够极其方便地获取到某个类型的表单元素 表单选择器的具体方法描述: 注意事项: 除了input筛选选择器,几乎每个…

怎样在excel表格中画斜线并打字_一日一技丨Excel斜线表头如何制作?标题、表头的4个技巧...

来源 | 迅捷PDF转换器 (ID:xjpdf6)作者丨小小迅「一日一技」是每天的知识分享专栏,一是分享一些PDF、Office、办公小技巧;二是抽取小可爱们在留言中的疑问并解决。希望对大家有所帮助!表头的标题是Excel中的第一道大门,精致好看的…

Retina时代的前端视觉优化

随着New iPad的发布,平板也将逐渐进入Retina时代,在高分辨率设备里图片的显示效果通常不尽人意,为了达到最佳的显示效果就需要对图片进行优化,这里介绍一些优化方法: 一、用CSS替代图片 这一点在任何时候都适用&#x…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波10 - 直方图处理 - 局部直方图处理

这里写目录标题局部直方图处理局部直方图处理 因为像素是由基于整个图像的灰度的变换函数修改的。这种全局性方法适合于整体增强,但当目的是增强图像中几个小区域的细节时,通常就会失败。这是因为在这些小区域中,像素的数量对计算全局变换的…

CodeForces369C On Changing Tree

昨天的CF自己太挫了。一上来看到A题,就有思路,然后马上敲,但是苦于自己很久没有敲计数的题了,许多函数都稍微回忆了一阵子。A题的主要做法就是将每个数质因数分解,统计每个质因子的个数,对于每个质因子pi的…

ES6之const命令

一直以来以ecma为核心的js始终没有常量的概念,es6则弥补了这一个缺陷; const foofoo;foobar;//TypeError: Assignment to constant variable.上例声明了一个基本类型的常量,如过试图修改初始值则会报错;如果是引用类型的值同样适用…

C++和Rust_后端程序员一定要看的语言大比拼:Java vs. Go vs. Rust

这是Java,Go和Rust之间的比较。这不是基准测试,更多是对可执行文件大小、内存使用率、CPU使用率、运行时要求等的比较,当然还有一个小的基准测试,可以看到每秒处理的请求数量,我将尝试对这些数字进行有意义的解读。为了…