Servlet接口实现类

2023-11-19

JavaWeb-03-Servlet-02-Servlet接口实现类

1.什么是Servlet接口,有什么用?

Servlet接口来自于Servlet规范中的一个接口,这个接口存在于Http服务器所提供的jar包中。

Servlet接口的具体位置:位于Tomcat服务器下的lib文件中的servlet-api.jar,在jar包中的位置:【javax.servlet.Servlet】。

在Servlet规范中,Http服务器能调用的【动态资源文件】必须是一个实现了Servlet接口的java类。

如:

class MyClass01 {
    //非Servlet接口实现类,不是动态资源文件,Tomcat服务器无权调用
}
class MyClass02 implements Servlet{
    //是Servlet接口实现类,是合法的动态资源文件,Tomcat服务器有权调用
}

2.Servlet接口实现类开发步骤(如何创建一个动态资源文件)

2.1第一步:创建一个java类继承HttpServlet

当一个java类继承抽象类HttpServlet后,这个java类就成为了一个Servlet接口实现类。

HttpServlet抽象类是GenericServlet抽象类的子类,而GenericServlet实现了Servlet接口,所以GenericServlet的子类HttpServlet以及HttpServlet的子类都是Servlet接口实现类。

                          (抽象类)		            (抽象类)			        	    (接口)
自己写的类----【继承】---->HttpServlet----【继承】---->GenericServlet----【实现】------>Servlet
[Servlet接口实现类]	    [Servlet接口实现类]	         [Servlet接口实现类]
                        - service()【实现】           - init()【实现】              - init()【抽象方法】
                                                     - getServletConfig()【实现】   - getServletConfig()【抽象方法】
                                                     - getServletInfo()【实现】     - getServletInfo()【抽象方法】
                                                     - destroy()【实现】            - destroy()【抽象方法】
                                                     - service()【仍是抽象方法】     - service()【抽象方法】

为什么不直接让自己写的类直接实现Servlet接口呢?

理由是:

  1. 当实现一个接口后必须实现该接口中所有的方法。
  2. 而在Servlet接口的所有方法中,我们只需要使用其中一个方法service,其他方法不需要实现。
  3. 为了降低接口实现类实现接口过程的难度,就将接口中实现类所不需要的抽象方法交给抽象类来完成。这样接口实现类只需要对接口中需要的方法进行重写。

Servlet接口:

接口实现类不需要的抽象方法:

  • init()
  • getServletConfig()
  • getServletInfo()
  • destroy()

接口实现类需要的抽象方法:

  • service()

Tomcat根据规范调用Servlet接口实现类规则:

  1. Tomcat有权创建Servlet接口实现类实例对象

    • Servlet sltDemo = new ServletDemo01();
      
  2. Tomcat根据实例对象调用service方法处理当前请求:

    • sltDemo.service();
      

2.2第二步:重写HttpServlet中的两个方法【doGet、doPost】

package com.tsccg.controller;

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

/**
 * @Author: TSCCG
 * @Date: 2021/08/12 11:35
 */
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletDemo01类对浏览器发送的GET请求作出处理");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletDemo01类对浏览器发送的POST请求作出处理");
    }
}

浏览器发送请求的方式有两种:GET和POST

在浏览器发送请求时,将请求方式信息放入Http请求协议包里的【请求行】中。

请求行:[
    URL:请求地址
    Method:【GET/POST】
]
请求头:[...]
空白行:[...]
请求体:[...]
  • 当为GET时,Tomcat服务器通过动态资源文件实例对象调用doGet()方法对请求进行处理
  • 当为POST时,Tomcat服务器通过动态资源文件实例对象调用doPost()方法对请求进行处理
		GET
浏览器--------->sltDemo.doGet()//1.第一种:GET
		POST
浏览器--------->sltDemo.doPost()//2.第二种:POST

但在前面不是说过,处理当前请求是通过service方法吗?

  • Servlet sltDemo = new ServletDemo01();
    sltDemo.service();
    

底层抽象类HttpServlet实现了service方法,我们可以看看是如何实现的:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getMethod();//获取请求方式【GET/POST】
    long lastModified;
    if (method.equals("GET")) {//如果请求方式是GET,那么就执行this.doGet(req, resp);
        lastModified = this.getLastModified(req);
        if (lastModified == -1L) {
            this.doGet(req, resp);
        } else {
            long ifModifiedSince;
            try {
                ifModifiedSince = req.getDateHeader("If-Modified-Since");
            } catch (IllegalArgumentException var9) {
                ifModifiedSince = -1L;
            }

            if (ifModifiedSince < lastModified / 1000L * 1000L) {
                this.maybeSetLastModified(resp, lastModified);
                this.doGet(req, resp);
            } else {
                resp.setStatus(304);
            }
        }
    } else if (method.equals("HEAD")) {
        lastModified = this.getLastModified(req);
        this.maybeSetLastModified(resp, lastModified);
        this.doHead(req, resp);
    } else if (method.equals("POST")) {//如果请求方式是POST,那么就执行this.doPost(req, resp);
        this.doPost(req, resp);
    } else if (method.equals("PUT")) {
        this.doPut(req, resp);
    } else if (method.equals("DELETE")) {
        this.doDelete(req, resp);
    } else if (method.equals("OPTIONS")) {
        this.doOptions(req, resp);
    } else if (method.equals("TRACE")) {
        this.doTrace(req, resp);
    } else {
        String errMsg = lStrings.getString("http.method_not_implemented");
        Object[] errArgs = new Object[]{method};
        errMsg = MessageFormat.format(errMsg, errArgs);
        resp.sendError(501, errMsg);
    }
}

可以发现,在HttpServlet抽象类实现的service()方法中,

根据请求方式信息执行【this.doGet(req, resp)】或【this.doPost(req, resp)】

其中,this指的是当前实例对象。

当子类ServletDemo继承父类HttpServlet后,子类也继承了父类实现的service()方法,

在子类重写父类中的doGet()和doPost()方法后,如果用子类的实例对象去调用service()方法:

Servlet sltDemo = new ServletDemo01();
sltDemo.service();

那么在service()方法中执行的【this.doGet(req, resp)】或【this.doPost(req, resp)】中的this,就是当前子类的实例对象【sltDemo】,调用的doGet()或doPost()方法就是子类重写的方法。

这种通过父类来决定在什么情况下调用子类中方法的模式,在设计模式中被称为【模板设计模式】。

2.3将Servlet接口实现类信息"注册"到Tomcat服务器

“注册”,在这里是通知的意思。

在一个网站中,会有很多的java类,其中有普通java类和动态资源文件,而Tomcat服务器无法区分哪些是动态资源文件。

所以,我们就需要通知Tomcat服务器哪些是可以操作的动态资源文件。

如何通知呢?我们可以通过配置web目录下的WEB-INF文件夹中存储的web.xml文件来实现。

[网站]--->[web]--->[WEB-INF]--->[web.xml]

在web-app标签栏内写入如下配置信息:

<!-- 将Servlet接口实现类的类路径地址交给Tomcat服务器 -->
<servlet>
    <servlet-name>demo01Path</servlet-name><!-- 声明一个变量,用于存储Servlet接口实现类的类路径地址 -->
    <servlet-class>com.tsccg.controller.ServletDemo01</servlet-class><!-- Servlet接口实现类的类路径 -->
</servlet>
<!-- 以上语句作用:Tomcat:String demo01 = "com.tsccg.controller.ServletDemo01"; -->
<!-- 由于java类的类路径一般都很长,用户在浏览器中请求时非常不便。
【http://localhost:8080/MyWeb/com/tsccg/controller/ServletDemo01】
为了降低用户访问Sevlet接口实现类的难度,我们需要设置一个简短的别名 -->
<servlet-mapping>
	<servlet-name>demo01Path</servlet-name><!-- 上面的变量名 -->
    <url-pattern>/demo01</url-pattern><!-- 别名【一定要在开头加一个斜杠/】 -->
</servlet-mapping>
<!-- 
现在通过浏览器索要ServletDemo01时需要写的地址:
【http://localhost:8080/MyWeb/demo01】 
-->

然后发布网站:

开启服务器并通过浏览器访问ServletDemo01:

我们通过浏览器地址栏发送的请求,都是【GET】方式。

当Tomcat服务器接收到【GET】请求后,创建ServletDemo01的实例对象,并调用service方法处理当前请求。

在service()方法里,根据【GET】请求方式,执行【this.doGet(req, resp);】。即用当前实例对象调用实例对象中重写的doGet方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servlet接口实现类 的相关文章

  • 在springboot 中配置使用servlet

    文章目录 1 前言 2 servlet 3 springboot配置 4 启动项目 5 UrlMapping设置 6 Filter 7 Listener 8 总结 1 前言 还记得 说到web项目 最早接触的就是servlet 实际上SSH
  • 使用session实现同一账号只能同时一个人使用

    使用session实现同一账号只能同时一个人使用 今天我们要讲的就是 实现同一个账号只能同一时间让一个人使用 实现起来也是非常的简单 其实我这里讲到的是我前几天做出来的一个大概核心代码和核心思路 我也是查遍了很多网站 看了很多人的源码然后都
  • Jenkins部署

    链接 手把手教你用 Jenkins 自动部署 SpringBoot 江南一点雨 jekins 江南一点雨的博客 CSDN博客 bin bash jenkins要在后台执行脚本 需要在脚本前加上BUILD ID dontKillMe BUIL
  • 定义类数组

    编写学生类 包含姓名 学号 成绩三个属性 题目要求 1 为学生类添加构造函数给每个成员属性赋值 使用this关键字 2 为学生添加toString 方法显示所有属性 3 在测试类中定义学生数组 长度为4 分别给数组每个元素赋值 然后循环调用
  • javaweb——Response下载文件

    HttpServletResponse web服务器接收到客户端的http请求 针对这个请求分别创建一个代表请求的HttpServletResponse对象 一个代表响应的HttpServletResponse对象 如果要获取客户端请求过来
  • javatServlet中的cookie设置

    cookie 服务器将一些信息存储在浏览器 本地 当用户再次打开网页时 会自动填充该信息 当浏览器再次发送请求时 会将存储的信息通过请求头的方式发送给服务器端 不需要用户每次都填充某些内容 cookie中理论上来讲 最大存储4KB内容 co
  • 【EasyExcel】 模板填充批量导出,多文件以zip压缩包格式导出

    使用 阿里巴巴的 EasyExcel 填充 excel模板导出 需要支持批量操作 即一个模板循环导出多份 在网上找了下其他大佬们的做法 没有找到想要的 很多都是要先生成excel文件 再压缩导出 但我不想这样做 想直接通过文件流的方式 直接
  • response实现文件下载(java)

    import javax servlet ServletException import javax servlet ServletOutputStream import javax servlet http HttpServlet imp
  • Servlet 和 Cookie-Session 学习笔记(基础)

    简单来说 是运行在服务器端的 Java 程序 它作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 用处 使用 Servlet 您可以收集来自网页表单的用户输入 呈现来自数据库或者其他
  • 利用Java EE相关技术实现一个简单的Web聊天室系统

    利用Java EE相关技术实现一个简单的Web聊天室系统 1 编写一个登录页面 登录信息中有用户名和密码 分别用两个按钮来提交和重置登录信息 2 通过请求指派来处理用户提交的登录信息 如果用户名为本小组成员的名字且密码为对应的学号时 跳转到
  • Spring中的监听器与SpringMVC简述

    目录 Spring中的监听器 SpringMVC概述 web层的框架完成的相应的操作图示 SpringMVC开发使用步骤 SpringMVC流程图示 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转
  • form表单中使用fileUpLoad上传文件

    在最近的项目中 需要对用户的头像就行上传 这里了解到使用appche的 大家可自行到mvn库搜索jar包名进行下载 这里需要注意的是代码中对参数的读取 正常情况下我么使用getparameter方法进行读取表单数据 但是因为在form中我们
  • STC仿真失败

    原因就是购买的下载工具不适合在烧写STC8H3K64S仿真固件后再将该下载工具作为USB转串口工具连接PC与目标板 推测是接入仿真时会重启目标板 不打算细究 换一个普通串口就好了
  • 什么是Servlet容器?

    在本文中 我写了一些关于Web服务器 Servlet容器以及它与JVM的关系的基本概念 我想表达的是 Servlet容器也仅仅不过是一个Java程序 1 什么是Web服务器 想要知道什么是Servlet容器 我们首先要知道什么是Web服务器
  • JAVA WEB 中间件为SERVLET(四)

    写一个用户登录部署到tomcat 本地 先找到一个模板 HTML代码复制到本地的项目index jsp中 这个登录模板包含一个JSP 一个JS 三个CSS等文件 这个是index jsp代码
  • Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web

    文章目录 前言 为何要写 目录结构 1 依赖配置 1 1 创建一个web项目 1 2 依赖需求分析 1 3 pom xml 2 配置Mybatis 2 1 mybatis config xml 2 2 UserMapper xml 2 3
  • GraphQL 实现原理,不要被表象骗了

    GraphQL 实现原理 及实例 GraphQL是一种用于API的查询语言和运行时环境 它提供了一种描述数据的方式 客户端可以根据需要进行精确地获取所需的数据 下面是GraphQL的实现原理 类型系统 Type System GraphQL
  • 基于动态代理实现接口耗时计算

    对于动态代理模式 Java的反射机制提供了支持 耗时计算写在主逻辑代码存在很强的耦合性 这里提供了一种解耦合的方式去实现 在Spring框架aop也用了这一技术 登录接口 public class UserServiceImpl imple
  • 基于动态代理实现接口耗时计算

    对于动态代理模式 Java的反射机制提供了支持 耗时计算写在主逻辑代码存在很强的耦合性 这里提供了一种解耦合的方式去实现 在Spring框架aop也用了这一技术 登录接口 public class UserServiceImpl imple
  • java课程设计

    包含部署视频 1 基于ssh的婴幼儿产品销售系统毕业设计 项目报告 答辩PPT 源代码 数据库 截图 部署视频 2 基于jsp的医院管理住院系统毕业设计 项目报告 答辩PPT 源代码 数据库 部署视频 3 基于ssh的医院在线挂号系统毕业设

随机推荐

  • python 关联图谱_机器学习算法与Python实践 - 知识图谱

    机器学习 人工智能 知识图谱 可以为自己建立一个机器学习的知识图谱 并争取掌握每一个经典的机器学习理论和算法 简单地总结如下 1 回归算法 多元自适应回归样条 MultivariateAdaptive Regression Splines
  • gmtime与localtime的区别

    目录 gmtime函数 linux环境下 window环境下 localtime函数 gmtime函数 gmtime转换的时间是UTL时间 与北京时间相差了8个小时 如果你想要得到北京时间 不建议你将gmtime转换后的时间直接加上八个小时
  • 小游戏开发:使用 React 和 Redux Tool Kit 实现俄罗斯方块

    大家好 我是若川 我持续组织了近一年的源码共读活动 感兴趣的可以 点此扫码加我微信 lxchuan12 参与 每周大家一起学习200行左右的源码 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列 包含20余篇源码文章 历史面试系列 另
  • 进制图像的莫拉尔距离图

    进制图像的莫拉尔距离图 莫拉尔距离图是一种计算图像中对象之间距离的方法 通常用于形态学分析和图像处理的应用中 它可以帮助我们量化图像中不同对象之间的距离 并用于图像分割 边缘检测等任务 本文将介绍如何使用C C 语言实现进制图像的莫拉尔距离
  • 区块链技术与应用实验报告(实验六)

    文章目录 区块链技术与应用实验报告 实验六 关于作者 作者介绍 一 实验目的 二 实验原理简介 三 实验环境 四 实验步骤 1 访问 bitaddress org 等待网页跳转完毕 2 生成两对地址和私钥 3 生成一对新的地址和私钥 4 访
  • 彻底搞懂Vue中的Mixin混入

    1 什么是Mixin 其实Mixin不是Vue专属的 可以说它是一种思想 通俗点讲就是混入 在很多开发框架中都实现了Mixin 混入 我们这里主要讲解的是Vue中的Mixin 大白话解释 将组件的公共逻辑或者配置提取出来 哪个组件需要用到时
  • JS中的声明提升

    变量声明提升 使用var关键字声明的变量 会在所有的代码执行之前被声明 如果声明变量时未使用var关键字 变量不会被提前声明 console log a 输出undefined var a 1 等同于 var a console log a
  • RabbitMQ下的生产消费者模式与订阅发布模式

    所谓模式 就是在某种场景下 一类问题及其解决方案的总结归纳 生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式 用于功能解耦和分布式系统间的消息通信 以下面两种场景为例 数据接入 假设有一个用户行为采集系统 负责从App端采集用户
  • protobuf C#编译

    protobuf C 编译 标签 protobufc 2016 08 30 23 22 342人阅读 评论 1 收藏 举报 分类 工作记录 2 版权声明 本文为博主原创文章 未经博主允许不得转载 1 下载protobuf代码 https g
  • GO语言篇之CGO

    GO语言篇之CGO 文章目录 GO语言篇之CGO 前言 C代码嵌入GO代码 C文件嵌入GO代码 缺点 前言 Go语言可以通过内置的CGO调用C语言接口 从而实现C语言代码的交互 CGO提供了一种将Go代码嵌入到C代码中 或者从Go代码中调用
  • spring的事务配置详解

    接下来我将给大家介绍spring事务配置的两种方式 1 基于XML的事务配置 2 基于注解方式的事务配置 前言 在我们详细介绍spring的两种声明式事务管理之前 我们需要先理解这些概念 1 spring的事务管理是通过Aop的方式来实现
  • 不同cpu平台互传docker镜像

    说明 不同的平台之间docker镜像不能共用 假如使用mac pull的镜像 load 到amd平台上不能使用 但是可以在pull镜像使用 platform linux amd64 pull amd64 架构的镜像 docker pull
  • 西门子S7-1200 PLC选型前这些要了解

    西门子S7 1200PLC是西门子S7系列PLC产品中一员 S7系列产品包含有 S7 200 Smart 200 S7 1200 S7 300 S7 1500 S7 400等系列PLC 其中S7 200 Smart 200 S7 1200系
  • Jetson TX2刷JetPack3.3(方法二)

    官网上的刷机教程都是需要一个路由器才能刷机 这篇博客介绍如何不要路由器 只需要一个宿主机就可以刷机的教程 1 刷机准备工作 JetPack是一个x86二进制文件 不能在基于ARM的机器上运行 因此需要借助一个宿主机来刷JetPack 因此
  • 数据结构模板

    链接
  • Github-Copilot初体验-Pycharm插件的安装与测试

    引言 80 代码秒生成 AI神器Copilot大升级 最近copilot又在众多独角兽公司的合力下 取得了重大升级 GitHub Copilot发布还不到两年 就已经为100多万的开发者 编写了46 的代码 并提高了55 的编码速度 据官博
  • Quartus导出网表文件:.qxp和.vqm

    当项目过程中 不想给甲方源码时 该如何 我们可以用网表文件qxp或者vqm对资源进行保护 下面讲解这两个文件的具体生成步骤 一 基本概念 QuartusII的qxp文件为QuartusII Exported Partition 用于创建综合
  • c#float取小数点后两位_C# 保留小数点后两位(方法总结)

    最简单使用 float i 1 6667f string show i ToString 0 00 结果1 67 四舍五入 其他类似方法 string show i ToString F F2 f 不区分大小写 string show St
  • SpringBoot集成Swagger4

    Swagger是一种工具 可以帮助开发人员设计 构建 文档化和测试 RESTful Web 服务 Swagger提供了一种交互式文档格式 可以使用它来了解 API 的用法 参数 返回值等等 Spring Boot提供了集成Swagger的简
  • Servlet接口实现类

    JavaWeb 03 Servlet 02 Servlet接口实现类 1 什么是Servlet接口 有什么用 Servlet接口来自于Servlet规范中的一个接口 这个接口存在于Http服务器所提供的jar包中 Servlet接口的具体位