Servlet接口中有5个方法:
- init()方法:通常是完成初始化操作的。在xxxServlet对象被第一次创建出来后执行一次,可编写数据库连接池等操作
- service()方法:处理用户请求的核心方法。只要用户发送一次请求,service方法就执行一次
- destroy()方法:销毁xxxServlet对象的内存。tomcat服务器销毁xxxServlet对象前会调用一次,可编写销毁前的操作,如进行资源关闭、资源保存等
- getServletInfo()方法
- getServletConfig()方法
Servlet生命周期 :
- 默认情况下启动服务器的时候xxxServlet对象没有被实例化;
- 用户第一次请求的时候xxxServlet被实例化(相当于xxxServlet的无参构造方法被执行,一般不建议编写构造方法,容易让无参构造方法消失,导致xxxServlet无法被实例化,出现500错误(HTTP协议的错误状态码));
- xxxServlet对象被创建出来后,tomcat服务器马上调用 init() 方法和 service() 方法;
- 第二次请求或者第三次请求时,xxxServlet对象并没用重新被创建,还是使用之前的xxxServlet对象调用 service() 方法;
- 关闭服务器调用 destroy() 方法。
只要创建一个类继承Servlet接口都需要导入这5个方法,但有些方法不会被使用到,为了代码的可观看性可以编写适配器类。GenericServlet就是一个适配器。
GenericServlet:
GenericServlet 继承 Servlet接口(例如这里自己重新编写的GenericServlet类作为参考):
import javax.servlet.*;
import java.io.IOException;
/*
* 编写一个Servlet,起名:GenericServlet
* 以后所有的Servlet类都不直接继承Servlet接口了
* 直接继承GenericServlet类
* GenericServlet 就是一个适配器 抽象类中定义抽象方法(abstract)
* init 方法依旧会调用,tomact服务器调用的,
* 其中ServletConfig servletConfig也是由tomcat创建传给init方法
* */
public abstract class GenericServlet implements Servlet {
private ServletConfig config;//成员变量
// 使得init中的ServletConfig创建的对象能够被其他方法使用,使用 getServletConfig() 方法
@Override
public final void init(ServletConfig config) throws ServletException{
//servletConfig 变量是一个局部变量
//如果加上final 子类没有办法重写init方法 ,
//可再创建一个init方法,重写这个init()方法,调用重写的init方法
this.config = config;
this.init();//调用重写的init()方法
}
//这个init方法,供子类重写
public void init(){
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;
@Override
public void destroy() {
}
@Override
public String getServletInfo() {
return null;
}
}
再编写一个xxxServlet类继承GenericServlet这个适配器类
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
//通过 GenericServlet适配器 继承Servlet
//原来的Servlet接口中的 init() 方法依旧会调用,tomact服务器调用的
public class xxxServlet extends GenericServlet{
//GenericServlet中重写的 init() 方法
@Override
public void init() {
System.out.println("xxxServlet's init() method execute!");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("正在处理xxxServlet.....");
//在xxxServlet字类中使用ServletConfig对象
ServletConfig config = this.getServletConfig();
System.out.println("service方法是否可以获取到ServletConfig对象:"+config);
}
}
当我们运行启动服务器 第一次运行xxxServlet时 控制台会输出:
再次刷新页面控制台会输出:
可以看出,init()方法只调用了一次,请求多上次service()方法便会调用多少次。
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<!--起的名字-->
<servlet-name>xxxservlet</servlet-name>
<!--xxxServlet方法的路径-->
<servlet-class>com.xl.servlet.two.xxxServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--与上面的名字相同-->
<servlet-name>xxxservlet</servlet-name>
<!--url-->
<url-pattern>/xxx</url-pattern>
</servlet-mapping>
</web-app>
详情观看:12-改造GenericServlet_哔哩哔哩_bilibili