# jerrymouse **Repository Path**: liu-yu-hang111/jerrymouse ## Basic Information - **Project Name**: jerrymouse - **Description**: A mini-tomcat-like server. - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 24 - **Created**: 2024-01-14 - **Last Updated**: 2024-01-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: Tomcat, Java ## README 跟着[廖雪峰网站](https://www.liaoxuefeng.com/wiki/1545956031987744)上的教程写的 # 技术要点 ## Servlet规范 Servlet规范是Java Servlet API的规范,用于定义Web服务器如何处理HTTP请求和响应。Servlet规范有一组接口,对于Web App来说,操作的是接口,而真正对应的实现类,则由各个Web Server实现,这样一来,Java Web App实际上编译的时候仅用到了Servlet规范定义的接口,只要每个Web服务器在实现Servlet接口时严格按照规范实现,就可以保证一个Web App可以正常运行在多种Web服务器上: ![](pics/servlet.png) ## Servlet处理流程 当`Servlet`容器接收到用户的`HTTP`请求后,由容器负责把请求转换为`HttpServletRequest`和`HttpServletResponse`对象,分别代表HTTP请求和响应,然后,经过若干个`Filter`组件后,到达最终的`Servlet`组件,由`Servlet`组件完成`HTTP`处理,将响应写入`HttpServletResponse`对象: ![](pics/servetProcess.png) 其中,ServletContext代表整个容器的信息,如果容器实现了ServletContext接口,也可以把ServletContext可以看作容器本身。ServletContext、HttpServletRequest和HttpServletResponse都是接口,具体实现由Web服务器完成。Filter、Servlet组件也是接口,但具体实现由Web App完成。此外,还有一种Listener接口,可以监听各种事件,但不直接参与处理HTTP请求,具体实现由Web App完成,何时调用则由容器决定。因此,针对Web App的三大组件:Servlet、Filter和Listener都是运行在容器中的组件,只有容器才能主动调用它们。 ## 实现Servlet服务器 ![](pics/HttpExchangeAdapter.png) 把HttpExchange转换为HttpServletRequest和HttpServletResponse要用到`适配者模式`,没搞懂这个HttpExchangeAdapter的作用在哪。 HttpServletRequestImpl里放一个HttpExchange实例不行么? ## 实现ServletContext 一个Web应用对应一个`ServletContext`,`ServletContext`用于提供初始化和全局配置,共享数据,管理`Filter`和`Listener`等组件。 它维护一组Servlet,并根据路由将请求分配给不同Servlet。 细节方面,从Servlet 3.0规范开始,我们必须要提供addServlet()动态添加一个Servlet,并且返回ServletRegistration.Dynamic,因此,我们在initialize()方法中调用addServlet(),完成所有Servlet的创建和初始化。