Servlet生命周期
先创建一个简单的项目
目录结构如下:
创建HelloServlet类,实现Servlet接口
为了方便演示,这里对每个方法进行了打印操作。
package com.zhenghui;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
@Override
public void destroy() {
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service");
}
public HelloServlet() {
System.out.println("This is a HelloServlet");
}
}
编辑web.xml进行Servlet的映射及配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JavaWeb_HelloWord</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--配置servlet -->
<servlet>
<!--Servlet 注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!--Servlet 的全类名 -->
<servlet-class>com.zhenghui.HelloServlet</servlet-class>
</servlet>
<!--映射servlet -->
<servlet-mapping>
<!--需要和某一个Servlet的servlet-name子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!--映射具体的访问路径:/代表当前WEB应用的根目录-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
启动,测试
刷新测试
由于我刷新了好几次,所以会打印多了service
关闭服务测试
由前面两个实验可以看得出,Servlet生命周期生效的有四个方法,分别为:
1、构造方法:只被调用一次,只有第一次请求Servlet时,创建Servlet时被调用。
2、init方法:只被调用一次。在创建好实例后立即被调用。用于初始化当前Servlet。
3、service方法:被多次调用。每次请求都会调用。相应请求的。
4、destroy方法:只被调用一次,在当前Servlet所在的web应用在被关闭前调用。用于释放当前Servlet所占用的资源。
其他
<!--可以指定Servlet被创建的时机 -->
<load-on-startup>2</load-on-startup>
<!--配置servlet -->
<servlet>
<!--Servlet 注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!--Servlet 的全类名 -->
<servlet-class>com.zhenghui.HelloServlet</servlet-class>
<!--可以指定Servlet被创建的时机 -->
<load-on-startup>2</load-on-startup>
</servlet>
<!--配置servlet -->
<servlet>
<!--Servlet 注册的名字 -->
<servlet-name>ceshiServlet</servlet-name>
<!--Servlet 的全类名 -->
<servlet-class>com.zhenghui.ceshiServlet</servlet-class>
<!--可以指定Servlet被创建的时机 -->
<load-on-startup>5</load-on-startup>
</servlet>
<!--映射servlet -->
<servlet-mapping>
<!--需要和某一个Servlet的servlet-name子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!--映射具体的访问路径:/代表当前WEB应用的根目录-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!--映射servlet -->
<servlet-mapping>
<!--需要和某一个Servlet的servlet-name子节点的文本节点一致 -->
<servlet-name>ceshiServlet</servlet-name>
<!--映射具体的访问路径:/代表当前WEB应用的根目录-->
<url-pattern>/ceshi</url-pattern>
</servlet-mapping>