创建 Web 项目,导入 Servlet 依赖坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--
此处为什么需要添加该标签?
provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
-->
<scope>provided</scope>
</dependency>
在 Java 文件夹上右键创建一个类并实现 Servlet 接口
重写 service
方法,Servlet 被访问的时候,service
方法会自动执行
package com.itheima.web;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo1 implements Servlet {
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
要想 Servlet 被访问,需要配置访问路径
@WebServlet("/demo1")
运行时自动启动浏览器,在浏览器里输入正确的路径,IDEA 有信息返回。若提示端口被占用,cmd 里终结占用端口的程序即可。
Servlet由web服务器创建,Servlet方法由web服务器调用
因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法
对象的生命周期指一个对象从创建到被销毁的整个过程。
Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
默认情况,Servlet会在第一次访问被容器创建,但是如果创建Servlet比较耗时的话,那么第一个访问的人等待的时间就比较长,用户的体验就比较差,那么我们能不能把Servlet的创建放到服务器启动的时候来创建,具体如何来配置?
@WebServlet(urlPatterns = "/demo1",loadOnStartup = 1)
loadOnstartup的取值有两类情况
(1)负整数:第一次访问时创建Servlet对象
(2)0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理
服务终止:当需要释放内存或者容器关闭时(很少发生),容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
<aside>
💡 如何让 Servlet 中的 destroy()
方法被执行?
在Terminal命令行中,先使用mvn tomcat7:run
启动,然后再使用ctrl+c
关闭tomcat
</aside>
<aside>
💡 当 loadOnStartup
的值修改成 0 或正整数时,即使 Servlet 没有被访问,在服务器启动时也会实例化 Servlet 对象并执行 init()
方法。
</aside>
Servlet中总共有5个方法,我们已经介绍过其中的三个,剩下的两个方法作用分别是什么?