HttpServlet
HttpServlet 介绍
- HttpServlet 是 Servlet 规范的一部分,继承 GenericServlet,专门为 HTTP 协议准备,比 GenericServlet 更加适合 HTTP 协议下的开发。
- HttpServletRequest 继承 ServletRequest,是 HTTP 协议专用的请求对象,封装 HTTP 请求的全部内容,面向 HttpServletRequest 接口编程就能够获得 HTTP 请求中的全部信息。
- HttpServletResponse 继承 ServletResponse,是 HTTP 协议专用的响应对象。

模板方法设计模式
- 模板方法模式,定义一个操作中算法的骨架,将步骤的具体实现延迟到子类中。使得子类可以在不改变一个算法的结构的情况下,就可以重定义该算法的某些特定步骤。
- 为什么用模板方法设计模式:因为生活中很多事物可以抽取共性,这些共性可以固化为骨架,个性的东西交给具体实现。
- 模板方法的优势:既统一了算法,也提供了很大的灵活性。父类模板方法确保算法结构不变,子类提供部分步骤的实现。

HttpServlet 源码解析 – init 方法
- HttpServlet 并没实现 init 方法,使用的父类 GenericServlet 的 init 方法
- Java 程序员可以选择实现无参数的 init 方法,实现初始化逻辑


HttpServlet 源码解析 – service 方法
- 从 GenericServlet 继承的 service 方法

- HttpServlet 定义的 service 方法,使用了模板方法设计模式。
- 模板方法定义了算法骨架,不同请求方法类型执行不同的分支。
- Java 程序员自定义 Servlet 继承 HttpServlet,不去重写 service 方法,而是根据请求方法类型重写对应的 doXXX方法。

为什么不建议Java程序员重写 service 方法?
- HttpServlet 的 service 方法包含请求方法类型检查的逻辑
- 例如,如果请求方法类型是 POST,但Java程序员没有重写 doPost 方法,会报405错误
- 因此,正规的开发流程是,Java程序员(后端程序员)定义请求方法类型,前端使用对应的类型发送请求,前后端保持一致。

为什么我们自定义的Servlet get 方法没有使用缓存?
- 想要自定义 Servlet get要使用缓存,那么需要维护数据的最近变更时间,并告知浏览器。
- 这种机制比较复杂,非静态资源数据不建议使用。
- 我们可以使用后端缓存,不使用浏览器的缓存机制。

Get请求使用缓存机制说明
- lastModified:服务端维护的最近修改时间,数据有变更就更新
- ifModifiedSince:浏览器维护的最近修改时间,发现跟服务端返回的最新修改时间不一致时更新

HttpServletRequest 接口详解-请求对象由谁创建
思考: HttpServletRequest 是接口,那接口的实现类是谁定义的?实现类的对象是谁创建的?
- 实现类由 web 服务器(Tomcat)定义,实现类的对象由 web 服务器创建并传入 service 方法
- 但我们并不需要关心实现类,只需要面向 HttpServletRequest 接口编程
思考: HttpServletRequest 中封装了哪些信息?
- 封装了 HTTP 请求的全部信息
- 客户端遵循 HTTP 协议,发送的请求符合 HTTP 请求格式要求,web 服务器按照 HTTP 请求格式解析数据并封装到 HttpServletRequest 实现类的对象中,将该对象传入 service 方法

HttpServletRequest 接口详解-获取浏览器提交的数据
通过以下四个方法获取前端浏览器提交的数据

为什么参数值是 String[ ] 类型?
