HttpServlet

144 阅读3分钟

HttpServlet 介绍

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

image.png

模板方法设计模式

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

image.png

HttpServlet 源码解析 – init 方法

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

image.png

image.png

HttpServlet 源码解析 – service 方法

  • 从 GenericServlet 继承的 service 方法

image.png

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

image.png

为什么不建议Java程序员重写 service 方法?

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

image.png

为什么我们自定义的Servlet get 方法没有使用缓存?

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

image.png

Get请求使用缓存机制说明

  • lastModified:服务端维护的最近修改时间,数据有变更就更新
  • ifModifiedSince:浏览器维护的最近修改时间,发现跟服务端返回的最新修改时间不一致时更新

image.png

HttpServletRequest 接口详解-请求对象由谁创建

思考: HttpServletRequest 是接口,那接口的实现类是谁定义的?实现类的对象是谁创建的?

  • 实现类由 web 服务器(Tomcat)定义,实现类的对象由 web 服务器创建并传入 service 方法
  • 但我们并不需要关心实现类,只需要面向 HttpServletRequest 接口编程

思考: HttpServletRequest 中封装了哪些信息?

  • 封装了 HTTP 请求的全部信息
  • 客户端遵循 HTTP 协议,发送的请求符合 HTTP 请求格式要求,web 服务器按照 HTTP 请求格式解析数据并封装到 HttpServletRequest 实现类的对象中,将该对象传入 service 方法

image.png

HttpServletRequest 接口详解-获取浏览器提交的数据

通过以下四个方法获取前端浏览器提交的数据

image.png

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

  • 因为提交的数据如果允许多选,值的类型就是数组

image.png