Servlet-体系结构

一、思考

读者阅读完上一篇关于Servlet基本概念的文章后,我们知道每次实现一个Servlet,都需要覆盖五个接口,我们对除service接口外的其它四个接口,我们通常不会做什么处理。那么,这种实现方式是否有些繁琐呢?于是,为了简化Servlet的开发,我们通常不会直接实现Servlet接口,而是继承其子类。下面我们将首先尝试实现Servlet接口来完成一个更真实的Servlet类,再介绍Servlet的体系结构,以及更简单化创建一个Servlet类的方法。

二、尝试通过实现Servlet接口

为了实现一个有意义的Servlet,我们当然会在service方法中获取相应的参数,并根据参数做出对应的处理,再装处理的结果响应给客户端。

@WebServlet("/hello")
public class ServletDemo implements Servlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

        String method = httpServletRequest.getMethod();
        
        if ("GET".equals(method)) {
            System.out.println("get method...");
            // GET方法获取参数,并进行相应处理
            doGet(servletRequest, servletResponse);
        } else if ("POST".equals(method)) {
            System.out.println("post method...");
            // POST方法获取参数,并进行相应处理
            doPost(servletRequest, servletResponse);
        }
        System.out.println("hello servlet!");

    }

如以上代码所示:GET与POST方法获取参数的方式是不一样的,因此一个Servlet被请求时肯定需要判断请求的方式,Servlet再对其做相应的处理。

当我们编写一个新的Servlet类时,也需要重复这里的if/else if判断。因此我们自然会想到将这部分逻辑进行封装,于是我们创建一个抽象类MyServlet,将来所有的Servlet只需要继承这个抽象类并重写doGet与doPost方法即可:

package com.byhuang;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public abstract class MyServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

        String method = httpServletRequest.getMethod();

        if ("GET".equals(method)) {
            System.out.println("get method...");
            // GET方法获取参数,并进行相应处理
            doGet(servletRequest, servletResponse);
        } else if ("POST".equals(method)) {
            System.out.println("post method...");
            // POST方法获取参数,并进行相应处理
            doPost(servletRequest, servletResponse);
        }
        System.out.println("hello servlet!");
    }


    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }

    protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
        // do something
    }

    protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
        // do something
    }

        
}

    

子类Servlet:

package com.byhuang;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;

@WebServlet("/hello")
public class ServletDemo extends MyServlet {

    @Override
    protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
        super.doGet(servletRequest, servletResponse);
    }

    @Override
    protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
        super.doPost(servletRequest, servletResponse);
    }
}
三、HttpServlet抽象类

当然Java官方已经考虑到了这个问题,推出了HttpServlet抽象类,而这个类的内部实现逻辑与我们自己定义的MyServlet逻辑是相同的。

四、总结

因此,我们后续需要创建Servlet时,只需继承HttpServlet抽象类,重写doGet与doPost方法即可。Servlet的体系结构我们也已然清晰:(可在一个Servlet实现类右键后点击Diagrams选项展示)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/317333.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MT36291 2.5A 高效的1.2MHz电流模式升压转换器 DCDC管理芯片 航天民芯

描述 MT36291是一个恒定频率、6引脚SOT23电流模式升压转换器,旨在用于小型、低功耗的应用。MT36291的开关频率为1.2MHz,并允许使用2mm或更低高度的微小、低成本的电容器和电感器。内部软启动导致注入电流小,延长电池寿命。MT36291的特点是在光…

【数据结构Java版】对象的比较之Comparable与Comparator比较器

目录 一、基本类型的比较 二、对象类型的比较 (1)对象类型比较出现的问题 (2)重写基类equals方法 (3)基于Comparable接口的比较 1.实现Comparable接口,重写compareTo方法 (4&a…

C++力扣题目501--二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义&#xf…

激光雷达lidar

LIDAR 101 What is lidar? Lidar (light detection and ranging) uses eye-safe laser beams to “see” the world in 3D, providing machines and computers an accurate representation of the surveyed environment. How Does Lidar Work? A typical lidar sensor emi…

数据结构与算法之美学习笔记:46 | 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

目录 前言算法解析总结引申 前言 本节课程思维导图: 上一节我们讲到,如何用位图、布隆过滤器,来过滤重复的数据。今天,我们再讲一个跟过滤相关的问题,如何过滤垃圾短信? 垃圾短信和骚扰电话,我…

牛客(JZ36 二叉搜索树与双向链表)

题目链接 思路1:使用中序遍历, 创建一个cur记录当前结点,prev记录上一个结点,这样cur->left prev,prev->right cur, 这样就链接 成功了。 难点:需要使用引用来控制prev。 /* struct T…

软件测试|深入理解Python中的re.search()和re.findall()区别

前言 在Python中,正则表达式是一种强大的工具,用于在文本中查找、匹配和处理模式。re 模块提供了许多函数来处理正则表达式,其中 re.search()和 re.findall() 是常用的两个函数,用于在字符串中查找匹配的模式。本文将深入介绍这两…

【同济子豪兄斯坦福CS224W中文精讲】NetworkX代码学习笔记

文章目录 安装配置创建图可视化图图数据挖掘参考资料 安装配置 matplotlib中文字体设置 import networkx as nx import matplotlib.pyplot as plt # 魔法指令,设置后在jupyter notebook中绘制的图形会显示在输出单元格中,而不是弹出一个新窗口 %matplo…

数字智慧驱动:数据可视化如何助力大企业效率飙升?

在当今信息大爆炸的时代,大型企业面临着前所未有的数据挑战。数据量庞大、多样化的信息汇聚,无疑成为企业高效运营的挑战之一。幸运的是,数据可视化作为一种强大的工具,正成为大型企业提高效率、优化决策的得力助手。 数据可视化首…

LAMMPS 文献:9 种熔化温度模拟方法的总结与比较:两相法、单相法以及缺陷法

记录一下检索到一篇通过LAMMPS模拟熔化温度的总结文章:单相方法、过热–过冷方法、Z 方法、修正 Z 方法、孔洞方法、修正孔洞方法、两相方法、夹层方法以及修正两相法。 感谢论文的原作者! 文章题目: A comprehensive investigation on the…

专业课148,总分410+电子科技大学858信号与系统考研经验电子信息与通信

今年专业课148分,总分410顺利被电子科技大学录取,回望这一年复习还有很多不足,总结一下自己的复习经历,希望对大家复习有所帮助。 数学:(多动手,多计算,多总结,打好基础…

spring-boot集成mybait-plus+shareding实现分表分库,dynamic动态数据多数据源

spring-boot集成mybait-plusshareding实现分表分库,多数据源 1. Spring-boot集成shareding Mybatis-plus依赖引用yaml 配置示例 2. 引用 dynamic实现分表动态数据源依赖引用yaml配置数据源注入配置示例 说明: 以下内容为两部分: …

WebDav协议相关软件@简单配置局域网内的http和WebDav服务器和传输系统

文章目录 相关软件windows自带第三方软件 chfs(CuteHttpFileServer)下载软件GUI方案 补充命令行方案命令行程序定位简单创建服务站点使用配置文件配置细节 使用软连接或符号链接等手段将向共享站点的根目录添加文件开机自启服务包装nssm包装使用powershell包装 服务启动chfs服务…

安装nvidia driver出现 the cc vision check falied

这里提示说的需要gcc12,但是我只有gcc11,所以就报错了,说一说我自己的解决方法: 安装gcc12和g12,再切换版本为gcc12 安装gcc12: sudo apt install gcc-12安装g12: sudo apt -y install g-12切换版本:参考博客

MSF流量加密

1、背景介绍 在MSF中生成shell,并上线运行时。都是通过http https tcp等协议传输。虽然MSF本身会对流量进行加密,但MSF太出名以致于其加密特征容易被IPS,WAF等可以检测带有攻击的特征的设备拦截或记录。 2、生成 SSL 证书 openssl req -x50…

《ORANGE’S:一个操作系统的实现》读书笔记(二十九)文件系统(四)

上一篇文章完善了硬盘驱动程序,并且完成了一个文件系统。这篇文章开始记录对文件的操作,首先记录如何创建一个文件。 目录 创建文件 Linux 下的文件操作 文件描述符(file descriptor) open() 创建文件所涉及的其它函数 str…

Redis:原理速成+项目实战——Redis企业级项目实战终结篇(HyperLogLog实现UV统计)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战14(BitMap实现用户签到功能) 📚订阅专栏&am…

vue中使用js-doc

安装依赖 安装vue-template-compiler npm install ​vue-template-compiler​ 安装minami npm install minami 安装js-doc npm install js-doc 根目录下创建 .jsdoc.conf.json 内容: {"tags": {"allowUnknownTags": true,// 指定所用词…

linux环境下安装postgresql

PostgreSQL: Linux downloads (Red Hat family)postgresql官网 PostgreSQL: Linux downloads (Red Hat family) 环境: centos7 postgresql14 选择版本 执行启动命令 配置远程连接文件 vi /var/lib/pqsql/14/data/postgresql.conf 这里将listen_addresses值由lo…

阿里云服务器+宝塔 (尝试部署一个最简单的静态页面)

1. 免费白嫖一个阿里服务器 进入网址:服务器购买地址 选择预装宝塔面板 购买完成后前往控制台 查看当前实例 设置或修改密码 设置用户名和密码 2. 远程连接到服务器 2.1. 使用Workbench连接 输入用户名和密码连接成功页面如下: 2.2. 使…