基于Netty框架手写一个Tomcat容器
Netty作为底层通信框架,用来实现Web容器自然也不难,我们先介绍一下整体实现思路。我们知道,Tomcat是基于J2EE规范的Web容器,主要入口是web。xml文件。web。xml文件中主要配置Servlet、Filter、Listener等,而Servlet、Filter、Listener在J2EE中只是抽象的实现,具体业务逻辑由开发者来实现。本章内容,就以最常用的Servlet为例来详细展开。1环境准备1。1定义GPServlet抽象类
首先,我们创建GPServlet类。我们都知道GPServlet生命周期中最常用的方法是doGet()方法和doPost()方法,而doGet()方法和doPost()方法是service()方法的分支实现,看下面的简易版Servlet源码实现。
从上面的代码中,我们看到,doGet()方法和doPost()方法中有两个参数GPRequest和GPResponse对象,这两个对象是由Web容器创建的,主要是对底层Socket的输入输出的封装。其中GPRequest是对Input的封装,GPResponse是对Output的封装。1。2创建用户业务代码
下面基于GPServlet来实现两个业务逻辑FirstServlet和SecondServlet。FirstServlet类的实现代码如下。
SecondServlet类的实现代码如下。
1。3完成web。properties配置
为了简化操作,我们用web。properties文件代替web。xml文件,具体内容如下。
上述代码分别给两个Servlet配置了firstServlet。do和secondServlet。do的URL映射。4。2基于传统IO手写Tomcat
下面我们来看GPRequest和GPResponse的基本实现。4。2。1创建GPRequest对象
GPRequest主要就是对HTTP的请求头信息进行解析。我们从浏览器发送一个HTTP请求,如在浏览器地址栏中输入http:localhost:8080,后台服务器获取的请求其实就是一串字符串,具体格式如下。
在GPRequest获得输入内容之后,对这一串满足HTTP的字符信息进行解析。我们来看GPRequest简单直接的代码实现。
在上面的代码中,GPRequest主要提供了getUrl()方法和getMethod()方法。输入流InputStream作为GPRequest的构造参数传入,在构造函数中,用字符串切割的方法提取请求方式和URL。4。2。2创建GPResponse对象
接下来看GPResponse的实现,与GPRequest的实现思路类似,就是按照HTTP规范从Output输出格式化的字符串,来看代码。
上面的代码中,输出流OutputStream作为GPResponse的构造参数传入,主要提供了一个write()方法。通过write()方法按照HTTP规范输出字符串。4。2。3创建GPTomcat启动类
前面4。2。1和4。2。2两节只是对J2EE规范的再现,接下来就是真正Web容器的实现逻辑,分为三个阶段:初始化阶段、服务就绪阶段、接受请求阶段。
第一阶段:初始化阶段,主要是完成对web。xml文件的解析。
上面代码中,首先从WEBINF读取web。properties文件并对其进行解析,然后将URL规则和GPServlet的对应关系保存到servletMapping中。
第二阶段:服务就绪阶段,完成ServerSocket的准备工作。在GPTomcat类中增加start()方法。
第三阶段:接受请求阶段,完成每一次请求的处理。在GPTomcat中增加process()方法的实现。
每次客户端请求过来以后,从servletMapping中获取其对应的Servlet对象,同时实例化GPRequest和GPResponse对象,将GPRequest和GPResponse对象作为参数传入service()方法,最终执行业务逻辑。最后,增加main()方法。
服务启动后,运行效果如下图所示。
4。3基于Netty重构Tomcat实现
了解了传统的IO实现方式之后,我们发现Netty版本的实现就比较简单了,来看具体的代码实现。4。3。1重构GPTomcat逻辑
话不多说,直接看代码。
代码的基本思路和基于传统IO手写的版本一致,不再赘述。4。3。2重构GPRequest逻辑
我们先来看代码。
和基于传统的IO手写的版本一样,提供getUrl()方法和getMethod()方法。在Netty的版本中,我们增加了getParameter()的实现,供大家参考。4。3。3重构GPResponse逻辑
还是继续看代码。
相对于基于传统的IO手写的版本而言,主要变化就是利用Netty对HTTP的默认支持,可以使用现成的API。4。3。4运行效果演示
启动容器,我们在浏览器地址栏中输入http:localhost:8080firstServlet。do,可以得到如下图所示的结果。
在浏览器地址栏中输入http:localhost:8080secondServlet。do,可以得到如下图所示的结果。
合枞高速全线通车又进一步根据最新消息,安徽合枞项目交安工程交工验收圆满结束,这意味着距合枞高速全线通车又进一步了。11月11日至15日,合枞高速北段交安工程接受安徽省高速公路检测单位交工验收实体检测,各项
世界首套深海保温保压取样海试成功原标题为深海资源勘探提供技术装备支撑(引题)世界首套深海保温保压取样海试成功(主题)中工网讯(工人日报中工网记者刘友婷)近日,由谢和平院士领衔的深圳大学与四川大学团队自主研制的深海
用了3年华为Mate30Pro,再次换回苹果后,憋了很多话想说三年前从iPhoneX换成华为Mate30Pro后,就一直没换手机,今年iPhone14Pro新出,改变了灵动岛形态,终于让我拥有了换机欲望。如今上手一个月,今天就来和大家分享一下
印度Ola也要推跨骑电动车作为印度两轮届的网红第一品牌Ola,其首席执行官BhavishAggarwal已确认该公司计划在不久的将来要推出跨骑电动车的事实。BhavishAggarwal在Twitter上针
门将送礼!山东泰山客场落败,武汉三镇大胜重夺榜首,争冠白热化在刚刚结束的一场中超焦点战中,坐镇主场的成都蓉城21战胜山东泰山,成功把领头羊斩于马下。1930分,比赛正式打响,泰山队费莱尼莫伊塞斯克雷桑贾德森四大外援全部首发,本赛季回归后一直
稳定如山!荷兰队近9场世界杯首战保持不败直播吧11月22日讯世界杯A组第1轮,荷兰20击败塞内加尔,迎来开门红。据统计,荷兰队近9场世界杯首战保持不败。2022世界杯荷兰20塞内加尔2018世界杯缺席2014世界杯西班牙
逆袭!荷兰新国门首秀即战世界杯2年前险些退役今天凌晨结束的一场2022卡塔尔世界杯A组第1轮中,荷兰20击败塞内加尔取得开门红此役,塞内加尔在射门数和射正数上都领先于对手,但荷兰门将诺珀特发挥出色高接低挡力保球门不失,最终荷
45分的巨大分差!还是意外吗?蜀中无大将廖化作先锋!今日主公命我带尔等前去讨伐那个黑胖子,到时听我摔杯为号。算了,还是看我眼色行事吧!扯远了,话说今日勇士与鹈鹕一站,看到结果肯定会有人说,这是阴谋,是科尔在演管
合金首饰戴久会怎么样?关于合金你不知道的那些事问题怎么才能每天都收到这种文章呢?答案只需要点击右上角关注即可。大家好,我是东方,今天我们来聊一聊合金首饰。市场上所有的珠宝配饰中,合金绝对是极为广泛且常见的一种,物美价廉,时尚美
OK!帮忙挑快来跟着OK!学习吸睛法则穿搭时有烦恼?不知道怎么吸引注意力?不知到怎么穿?来看看这两位女星如何演绎美丽以及用独具的风格大大吸引人眼球的!相信大家已经看过姚晨的摇滚狂花了,狂放不羁的彭莱给大家带来另一面的姚
最近醒狮帽突然被网红带火了!戴上减龄还显脸小,意外的好看夏天很多人喜欢用帽子来遮阳,但是怎么忽略了冬天帽子还能保暖这件事情呢?反正我觉得秋冬的帽子利用率大大降低。但我觉得冬天佩戴帽子不但可以温暖自己,还可以增加穿搭的造型感,为简约沉闷的