手把手带你写一个 MiniTomcat
郭屹
前 Sun Microsystems Java 研发工程师
1792 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 22 讲
开篇词 (1讲)
手把手带你写一个 MiniTomcat
15
15
1.0x
00:00/00:00
登录|注册

03|动态Response:按照规范构造返回流

你好,我是郭屹。今天我们继续手写 MiniTomcat。
上节课我们初步构造了一个最原始的可运行的 HTTP Server,做到了将文件内容输出到浏览器。但我们也发现,这个原始版本的 HTTP Server 局限性很大,只能使用静态资源,不能组装 Response 返回结果,竟然还要求静态资源本身的文本格式符合 HTTP 协议中 Response 的规范,而且也不满足不同异常场景下的 Response 返回。这个服务需要业务程序员自行准备完整的满足 HTTP Response 规范格式的静态资源,非常不友好。
其次,一个正常的 HTTP 服务响应请求不应只有静态资源,也应存在动态资源。这就是这节课我们要引入的一个重要概念——Servlet,它是实现动态资源返回的好工具。总体结构图如下,现在就让我们一起来动手实现。

项目结构

这节课我们计划采用 Maven 结构对项目的包依赖进行管理,省去了手工导入 jar 包的环节。但有一点我们始终坚持,就是引入最少的依赖包,一切功能尽可能用最原生的 JDK 来实现
这节课项目结构变化如下:
MiniTomcat
├─ src
│ ├─ main
│ │ ├─ java
│ │ │ ├─ server
│ │ │ │ ├─ HttpServer.java
│ │ │ │ ├─ Request.java
│ │ │ │ ├─ Response.java
│ │ │ │ ├─ Servlet.java
│ │ │ │ ├─ ServletProcessor.java
│ │ │ │ ├─ StatisResourceProcessor.java
│ │ ├─ resources
│ ├─ test
│ │ ├─ java
│ │ │ ├─ test
│ │ │ │ ├─ HelloServlet.java
│ │ ├─ resources
├─ webroot
│ ├─ test
│ │ ├─ HelloServlet.class
│ ├─ hello.txt
├─ pom.xml
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何构造返回流,通过手写MiniTomcat实现动态Response。首先介绍了项目结构的变化,采用Maven结构对项目的包依赖进行管理,并引入最少的依赖包。然后详细讲解了Response请求规范,包括状态行、Header头、空行与响应体的组成,以及对Response进行封装的方法。重点介绍了Response封装的过程,包括对响应格式的规定、使用StringUtils工具进行占位符填充,以及引入专用于处理Response的返回值的StaticResourceProcessor.java。通过代码示例展示了如何拼接响应头和处理文件内容,实现动态资源返回。接着介绍了如何处理动态资源,引入了Servlet的概念,并展示了如何调用Servlet获取动态资源。最后调整了服务端的处理代码,新增了对是否为Servlet的判断。通过测试验证了整体功能改造成功。文章内容详细介绍了构造返回流、引入Maven项目规范、对Response进行封装和处理的方法,以及动态资源与Servlet的概念和实现。整体内容丰富,适合读者快速了解文章概览,体现了文章的技术特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniTomcat》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • so long
    老师请教一个问题,ServletProcessor没有设置响应头Content-Length,浏览器不会有拆包或者粘包的问题吗?

    作者回复: 好问题啊。这个情况记住三点,一,要设置content-length 二,或者指定transfer-encoding为chunked,三,都不指定,可用短连接,即服务器关闭连接。 不符合三点的情况,大概率出问题。MiniTomcat是简化教学版本,是短连接,只是探讨了一下chunked方式。

    2023-12-18归属地:浙江
    1
  • HH🐷🐠
    🤪匹配 web.xml 或注解定义的 servlet 名称, 找到就可以当做动态 servlet。 不知道对不对, 想法比较单调, 希望老师和朋友给出点评和意见

    作者回复: web.xml是经典方法

    2023-12-13归属地:广东
    1
  • Xiaosong
    欸 从来没 单独编译过单独的 java文件,我看target里面不编译test dir底下的文件,请教一下怎么操作

    作者回复: 你用IDEA,把Gitee上的项目拉下来,然后编译。

    2024-01-27归属地:美国
  • Geek_50a5cc
    所以 Servlet 动态资源的 classloader 都是去 编译后的classes定位需要的Servlet,对吗

    作者回复: 对的

    2023-12-15归属地:北京
  • 彩笔采购
    啊我悟了

    作者回复: 恭喜啊!希望分享一下。

    2023-12-15归属地:河南
  • peter
    请教老师几个问题: Q1:老师开发用的IDE是Idea吗? 我用Idea2019,打开老师的第三课代码,打开HttpServer.java,运行main函数,提示编译错误:“Error:java: 错误: 不支持发行版本 5”。 我的电脑上java版本是java8。老师的代码只有三部分:src目录、webroot目录、pom.xml,都没有包含Java版本信息啊。 Note1:其中一部分代码是: if (index2 > index1) return requestString.substring(index1 + 1, index2); 对于这个代码,idea2019的提示是:'if'没有加大括号。) Note2: import java.time.ZonedDateTime; 对于此导包,有红色下划线,Idea2019提示“Usage of API documented as @since 1.8+ ”。这个有影响吗? Q2:Response类只有这些内容吗? 本课中,Response只当做实体类处理,实体类的话,应该包含响应的多个字段,比如状态行、响应头等字段,但本文只有Request和OutputStream,是没有全部列出来吗? Q3:对于图片,Response是怎么处理的? 把图片也当做文件,读取文件,读出的结果应该是二进制数据,然后把二进制数据放到response的响应体中,是这样吗?

    作者回复: Q1,代码再IDEA上都是可编译运行的,你是再Gitee上拿的完整代码吗?文本中的代码只是主体部分,因为篇幅原因,不完整。 Q2,学到这节课,Response只有这么一点点。Mini系列课程的风格都是从无到有一点点长大,后面的章节回逐步完善它。 Q3,request和response都可以处理文件,Multipart/form-data,你可以看看http协议的规定。MiniTomcat没有实现。我们的主要目标是servlet容器。

    2023-12-14归属地:北京
    2
  • Martito
    为什么我编译这个HelloServlet.java报错呢 idea中也没有提示错误呀
    2023-12-19归属地:山东
    1
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部