Servlet中的生命周期、基础配置、三种匹配规则、缺省Servlet以及路径问题

简介: Servlet中的生命周期、基础配置、三种匹配规则、缺省Servlet以及路径问题

Servlet

1. Servlet源码

public interface Servlet {
   
    //监听Servlet的初始化
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();
    //处理请求
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();
    //监听Servlet的销毁
    void destroy();
}

2. Servlet的生命周期

2.1 生命周期

一个事物从开始到存活再到结束也就是需要看Servlet的初始化、存活以及销毁;

2.2 Servlet的生命周期特点

  • servlet初始化:Servlet默认不是随着服务器的启动而初始化,当第一次访问Servlet时才初始化,后面访问就执行处理请求,不会初始化了;
  • servlet销毁:服务器关闭的时候会销毁Servlet;
  • Servlet在服务器中是一个单例(不会占用过多的内存);

测试代码:

public class TestServlet04 extends HttpServlet {
   
    @Override
    public void init() throws ServletException {
   
        System.out.println("TestServlet04初始化");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("TestServlet04处理请求");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        doGet(req, resp);
    }
    @Override
    public void destroy() {
   
        System.out.println("TestServlet04销毁");
    }
}

3. load on startup配置

根据Servlet生命周期可知Servlet默认不会随着服务器的启动而初始化,进行load on startup配置可以让servlet随着服务器的启动而初始化;

  • 有10个优先级:1~10;数字越小,优先级越高;

    当服务器启动时,load on startup值为1的先初始化,然后再初始化值为2的,以此类推;

    <servlet>
        <servlet-name>TestServlet05</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet05</servlet-class>
        <load-on-startup>5</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet05</servlet-name>
        <url-pattern>/Demo05</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>TestServlet06</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet06</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet06</servlet-name>
        <url-pattern>/Demo06</url-pattern>
    </servlet-mapping>
</web-app>
  • 以上代码首先初始化TestServlet06在初始化TestServlet05;

4. Servlet的配置

自定义Servlet:

  1. 声明该Servlet;
  2. 给该Servlet配置访问路径;

4.1 Servlet可以有多个访问名称

给对应的Servlet多个servlet-mapping标签

    <servlet>
        <servlet-name>TestServlet07</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet07</servlet-class>
    </servlet>
    <!--第一个访问名称-->
    <servlet-mapping>
        <servlet-name>TestServlet07</servlet-name>
        <url-pattern>/Demo07_01</url-pattern>
    </servlet-mapping>
    <!--第二个访问名称-->
    <servlet-mapping>
        <servlet-name>TestServlet07</servlet-name>
        <url-pattern>/Demo07_02</url-pattern>
    </servlet-mapping>

4.2 url-parttern的书写规则

4.2.1 完全匹配

要求网址上的访问名称完全和url-parttern一致

必须以"/"开头,否则会报错:IllegalArgumentException : Invalid url-pattern;

 <!--使用完全匹配-->
<servlet>
        <servlet-name>TestServlet07</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet07</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet07</servlet-name>
        <url-pattern>/Demo07</url-pattern>
    </servlet-mapping>

4.2.2 目录匹配

要求网址上的访问名称中的目录和url-parttern一致

必须以"/"开头,以"*"结尾

如:/a/b/* , 目录必须是/a/b,后面随便写

 <!--使用目录匹配-->
<servlet>
        <servlet-name>TestServlet08</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet8</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet08</servlet-name>
        <url-pattern>/a/b/*</url-pattern>
    </servlet-mapping>

4.2.3 后缀名匹配

要求网址上的访问名称中的后缀和url-parttern一致

不能以"/"开头,以"*"开头,后缀名根据业务写

如:*.xyz。后缀名必须是xyz,其他随意写

 <!--使用后缀名匹配-->
    <servlet>
        <servlet-name>TestServlet09</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet09</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet09</servlet-name>
        <url-pattern>*.xyz</url-pattern>
    </servlet-mapping>

5. 缺省Servlet

创建一个servlet时,如果它的url-pattern的配置值为”/”这时这个servlet就是一个缺省的servlet,tomcat服务器中默认就有缺省Servlet;

自定义缺省Servlet:到当前项目中的web.xml中配置一个Servlet,它的url-parttern为"/";

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

作用:

  • 凡是在web.xml文件总找不到匹配的servlet-mapping元素的URL,它们的请求都将交给缺省Servlet处理。缺省的servlet用于处理其他Servlet处理不了的请求;(返回404错误)
  • 当访问tomcat服务中的静态资源(html、图片,IO流读写)时,实际上是在访问这个缺省的servlet;
<servlet>
    <servlet-name>DefaultServlet</servlet-name>
    <servlet-class>com.kaka.test_01.servlet.DefaultServlet</servlet-class>
</servlet>
<!--覆盖了tomcat中原有的Servlet配置-->
<servlet-mapping>
    <servlet-name>DefaultServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
  • SpringMVC框架中,用于放行静态资源;

6.服务器中的路径问题

6.1 路径分类

  1. 带协议的绝对路径:http://localhost:8080/day51/img/girl.jpg

  2. 不带协议的绝对路径:/day51/img/girl.jpg

  3. 相对路径:

    当前目录:./ ,可以省略

    上一级目录:../

6.2 访问图片

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>路径问题</title>
    <!--访问img文件夹下的01.jpg-->
</head>
<body>
<!--带协议的绝对路径-->
<img src="http://localhost:8080/Day51/img/01.jpg">
<!--不带协议的绝对路径-->
<img src="/Day51/img/01.jpg">
<!--相对路径
    图片:http://localhost:8080/Day51/img/01.jpg
    页面:http://localhost:8080/dDay51/html/demo02.html
    上一级目录 --> img文件夹 --> 01.jpg
-->
<img src="../img/01.jpg">
</body>
</html>

6.2 访问Servlet

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>路径问题</title>
</head>
<body>
<!--带协议的绝对路径-->
<a href="http://localhost:8080/Day51/demo10">带协议的绝对路径</a><br>
<!--不带协议的绝对路径-->
<a href="/Day51/demo10">不带协议的绝对路径</a><br>
<!--相对路径
    http://localhost:8080/Day51/demo10
    http://localhost:8080/Day51/html/demo04.html
    上一级目录 --> demo10
-->
<a href="../demo10">相对路径</a>
</body>
</html>
  • 用的比较多:不带协议的绝对路径和相对路径
目录
相关文章
|
1月前
Servlet生命周期
Servlet生命周期
14 1
|
1月前
|
Java 数据库连接 容器
Servlet的生命周期
Servlet的生命周期
17 0
|
1月前
|
Java 数据库连接 容器
8:Servlet生命周期-Java Web
8:Servlet生命周期-Java Web
30 0
|
23天前
|
存储 Java 应用服务中间件
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
27 2
|
23天前
|
Web App开发 XML Java
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(1)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
31 2
|
1月前
|
Java 容器
Servlet 教程 之 Servlet 生命周期 6
Servlet生命周期包括初始化(init())、处理请求(service())和销毁(destroy())。当首个请求到达时,容器加载Servlet并调用init()。之后,多个线程共享同一Servlet实例,每个线程独立调用service()处理请求。最后,销毁前调用destroy(),实例由JVM回收。
18 2
|
1月前
|
Java 容器
Servlet 教程 之 Servlet 生命周期 6
Servlet生命周期包括:初始化(调用`init()`)、处理请求(通过`service()`)、销毁(调用`destroy()`),最终由JVM垃圾回收。当首个请求到达时,容器加载Servlet,后续请求多线程共享同一实例,每次请求调用`service()`。
28 6
|
1月前
|
Java
Servlet 教程 之 Servlet 生命周期 3
Servlet生命周期包括初始化(init())、服务(service())和销毁(destroy())三个阶段。doGet()方法处理GET请求,接收HttpServletRequest和HttpServletResponse参数。当Servlet不再使用时,由JVM的垃圾回收器自动清理。
27 5
|
1月前
|
前端开发 Java BI
Servlet+Jsp+JDBC实现房屋租赁管理系统(源码+数据库+论文+系统详细配置指导+ppt)
Servlet+Jsp+JDBC实现房屋租赁管理系统(源码+数据库+论文+系统详细配置指导+ppt)
|
1月前
|
XML 应用服务中间件 数据格式
Servlet的urlPattern配置及XML配置Servlet
Servlet的urlPattern配置及XML配置Servlet
50 0