文章目录
- Servlet 生命周期
- 主要有三个方法
- ● 示意图
- ● 初始化阶段
- ● 处理浏览器请求阶段(service 方法)
- ● 终止阶段 destory 方法(体现 Servlet 完整的生命周期)
- ● 代码演示
Servlet 生命周期
主要有三个方法
1. init()初始化阶段
2. service()处理浏览器请求阶段
3. destroy()终止阶段
● 示意图
● 初始化阶段
Servlet 容器(比如: Tomcat)加载 Servlet,加载完成后,Servlet 容器会创建一个 Servlet 实例并调用 init()方法,init()方法只会调用一次, Servlet 容器在下面的情况装载 Servlet
1. Servlet 容器(Tomcat)启动时自动装载某些 servlet,实现这个需要在 web.xml 文件中添加 1 1 表示装载的顺序
2. 在 Servlet 容器启动后,浏览器首次向 Servlet 发送请求(这个前面说过)
3. Servlet 重新装载时(比如 tomcat 进行 redeploy【redeploy 会销毁所有的 Servlet 实例】), 浏览器再向 Servlet 发送请求的第 1 次
● 处理浏览器请求阶段(service 方法)
-
每收到一个 http 请求,服务器就会产生一个新的线程去处理[线程]
-
创建一个用于封装 HTTP 请求消息的 ServletRequest 对象和一个代表 HTTP 响应消息的 ServletResponse 对象
-
然后调用 Servlet 的 service()方法并将请求和响应对象作为参数传递进去
● 终止阶段 destory 方法(体现 Servlet 完整的生命周期)
当web 应用被终止,或者Servlet 容器终止运行,或者Servlet 类重新装载时,会调用 destroy() 方法, 比如重启 tomcat ,或者 redeploy web 应用
● 代码演示
开发 Servlet, 通常编写 doGet、doPost 方法。来对表单的 get 和 post 请求进行分发处理
HTML部分
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>注册</title>
</head><body><h1>注册用户</h1><form action="http://localhost:10000/do_servlet/ok" method="post">u: <input type="text" name="username" /><br><br><input type="submit" value="注册用户" /></form>
</body></html>
-
- service 方法处理浏览器的请求(包括 get/post)
-
- 当浏览器每次请求 Servlet 时,就会调用一次 service
-
- 当 tomcat 调用该方法时,会把 http 请求的数据封装成实现 ServletRequest 接口的 request 对象
-
- 通过 servletRequest 对象,可以得到用户提交的数据
-
- servletResponse 对象可以用于返回数据给 tomcat->浏览器
Servlet.java部分
/*** 1. service 方法处理浏览器的请求(包括 get/post)* 2. 当浏览器每次请求 Servlet 时,就会调用一次 service* 3. 当 tomcat 调用该方法时,会把 http 请求的数据封装成实现 ServletRequest 接口的 request 对象* 4. 通过 servletRequest 对象,可以得到用户提交的数据* 5. servletResponse 对象可以用于返回数据给 tomcat->浏览器** @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/
@Override
public void service(ServletRequest servletRequest,ServletResponse servletResponse)throws ServletException,IOException{count++;// 如果 count 的值,在不停的累计,说明 HelloServlet 是单例的System.out.println("hi HelloServlet~ count= "+count);// Tomcat 每处理一次 http 请求,就生成一个新的线程System.out.println("当前线程 id= "+Thread.currentThread().getId());// 1. ServletRequest 没有得到提交方式的方法// 2. ServletRequest 看看 ServletRequest 子接口有没有相关方法// 3. 小技巧:ctrl+alt+b => 可以看到接口的子接口和实现子类// 4. 把 servletReqeust 转成 HttpServletRequest 引用// 5. 仍然是 Java 基础的 OOPHttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;String method=httpServletRequest.getMethod();if("GET".equals(method)){doGet(); // 用 doGet() 处理 GET 请求}else if("POST".equals(method)){doPost(); // 用 doPost() 处理 POST 请求}}/*** 用于响应 get 请求的*/
public void doGet(){System.out.println("doGet() 被调用..");}/*** 用于响应 post 请求的*/
public void doPost(){System.out.println("doPost() 被调用..");}