主要有三个方法
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() 被调用.."); }