顶部左侧内容
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 在线教程 > 正文

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

gosiye 2024-06-03 14:04 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界面啦,效果如下所示:

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

相关推荐

全球最大的H5网站模板库(h5页面模板下载)

当今社会,互联网迅猛发展,在网络营销中,客户往往通过企业的网站建设留下对该企业的第一印象,一个优秀的企业网站已成为企业发展的重要纽带,嗨创H5,拥有国内外一流的技术团队,潜心专研网站建设6年,是全球最...

wordpress集团公司网站模板:XSgr(wordpress建站公司)

小兽wordpress推出一款高端集团公司主题,打造高品质官网。高端是一种态度和坚持,因为我坚信贴合产品及品牌理念的高端深度定制才能最大化地呈现企业的务实严谨与产品的专业品质相比,某种程度上讲–...

私心推荐,小编酷爱的五款高逼格网站模板

建站宝盒的网站模板上千套之多,各有各的风格色彩,但是,弱水三千,小编我却只取一瓢饮,在这上千套模板之中,小编酷爱的网站模板有五套,让小编私心推荐一下吧!1、茶叶贸易公司网站模板小编对这款网站模板可是一...

「书讯」政府网站用户行为研究与应用

《政府网站用户行为研究与应用》作者:刘合翔著出版日期:2018年6月开本:16开出版社:经济管理出版社小编推荐《政府网站用户行为研究与应用》的主题是关于政府网站用户行为的特征规律及其在政府网站优...

免费服务器-搭建模板网站的操作流程(图文版)

之前发文《创业者的官网:如何搭建免费云服务器及操作面板(图文版)》,因为做了视频才发现,创业者对视频的需求,远远低于对图文解说的需求。因此,补充图文教程,不清楚的看官们,可以直接看视频版本进行细部学...

快收藏这些高逼格H5网站模板吧,不绕弯子直接下载

上面这些响应式H5网站是不是很炫酷,比起那些“在线一键生成”是不是好太多了?关键是,那些一键制作都不会开放源码给你,自定义性也很局限。不过说到底还是难看。今天笔者推荐大家一个模板网站,全都是高质量的响...

如何开发网站建设管理系统模板(如何开发网站建设管理系统模板图片)

根据用户网站需求文档设计美工图,并设计数据库结构,让网站开发人员可以更多地关注前台美工,先对照美工图,编写静态HTML页面,按网站建设管理系统模板语法,修改编写好的静态HTML页面,运行。不再需要对...

C语言的数据类型介绍(c语言的数据类型介绍是什么)

在计算机系统中,数据是放在内存中的,数字、文字、符号、图形、音频、视频等数据都是以二进制形式存储在内存中的,它们并没有本质上的区别,那么0001000该理解为数字8呢,还是图像中某个像素的颜色...

C 语言格式化输出函数中常用的格式符号

在之前介绍输入输出函数的文章中,有提到格式化输入输出函数都有包含一种特殊的符号——格式符号。那篇文章中关于格式符号也只是一笔带过,没有进行深入挖掘。本篇文章主要对输出函数(printf)中的一些常用格...

C#中的类型转换(c#数据转换类)

计算机存储的基本单位:字节我们知道一个字节(Byte)有8个比特(bit)构成,比特是存储的最小单位,表示0和1,但为什么计算机存储的基本单位是字节,而不是比特呢?假设我们要存储数字3(二进制:11...

Java8中String内存空间占用分析(电脑里下载的文件怎样删除才不会占用内存空间)

1.前言分析之前,简单回顾一下对象的内存分布。在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三部分:对象头、实例数据和对齐填充。对象头包含两部分内容:MarkWord和类型指针。实例数据...

「每日C语言」数据类型大小和取值范围

对于c语言来说,数据类型是一个很重要的概念和知识点,它涉及到的是内存的空间,这在和硬件交互的时候是非常重要的。K&R给出了7个数据类型相关的关键字,分别是:int、long、short、uns...

【c语言学习笔记】数据类型(c语言里面的数据类型)

c语言学习笔记,欢迎大家能在评论区提出我学习错误的地方方便我进行改正~在计算机中,计算机用二进制来储存数据,在c语言中有许多的数据类型用来存储数据,当然不同的数据类型所用的内存占用也不一样,下面就来用...

关于MySQL varchar类型最大值,原来一直都理解错了

我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。写在前面关于MySQLvarchar字段类型的最大值计算,也许我们一直都理解错误了,...

C语言数据类型的转换(c语言数据类型的转换方式)

类型转换在C语言程序中,经常需要对不同类型的数据进行运算,为了解决数据类型不一致的问题,需要对数据的类型进行转换。例如一个浮点数和一个整数相加,必须先将两个数转换成同一类型。C语言程序中的类型...

取消回复欢迎 发表评论: