前言:刚好想起来了servlet,然后就去重新学习了一下。写这篇文章的目的就是为了简单记录servlet相关的知识点。内容包括快速入门体验、生命周期、体系结构、urlPattern和xml方式配置Servlet。
其实很多都已经不用了。
所谓Servlet,其实就是和JDBC一样,是一套官方制定的规范。所以,其本质其实就是接口。
1.Servlet快速案例
1、导入Servlet相关依赖
<!--加入servlet依赖(servlet的jar)-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--jsp的依赖(jsp相关的jar加进来)-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
自己去Maven仓库找一个也行,我也是随便找的。
2、添加@WebServlet注解,并实现servlet接口
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @version 1.0
* @date 2023/4/25 20:41
*/
@WebServlet("/demo")
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("调用service方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- 核心方法就是service()。在运行时,会由Tomcat创建对应的Servlet对象,调用对应的service方法。
- @WebServlet注解用来指定资源路径。
3、访问路径http://主机名:端口号/项目名/路径名,控制台查看结果。项目名在tomcat的配置文件可以自己修改。
2.Servlet生命周期
对象的生命周期指一个对象从被创建到被销毁的整个过程。
Servlet运行在servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段
-
加载和实例化: 默认情况下,当Servlet第一次被访问时,由Tomcat容器创建Servlet对象。因此可以设置 @WebServlet(value = “/demo”,loadOnStartup = 1)。loadOnStartup 为负数则默认第一次访问时创建。0或正数,服务器启动时创建。数字越小,优先级越高。
-
初始化:在Servlet实例化之后,容器将调用Servlet的 init() 方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只 调用一次。
-
请求处理: 每次请求servlet时,Servlet容器都会调用Servlet的 service() 方法对请求进行处理
-
服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的 destroy() 方法完成资源的释放。在destroy0方法调用之后,容器会释放这个servlet实例,该实例随后会被Java的垃圾收集器所回收
3.Servlet体系结构
HttpServlet里面有两个方法,doGet() 和 doPost() 分别用来处理Get请求和Post请求。
如果查看HttpServlet源代码可以知道,其实就是实现了Servlet接口,调用了service()方法。然后对请求的方式进行判断,分别进行逻辑处理。使用起来,更加方便。
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @version 1.0
* @date 2023/6/25 21:35
*/
@WebServlet("/HttpServletDemo")
public class HttpServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost.......");
}
}
当然,里面还有其他方法。
但是主要是这两个方法。
3、Servlet urlPattern匹配规则
当有多个规则匹配时,优先更精确的
优先级:精确匹配 > 目录匹配 > 扩展名匹配 > /* > /
4.XML配置Servlet
3.0版本之前常用。3.0之后已经支持WebServlet()的方式。基本上已经不用了,下面写一个使用xml配置一个Servlet的例子。
<!-- 配置Servlet信息 -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>ServletDemo</servlet-class>
</servlet>
<!-- 配置Servlet访问路径 -->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
这样一个名叫demo1的servlet就配好了,他的访问路径是/demo1,绑定的class文件是ServletDemo