JavaWeb专栏之(四):什么是servlet(底层源码及执行流分析)?[通俗易懂]

JavaWeb专栏之(四):什么是servlet(底层源码及执行流分析)?[通俗易懂]JavaWeb专栏之(四):什么是servlet(底层源码及执行流分析)?前言:本文探究JavaWeb中Servlet的源码及执行流过程,相信您看完后,为金三银四的面试中如虎添翼。俗话知其然,知其所以然。底层代码的理解擦才是YYDS,让小Du猿带您一起走进Servlet的底层实现源码吧</p>最后:本专栏的代码已经同步到Gitee中,欢迎小伙伴一键start,原创整理不易,多多支持哦!传送门:https://gitee.com/shunchangdu/Javaweb_se

大家好,又见面了,我是你们的朋友全栈君。

JavaWeb专栏之(四):什么是servlet(底层源码及执行流分析)?

前言:

本文探究JavaWeb中Servlet的源码及执行流过程,相信您看完后,为金三银四的面试中如虎添翼。俗话知其然,知其所以然。底层代码的理解才是YYDS,让小Du猿带您一起走进Servlet的底层实现源码吧

最后:本专栏的代码已经同步到Gitee中,欢迎小伙伴一键start,原创整理不易,多多支持哦!传送门:https://gitee.com/shunchangdu/Javaweb_servlet

关注:《遇见小Du说》微信公众号,分享更多Java知识,不负每一次相遇。更多内容请访问:www.dushunchang.top

在这里插入图片描述


一、什么是Servlet?

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容

Servlet 是在服务器上运行的小程序。这个词是在 Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。

服务器上需要一些程序,常常是根据用户输入访问数据库的程序。这些通常是使用公共网关接口(Common Gateway Interface,CGI)应用程序完成的。然而,在服务器上运行 Java,这种程序可使用 Java 编程语言实现。在通信量大的服务器上,JavaServlet 的优点在于它们的执行速度更快于 CGI 程序。各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,这意味着服务器端处理请求的系统开销将明显降低。

常见容器:

Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss 等等。(提供了 Servlet 功能的服务器,叫做 Servlet 容器。对 web 程序来说,Servlet 容器的作用就相当于桌面程序里操作系统的作用,都是提供一些编程基础设施)

生命周期:

  • 客户端请求该 Servlet

  • 加载 Servlet 类到内存

  • 实例化并调用init()方法初始化该 Servlet

  • service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destroy())。

  • 加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet

在这里插入图片描述

二、Servlet实现过程

1、Servlet的请求响应

在这里插入图片描述

2、servlet类

在项目中我们创建一个servlet类,并且查看Servlet类的关系拓展图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKANyy78-1644148294027)(什么是Servlet.assets/1.png)]

HttpServlet类

HttpServlet类主要封装了请求方式和响应方式

核心源码为(太多了,只是列举JSP中常用的doGet和doPost请求,有兴趣的小伙伴可以查看底层源码进行分析,小Du猿不在此赘述…):

在这里插入图片描述

GenericServlet类

GenericServlet类中主要为Servlet容器的方法以及servlet的配置信息:

在这里插入图片描述

三、web.xml配置文件

优先级概念:优先走配置好的映射路径,无法匹配时再走默认映射路径

在JavaWeb中,我们常用配置项目的请求方式有两种注解配置Web.xml配置今天小Du猿带大家使用稍微复杂的web.xml配置的方式,而注解配置较为简单我们在实战项目中重点是使用

web.xml的文件头,我们使用最新的4.0的版本

<?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_4_0.xsd" version="4.0" metadata-complete="true">
    </web-app>

我们创建一个HelloServlet类

public class HelloServlet extends HttpServlet { 
   
    /** * @author:Du Shun Chang * @date:2022/2/3 17:42 * @title:doGet * @param:[req, resp] * @return: void * @throws: * @description: 重写doGet方法 */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   
        /*输出响应*/
        System.out.println("我进入到doGet方法中");
        resp.setContentType("text/html");//响应类型
        resp.setCharacterEncoding("utf-8");//响应格式
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>小Du猿您欢迎来到JavaWeb之什么是Servlet<h1>");
    }

}

并在Web.xml中配置映射关系

<servlet>
    <!-- 注册servlet-->
    <servlet-name>hello</servlet-name> <!-- 名称-->
    <servlet-class>com.dsc.servlet.HelloServlet</servlet-class> <!-- 包的全路径-->
</servlet>
<!-- servlet的映射地址-->
<servlet-mapping>
    <servlet-name>hello</servlet-name><!-- 选择servlet的服务名-->
    <url-pattern>/hello</url-pattern><!-- 浏览器的请求地址-->
</servlet-mapping>

启动该项目,在浏览器地址栏输入项目名/hello

在这里插入图片描述

在这里插入图片描述

Web.xml的多种配置:

<!--配置多个映射地址-->
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello3</url-pattern>
</servlet-mapping>

<!-- 配置通用映射地址-->
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern><!--hello下所有地址都能请求-->
    <!-- <url-pattern>/*</url-pattern>--> <!--所有请求都可以-->
</servlet-mapping>

<!--自定义前缀或后缀请求 不能加/-->
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

四、自定义404错误映射

创建404错误servlet类:

/** * @author: Du Shun Chang * @title: RrrorServlet * @date: 2022/2/4 23:11 * @description: 请求错误指定界面 * @version:1.0 */
public class ErrorServlet extends HttpServlet { 
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>小Du猿走丢了-404<h1>");

    }
}

创建404的错误映射关系:

<!--404错误处理-->
<servlet>
    <servlet-name>error</servlet-name>
    <servlet-class>com.dsc.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>error</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

在浏览器中输入不错在的映射地址:

在这里插入图片描述

总结:

在本文中详细总结了什么是Servlet,相信大家已经有了更深层次的了解servlet的底层代码实现,在面试过程中,常常涉及到servlet的请求与响应。例如:客户端的一次请求并响应是如何实现的(阿里二面),request和response都有哪些属性…都是较为基础的面试题目。在本篇博客中已经详细解释清楚,各位小伙伴可以温故而知新哟(^U^)ノ~YO。

关注《遇见小Du说》学习更多小知识
在这里插入图片描述

我们下期不见不散哟,下期内容为:《面试官的灵魂质问–什么是转发与重定向?》,敬请期待….

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150228.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java笔记二十四——Spring开发

    Java笔记二十四——Spring开发Spring是一个支持快速开发JavaEE应用程序的框架。它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发JavaEE应用程序的必备。在SpringFramework(最核心的Spring框架)基础上,又诞生了SpringBoot、SpringCloud、SpringData、SpringSecurity等一系列基于SpringFramework的项目。SpringFrameworkIoC容器容器是一种为某种特定组件的运行提供必要支持的一个软件环

    2022年5月16日
    37
  • 详细介绍如何从零开始制作51单片机控制的智能小车(一)———让小车动起来[通俗易懂]

    详细介绍如何从零开始制作51单片机控制的智能小车(一)———让小车动起来[通俗易懂]  从本文开始,在之后的一段时间里,我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,本文作为本系列的第一篇文章,主要介绍如何让小车动起来。一、硬件的选择  1、底盘和电机   底盘的形状呢,大家可以按照自己的需要自主选取,至于电机关注一下工作电压,转速,电机类型就差不多,对于新手,可以尝试以下样式(4WD智能小车底盘,附带4个直流减速电机,电机接线需要自己焊接),也就是本文例子采用的底盘和电机,组装简单,使用方便,特别适合新手。  2、电机驱动模块   

    2022年6月12日
    45
  • js特殊符号正则表达式_js正则表达式判断特殊字符

    js特殊符号正则表达式_js正则表达式判断特殊字符JavaScript正则表达式功能:搜索、替换、判断JavaScript正则表达式格式:/正则表达式主体/修饰符JavaScript正则表达式的修饰符:i:忽略大小写g:全局匹配m:多行匹配JavaScript中正则表达式应用场景:搜索功能(字符串方法)search()方法参数为字符串或者是正则表达式返回结果为匹配成功的索引值,如果没有,返回-1替换功能(字符串方法)r…

    2022年9月13日
    1
  • pycharm怎么配置python环境anaconda_ug编程电脑配置要求

    pycharm怎么配置python环境anaconda_ug编程电脑配置要求1.介绍Python:一种解释型、面向对象、动态数据类型的高级程序设计语言。PyCharm:一款好用的集成开发环境。Conda:Python环境管理器,方便我们管理和切换编程环境。2.下载2.1Conda下载Miniconda下载链接Anaconda下载链接Miniconda是Anaconda的压缩版,Miniconda只包含conda的核心内容,Anaconda中包含了Spyder集成开发环境等扩充内容。Miniconda的功能足矣。根据计算机的实际情况选择下载安装包,上图中Py

    2022年8月28日
    0
  • 如何查看mysql的版本_查看mysql版本语句是什么

    如何查看mysql的版本_查看mysql版本语句是什么查看MySQL的版本,主要有以下几个方法:1.没有连接到MySQL服务器,就想查看MySQL的版本。打开cmd,切换至mysql的bin目录,运行下面的命令即可:e:\mysql\bin>mysql -Vmysql  Ver 14.14 Distrib 5.6.32, for Win32 (AMD64)(版本为5.6.32)或者:e:\m

    2022年9月1日
    2
  • checkbox实现单选

    checkbox实现单选checkbox实现单选信用等级量化分级管理(级别)ABCD$(function(){$(’[name=“XYDJLHFJ”][type=“checkbox”]’).each(function(){KaTeXparseerror:Expecte…

    2022年5月30日
    132

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号