Servlet

Servlet

  • Servlet 是 java 提供的一门动态 web 资源开发技术
  • Servlet 是 JavaEE 规范之一,其实就是一个接口,将来我们需要定义 Servlet 类实现 Servlet 接口,并为 web 服务器运行 Servlet

快速入门

  1. 创建 Maven web 项目,导入 Tomcat 和 Servlet 依赖坐标

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <dependencies>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
    <!--由于Tomcat 自带 servlet jar 包,依赖只需在测试和编译生效,避免冲突-->
    </dependency>
    </dependencies>
    <build>
    <finalName>webDemo</finalName>
    <plugins>
    <plugin>
    <!--TOMCAT 插件-->
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
    </configuration>
    </plugin>
    </plugins>
    </build>
  2. 创建:定义一个类,实现 Servlet 接口,重写接口中的所有方法,并在 service 方法中输入一句话

    1
    2
    3
    4
    public class ServletDemo1 implements Servlet{
    public void service(){}
    System.out.println("service...")
    }
  3. 配置:在类上使用 WebServlet 注解,配置该 Servlet 的访问路径

    1
    2
    3
    @WebServlet("/demo1")
    public class ServletDemo1 implements Servlet{
    }
  4. 访问:启动 Tomcat, 浏览器输入 URL 访问该 Servlet

    1
    http://localhost:8080/web-demo/demo1

Servlet 执行流程

  • Servlet 由 Web 服务器创建, Servlet 方法由 Web 服务器调用

  • 服务器调用 Servlet 中的 service 方法 选择要显示的内容

Servlet 生命周期

  • 对象的生命周期指一个对象从被创建到被销毁的整个过程

  • Servlet 运行在 Servlet 容器( Web 服务器)中,其生命周期由容器管理,分为四个阶段

    1. 加载和实例化:默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet 对象,也可通过@WebServletloadOnStartup 属性配置,该属性默认为 -1 ,当该属性赋值为 0 或 正整数时,Servlet 对象会在服务器启动时创建,值大于 0 时,值越小,优先级越高

      1
      @WebServlet(urlPatterns = "/demo1", loadOnStartup = 1)
    2. 初始化:在 Servlet 实例化之后,容器调用 Servlet 的 init() 方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作,该方法只调用一次

    3. 请求处理:每次请求 Servlet 时, Servlet 容器都会调用 Servlet 的 service() 方法对请求进行处理

    4. 服务终止: 当需要释放内存或者容器关闭时,容器就会调用 Servlet 示例的 destory() 方法完成资源的释放,在 destory() 方法调用之后,容器会释放这个 Servlet 实例,该实例随后会被 Java 的垃圾收集器回收

Servlet 体系结构

开发 B/S 架构的 Web 项目,均针对 HTTP 协议,自定义 Servlet 继承 HttpServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {
//收到 get 请求时调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get...");
}
//收到 post 请求时调用
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post...");
}
}

HTTPServlet 大致原理: 在 service() 中根据不同的请求方式调用不同的 doxxx() 方法。

Servlet urlPattern 配置

  • 配置访问 Servlet 的访问路径(urlPattern)

  • 一个 Servlet 可以配置多个 urlPattern

    1
    @WebServlet(urlPatterns = {"/demo1","/demo2"})
  • urlPattern 配置规则

    1. 精确匹配

      1
      2
      3
      4
      //配置路径
      @WebServlet(urlPatterns = "/user/select")
      //访问路径
      localhost:8080/user/select
    2. 目录匹配

      1
      2
      3
      4
      5
      //配置目录
      @WebServlet(urlPatterns = "/user/*")
      //访问路径
      localhost:8080/user/aaa
      localhost:8080/user/bbb
    3. 扩展名匹配

      1
      2
      3
      4
      5
      //配置目录
      @WebServlet(urlPatterns = "*.do")//不以 / 开头
      //访问路径
      localhost:8080/aaa.do
      localhost:8080/bbb.do
    4. 任意匹配

      1
      2
      3
      4
      //配置目录
      @WebServlet(urlPatterns = "/")
      //访问路径
      localhost:8080/任意路径
  • 优先级:精确匹配 > 目录匹配 > 扩展名路径 > /* > /

xml 配置 Servlet

xml 可代替注解

在 web.xml 中配置

1
2
3
4
5
6
7
8
9
10
11
12
<servlet>
<!-- 名字任意取 -->
<servlet-name>demo1</servlet-name>
<!-- class 完全类名 -->
<servlet-class>com.zjt.web.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<!-- 上图所取名字 -->
<servlet-name>demo1</servlet-name>
<!-- 访问路径 -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>

Servlet
http://mrzzzz1.github.io/2023/03/15/servlet/
作者
Mrzzzz1
更新于
2023年3月22日
许可协议