Servlet 生命周期
- 加载阶段:当 Web 应用程序第一次收到一个请求时,Servlet 容器会检查 Servlet 类是否已经加载,如果没有加载,Servlet 容器会把 Servlet 类加载到内存中。如果 Servlet 类实现了
javax.servlet.Servlet
接口,Servlet 容器会创建一个 Servlet 实例,但不会调用其任何方法。 - 初始化阶段:在 Servlet 实例创建后,Servlet 容器会调用其
init()
方法进行初始化。开发人员可以在init()
方法中初始化 Servlet 的一些资源,比如数据库连接、日志对象等。 - 请求处理阶段:当 Web 应用程序接收到一个请求时,Servlet 容器会检查请求是否已经匹配到一个 Servlet,如果匹配成功,Servlet 容器会创建一个新的线程并调用 Servlet 的
service()
方法。在service()
方法中,Servlet 可以根据请求类型调用不同的方法,如doGet()
、doPost()
、doPut()
、doDelete()
等,来处理请求并生成响应。 - 销毁阶段:当 Servlet 容器关闭时,或者 Web 应用程序被卸载时,Servlet 容器会调用 Servlet 的
destroy()
方法进行清理工作。在destroy()
方法中,开发人员可以释放 Servlet 初始化时创建的资源,如关闭数据库连接、关闭日志对象等。
Servlet 的工作原理
- 客户端向 Web 服务器发送一个 HTTP 请求。
- Web 服务器接收到请求,并根据请求的 URL 匹配到相应的 Servlet。
- Servlet 容器根据 Servlet 的生命周期创建 Servlet 实例,并调用其
init()
方法进行初始化。 - Servlet 容器创建一个
HttpServletRequest
对象,用于封装客户端发送的请求信息,并将该对象传递给 Servlet 的service()
方法。 - Servlet 根据请求的方法类型(GET、POST 等)调用相应的方法(
doGet()
、doPost()
等)处理请求,并生成相应的响应数据。 - Servlet 容器创建一个
HttpServletResponse
对象,用于封装响应数据,并将该对象传递给 Servlet 的service()
方法。 - Servlet 将生成的响应数据写入
HttpServletResponse
对象中。 - Servlet 容器将
HttpServletResponse
对象中的响应数据发送给 Web 服务器。 - Web 服务器将响应数据发送给客户端。
在整个过程中,Servlet 容器负责创建和销毁 Servlet 实例,调用 Servlet 方法,封装请求和响应数据等工作,而开发人员则需要实现 Servlet 的具体业务逻辑,如请求处理、数据读写等。