Servlet继承关系与生命周期

Servlet的继承关系

image-20220331223030179

可以看出Servlet下面有GenericServlet,而HttpServlet继承了GenericServlet

Servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package javax.servlet;

import java.io.IOException;

public interface Servlet {
void init(ServletConfig var1) throws ServletException;

ServletConfig getServletConfig();

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

String getServletInfo();

void destroy();
}

service发起请求该方法会被自动调用,而在器Httpservlet中service方法中方法不是抽象的,而在 service方法中,会首先获取表单请求的方法,进行判断调用相关的方法

image-20220402102213041

doget与dopost方法

1
2
3
4
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = lStrings.getString("http.method_post_not_supported");
this.sendMethodNotAllowed(req, resp, msg);
}

而在调用的sendMethodNotAllowed的方法,会给出响应的操作

image-20220402102433764

而对于405方法,httpsServlet中这些do方法都是405的实现风格,否则会报405错误,因此在新建servlet时,我们会区重写do方法。

Servlet的生命周期

首先我们的Servlet方法是Tomact容器去调用的,而servlet的生命周期init,service,destory正是者三个方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.zss.servlets;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

/**
* @author zss
*/
public class TestServlet extends HttpServlet {
@Override
public void init(){
System.out.println("正在初始化");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse response){
System.out.println("正在服务中");
}
@Override
public void destroy(){
System.out.println("销毁");
}
}

image-20220402104250832

当我们启动tomcat时,并且发送请求,容器自动初始化,并且开启服务,而当我们刷新了页面,相当于我们重新提交了一次请求,会再一次调用service方法,当我们销毁的时候,也就是tomcat关闭的时候,会调用destroy方法。

而其实在底层时tomcat服务器通过反射给与我们进行实例化,所有的请求只会通过一个实例进行操作。

这样的好处是,我们的系统初始化比较快,但是第一次请求比较慢,如果需要提高servlet的效应速度,则应该初始化响应的时机

Servlet的初始化时机

  1. 默认第一次进行初始化
  2. 通过servletload进行初始化,值最小,初始化越前,tomcat会自动进行服务,最小值为0
1
2
3
4
5
6
7
8
9
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.zss.servlets.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>

Servlet在容器中是单例的,线程不安全的,因为所有的实例都是通过一个实例进行请求,所以尽量不要在servlet中设置成员变量,也不要通过servlet的值进行一些逻辑判断