计算机系统应用教程网站

网站首页 > 技术文章 正文

《Servlet》第08节:Servlet程序的运行原理介绍

btikc 2024-10-10 04:53:28 技术文章 10 ℃ 0 评论

前面几个小节内容,介绍了如何创建一个Servlet程序以及Servlet的生命周期,并且还介绍了创建Servlet程序的三种方式,这一小节再继续介绍一下Servlet的运行原理,进一步理解Servlet程序是如何运行起来的。

1.1、运行原理图

我们知道,Servlet程序是没有办法单独运行的,因为Servlet程序不包含可运行的main方法,它必须依赖于Servlet容器才能够运行起来,这是因为,Servlet容器中有main方法,程序入口是从main方法开始执行的,最终也是在main方法结束执行的。

当Servlet容器启动之后,浏览器访问对应的路径地址的时候,此时Servlet容器会从web.xml配置文件中,找到当前浏览器访问的地址所对应的Servlet类名称,然后通过反射机制,将这个Servlet类进行实例化操作,之后就进入了这个Servlet的生命周期。

这里你可能会有一个疑问,如果我们访问的地址在web.xml配置文件里面,没有找到对应的Servlet处理程序,那么会怎么样呢???

针对这种情况,Servlet容器都会有一个默认的Servlet处理程序,当我们访问的路径地址找不到的时候,此时Servlet容器就会将这个请求地址交给默认的Servlet程序处理。

Servlet运行原理图大致如下所示:

大概总结一下,Servlet程序运行原理就是下面几个步骤:

  1. 客户端向Servlet容器发起请求。
  2. Servlet容器接收到客户端的请求。
  3. 接着Servlet容器,根据web.xml配置文件中的路径映射关系,寻找能够处理当前请求的Servlet程序。
  4. 如果能够寻找到对应的Servlet程序,那么就会通过反射机制,实例化对应Servlet程序。
  5. 紧接着进入Servlet的生命周期阶段。
  6. 如果没有找到对应的Servlet程序,此时Servlet容器会将请求交给默认的Servlet进行处理。
  7. 默认的Servlet程序处理请求之后,会将结果响应给客户端。
  8. 到此,一次客户端请求就执行完啦。

1.2、默认的Servlet

就以Tomcat容器为案例,Tomcat容器中就有一个默认的Servlet处理程序,通过查看它的【conf/web.xml】配置文件,就可以看到一个DefaultServlet类,它默认的Servlet映射关系如下所示:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- The mapping for the default servlet -->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

从上面配置中,可以看出,Tomcat提供的默认Servlet程序名称叫做default,处理的请求路径是【/】斜杆,并且默认的Servlet是在程序启动时候就会进行实例化的(配置了load-on-startup标签)。

1.3、404报错界面

你有没有见过下面这个错误界面:

上面出现404报错的原因就是,Tomcat容器没有找到能够处理当前请求的Servlet程序,所以就将当前请求交给了默认的Servlet进行处理,默认的Servlet程序会直接返回404界面信息。

你可能会觉得这个默认的404界面太难看了,能不能自定义一个404的错误界面呢???答案是可以的,下面就介绍一下如何自定义默认的Servlet程序。

1.4、自定义默认的Servlet

自定义默认的Servlet程序,本质上就是写一个Servlet覆盖Tomcat容器默认提供的Servlet程序,要如何覆盖默认的Servlet呢???

覆盖默认的Servlet只需要在项目中创建一个Servlet,然后在web.xml配置文件中,将对应Servlet映射路径修改成【/】斜杠即可。

package com.gitcode.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Date: 2024/3/3 21:17
 * @Copyright (C) ZhuYouBin
 * @version 1.0.0
 * @Description: 自定义默认的Servlet
 */
public class CustomDefaultServlet extends HttpServlet {

    /**
     * 对外提供服务阶段
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html");
        response.getWriter().println("<h3>Sorry,404,你访问的界面找不到啦!</h3>");
    }

}

在web.xml配置文件中,添加如下配置信息:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="true">

    <display-name>工程名称</display-name>
    <description>
        工程描述
    </description>

    <servlet>
        <servlet-name>CustomDefaultServlet</servlet-name>
        <servlet-class>com.gitcode.servlet.CustomDefaultServlet</servlet-class>
        <!-- 告诉Servlet容器,当前这个 CustomDefaultServlet 在程序启动时候,就要实例化对象 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>CustomDefaultServlet</servlet-name>
        <!-- 自定义默认的Servlet进行处理 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

重新启动工程,浏览器再次访问任意路径,此时就会进入到自定义的404界面啦,效果如下所示:

今天就到这里,未完待续~~

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表