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

07|对内的保护:引入门面模式封装内部实现类

你好,我是郭屹。今天我们继续手写 MiniTomcat。
在前面的学习内容中,我们为了符合 Servlet 规范,新增了 HttpRequest 与 HttpResponse 类,但截止到现在我们只对 Request 请求相关的代码进行了实现,所以这节课我们就来改造 Response 返回代码。
另外,我们也注意到,在 HttpProcessor 类里,我们直接使用的是 HttpRequest 与 HttpResponse,这两个对象要传入 Servlet 里,但在这两个类中我们也定义了许多内部的方法,一旦被用户知晓我们的实现类,那么这些内部方法就暴露在用户面前了,这是我们不愿看到的,也是我们需要规避的。因此这节课我们计划用门面(Facade)设计模式来解决这个问题。
下面就让我们一起来动手实现。

项目结构

这节课的项目结构主要新增了 HttpRequestFacade.java 与 HttpResponseFacade.java 两个类,如下所示:
MiniTomcat
├─ src
│ ├─ main
│ │ ├─ java
│ │ │ ├─ server
│ │ │ │ ├─ DefaultHeaders.java
│ │ │ │ ├─ HttpConnector.java
│ │ │ │ ├─ HttpHeader.java
│ │ │ │ ├─ HttpProcessor.java
│ │ │ │ ├─ HttpRequest.java
│ │ │ │ ├─ HttpRequestFacade.java
│ │ │ │ ├─ HttpRequestLine.java
│ │ │ │ ├─ HttpResponse.java
│ │ │ │ ├─ HttpResponseFacade.java
│ │ │ │ ├─ HttpServer.java
│ │ │ │ ├─ Request.java
│ │ │ │ ├─ Response.java
│ │ │ │ ├─ ServletProcessor.java
│ │ │ │ ├─ SocketInputStream.java
│ │ │ │ ├─ StatisResourceProcessor.java
│ │ ├─ resources
│ ├─ test
│ │ ├─ java
│ │ │ ├─ test
│ │ │ │ ├─ HelloServlet.java
│ │ ├─ resources
├─ webroot
│ ├─ test
│ │ ├─ HelloServlet.class
│ ├─ hello.txt
├─ pom.xml
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了在编写MiniTomcat过程中引入门面模式封装内部实现类的过程。作者首先提到了在前面的学习内容中新增了HttpRequest与HttpResponse类,但目前只对Request请求相关的代码进行了实现,因此需要改造Response返回代码。为了避免内部方法暴露在用户面前,作者计划使用门面设计模式来解决这个问题。文章详细介绍了项目结构的变化,新增了HttpRequestFacade.java与HttpResponseFacade.java两个类。接着,文章对Response返回信息解析进行了详细的讲解,包括状态行、响应头、空行、响应体的组成,以及对头部信息的操作和sendHeaders方法的实现。最后,文章提到了在HttpProcessor中将原来引用或初始化Response类的地方全部用HttpResponse替代,并完成了HttpRequest与HttpResponse的替换。整体来说,本文通过实际的代码示例和详细的讲解,帮助读者了解了如何引入门面模式来封装内部实现类,以及在MiniTomcat项目中对Response返回代码的改造过程。文章内容涉及门面设计模式的应用、Facade模式的结构图、HttpRequestFacade与HttpResponseFacade的定义、以及在ServletProcessor中的应用,为读者提供了深入理解门面模式在实际项目中的应用的指导。

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

全部留言(4)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:addHeader与setHeader代码相同,不就重复了吗? HttpResponse中的这两个类,代码完全相同,重复啊。 Q2:sendHeaders方法和servlet.service是分别输出到浏览器吗? ServletProcessor类的process方法中,先是调用response.sendHeaders(); 这个方法是把头部信息输出到浏览器吗?紧接着又调用servlet.service,这个方法是输出内容到浏览器。这两次输出是顺序完成的吗?感觉应该是一起输出到浏览器才对,不过用了两个方法,感觉是分别输出到浏览器。 Q3:newInstance过时了,替代方法是什么? 我用Idea2019,对于“servlet = (Servlet) servletClass.newInstance(); ”这行代码,Idea提示此方法已经过时了。如果过时了,替代方法是什么? Q4:getMethod并没有被使用,对吗? HttpRequest中虽然实现了getMethod方法,但程序运行并没有使用此方法,对吗?(也许用了,但我没有看到) Q5:HttpRequestFacade类中的方法,为什么没有加override注解? 我这里Idea2019有红线提示,提示缺少override注解,但是能运行。 Q6:Tomcat源码大约多少行?老师一般用什么看Tomcat源码? 用SourceInsight?还是直接用Idea看? Q7:对URL为什么要用URLClassLoader?传统的几个ClassLoader难道不能加载吗?

    作者回复: Q1,实现代码一样的,但是对外是两个语义。 Q2,是先后输出的,一次交互中完成 Q3,替代方法是用constructor来新建实例 Q4,没用到,只是定义在这里了,大家知道原理。 Q5,Oerride是编译注解,加上是好习惯 Q6,不知道多少行,整个源代码大约是18M,我觉得有30-50万行吧。我直接用IDE看的源代码。 Q7,URLClassLoader是Java自己提供的,就是“传统”的啊。

    2023-12-23归属地:北京
    2
    1
  • 小四
    这个facade感觉用wrapper更合理一些吧?

    作者回复: 模仿Tomcat

    2024-03-20归属地:北京
  • 马以
    不希望外部修改的把方法设置为私有,只开放出必要的方法,设置为public

    作者回复: 但是可以强制转化后获取,Facade就是让这种强制转化失效

    2024-01-08归属地:广东
  • HH🐷🐠
    目前想到有两点 1,直接操作请求参数, 会有数据篡改嫌疑 2,影响正常流程, 比如已经调用 response.sendHeaders 方法, 开发人员不熟悉整个复杂流程步骤,有可能会重复调用。 请老师指点

    作者回复: 举个例子:如果没有Facade,而是直接传入了实现类ConcreteRequest,则写servlet的那个程序员,他在doGet(request,response)中可以这么写:(ConcreteRequest)request进行强制转换,这样就可以调用ConcreteRequest实现类里面的方法了,造成隐患。

    2023-12-24归属地:广东
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部