Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
-
Servlet 生命周期
创建→初始化→处理请求→销毁
Servlet 通过调用 init () 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 通过调用 destroy() 方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。 -
Servlet 特征
(1)Servlet是单例多线程
(2)一个Servlet实例只有执行一次无参构造器inint()方法,并且是在第一次访问时执行。
(3)用户提交一次对当前Servlet请求,就会执行一次service()方法。
(4)一个Servlet实例只有执行一次destroy()方法,在应用停止时执行。
(5)由于Servlet时单例多线程的,所以为了保证器线程安全性,一般情况下时不为Servlet实例定义可修改的成员变量的。因为每一个线程均可修改这个成员变量,会出现线程安全问题。
(6)默认情况下,Servlet在web容器启动时时不会被实例化的。
接下来,创建一个程序来观察Servlet生命周期
编译环境:windows10,eclipse Java EE, Tomcat v9.0
项目结构图如下
ServletLife.java(Servlet类要实现Servlet接口)
package com.servlet;
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 ServletLife implements Servlet {
public ServletLife() {
// TODO Auto-generated constructor stub
System.out.println("create servlet");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy servlet");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("proccess servlet");
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init servlet");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("servlet service()");
}
}
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app id="WebApp_ID" version="3.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- 注册servlet -->
<servlet>
<servlet-name>servletLife</servlet-name>
<servlet-class>com.servlet.ServletLife</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletLife</servlet-name>
<url-pattern>/servletLifeCycle</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
在web.xml文件中,访问顺序为url-pattern→servlet-mapping中的servlet-name→servlet中的servlet-name→servlet-class
其中
1)servlet-mapping中的servlet-name和servlet中的servlet-name需要一致。
2)url-pattern 标签中的值是要在浏览器地址栏中输入的 url,可以自己命名。
3)servlet-class 标签中的内容是Servlet的类,在这里是com.servlet.ServletLife
运行截图如下:
1.部署项目,启动Tomcat
2.访问http://localhost:8082/01-servletLifeCycle/servletLifeCycle
3.在eclipse中的console中查看执行结果
可见,Servlet类已被实例和初始化,并开始执行service()方法。
4.再访问http://localhost:8082/01-servletLifeCycle/servletLifeCycle
5.在eclipse中的console中查看执行结果
可见,web容器并没有重新实例一个ServletLife类,而是调用原来ServletLife实例中的service()方法。
6.关闭网页,控制台没有输出任何信息。
7.关闭Tomcat
8.查看控制台信息
发现执行了ServletLife中的destroy()方法。