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 基础的 OOP
HttpServletRequest 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() 被调用..");
}