第一个servlet和servlet的生命周期
1.导入依赖
首先,我们需要在pom.xml中配置所需要的jar包:在maven官网中去下载:直接在浏览器中搜索maven仓库
然后搜索需要的jar包:
Servlet程序需要的jar包为:servlet-api
选择所需要的版本:
然后复制依赖:
将依赖粘贴到pom文件中:
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
在src/main下写.java文件。
2.书写servlet(实现Servlet接口)
package com.dh.servlet;
import javax.servlet.*;
import java.io.IOException;
public class Servlet01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3.书写web.xml配置文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<!-- 名字随便取-->
<servlet-name>servlet01</servlet-name>
<!-- 类的全称限定名-->
<servlet-class>com.dh.servlet.Servlet01</servlet-class>
</servlet>
<!-- servlet映射-->
<servlet-mapping>
<!-- 与上述的名字必须一致-->
<servlet-name>servlet01</servlet-name>
<!-- 路径,以/开头,是一个虚拟路径,可以写多个,但是不能重复-->
<url-pattern>/servlet01</url-pattern>
</servlet-mapping>
</web-app>
即将自己写的servlet类与访问路径绑定起来。
此时访问一下该路径:
空白是因为此时还没有在方法中书写内容。
4.Servlet接口中的方法
Servlet接口中的方法共有五个:
public void init(ServletConfig servletConfig);//初始化方法,初始化servlet对象
public void service(ServletRequest servletRequest, ServletResponse servletResponse);//提供服务的方法,主要的代码都是在service中书写
public void destroy();//销毁servlet方法
public ServletConfig getServletConfig();//获取servletConfig对象
public String getServletInfo();//获取servlet信息
方法中书写内容:
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init......");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service.......");
}
@Override
public void destroy() {
System.out.println("destroy......");
}
然后启动服务器:
在浏览器中输入http://localhost:8080/servlet_01_javaweb/servlet01,控制台上输出了:
init......
service.......
三次刷新浏览器:
init......
service.......
service.......
service.......
service.......
关闭服务器:
//一堆信息
destroy......
//一堆信息
所以,可以得出结论:在浏览器发送请求时,会执行init()初始化servlet对象,然后执行service(),然后每次请求都会执行一次service(),关闭服务器会执行destroy()。
即:
init()和destroy()只执行一次,分别在初始化servlet对象和销毁servlet对象时执行;
service()方法可能执行多次,每次刷新浏览器,即发送请求时,都会执行service()。
5.提前init()的执行
在默认情况下,init()是在发送请求时才会执行,但是我们可以设置其在服务器启动的时候就执行:
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>com.dh.servlet.Servlet01</servlet-class>
<!-- 将init()提前到启动服务器时执行-->
<!-- 数字为0,1,2...都可,越小级别越高-->
<load-on-startup>0</load-on-startup>
</servlet>
6.servlet的生命周期
-
在浏览器中输入URL;
-
web容器截取URL中的URI;
-
web容器在容器上下文中查找URI对应的servlet对象:
若没有找到,则通过web.xml获得servlet的完整类名,然后通过反射实例化servlet对象,调用init()进行初始化,然后调用service()提供服务;
若找到了,则直接使用servlet对象调用service()提供服务。
-
当web容器关闭,项目重新部署,或者长时间未访问该servlet时,servlet对象就会调用destroy()。