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>
  • 用的比较多:不带协议的绝对路径和相对路径
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐