Lazy loaded image
技术分享
Servlet、Filter、Listener
00 min
2019-9-18
2024-11-25
type
status
date
slug
summary
tags
category
icon
password

一. Servlet

1. 什么是 Servlet ?

Java Servlet 是运行在服务器上的程序,Servlet 本身是一个接口,多数人所说的 Servlet 泛指一个实现了此接口的类,用于扩展基于 HTTP 协议的 web服务器(如 Tomcat,就是一个Servlet容器 ),从而实现网页上的一些交互功能。交互的实现:客户端通过 HTTP 协议发送请求到服务器,服务器调用 Servlet 对请求生成响应后返回给客户端。
SpringBoot 内置了三种 Servlet容器
  • Tomcat:默认web服务器,最稳定,最好
  • Jetty:最垃圾
  • Undertow:更适用于IO密集型服务器,性能和Tomcat差不多

2. Servlet 原理

Servlet 生命周期
  1. 初次访问,调用 init() 和 service() 方法
  1. 后续访问,调用 service() 方法
  1. 关闭 Tomcat 服务器,调用 destroy() 方法
ServletConfig 接口 Tomcat 实现了 ServletConfig 接口,提供此对象,从而调用 init() 方法初始化 Servlet
ServletContext 接口(三大域对象之一,另外两个是request,session) Tomcat 实现 ServletContext 接口,该对象是一个全局的储存信息的空间,被称为 Servlet应用程序,它提供了所有 Servlet 所共有的各种资源和功能的访问(即共享),交互时所有用户共用一个 ServletContext 对象可以节省空间,提高效率。
ServletContext 和 request 可以实现 Servlet 之间的通讯 使用request域,request对象会随着请求的结束而结束,资源会被回收(最常用) 使用ServletContext会消耗大量的资源
ServletContext 里保存的对象被称为属性(Attribute),以下方法负责处理属性
GenericServlet 抽象类
GenericServlet 类实现了 Servlet和ServletConfig 接口,对其中的所有方法提供了默认实现,从而简化了代码的维护
HttpServlet 抽象类
HttpServlet 扩展了 GenericServlet,提供了两个 service() 的重写方法,同时定义了7个do方法,分别为:doGet,doPost,doHead,doPut,doTrace,doOptions,doDelete
其中,doGet 和 doPost 方法最常用,这就是为什么我们自己定义一个Servlet,它继承 HttpServlet 后不需要自己重写 service 方法而只需要重写 doGet 或 doPost 方法的原因

3. HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网应用最广泛的一种网络协议,它是TCP/IP协议的一个应用层协议
notion image
notion image
notion image
notion image

4. 请求 和 响应

HttpServletRequest 接口 提供了获得请求行、请求头、请求体里各类信息的方法 service中默认使用ISO-8859-1编码,要解决中文乱码,则: doGet方法中:parameter = newString(parameter.getbytes("iso8859-1"),"utf-8"); doPost方法中:request.setCharacterEncoding("UTF-8");
HttpServletResponse 接口 提供各种响应错误代号,常见404,500等
以流的方式加载请求数据到response缓冲区,随后由Tomcat返回响应到客户端

二. Filter(过滤器)

1. 什么是 Filter?

在客户端和Servlet容器间添加过滤器,可以拦截web资源,并在服务器获取请求前和客户端获取响应前指定特殊功能
notion image

2. 编写过滤器

  1. 实现 Filter接口,重写 doFilter()方法
  1. 在 web.xml 中配置 filter
  1. SpringBoot中没有filter的配置文件,则在Filter上使用 @WebFilter 注解,在启动类上加 @ServletComponentScan(basePackages=“全包名”)
Filter 生命周期
  1. filter对象创建时执行 init() 方法初始化
  1. 每次拦截到请求,就执行过滤方法 doFilter()
  1. 服务器关闭,执行 destroy() 方法销毁

3. Interceptor(拦截器)

SpringMVC中使用拦截器,它是过滤器的升级版,使用方法如下
  1. 实现 HandlerInterceptor接口 并重写方法
  1. 在 springmvc.xml 中配置拦截器
  1. SpringBoot没有配置文件,则写一个配置类,实现 WebMvcConfigurer接口

三. Listener(监听器)

1. 什么是 Listener?

监听器可以监听web中对象的创建、销毁、增加,修改,删除等动作的发生,然后通过回调函数进行响应处理

2. Servlet 监听器

上一篇
SpringMVC
下一篇
JDBC