JavaWeb——Servlet

2023-11-02

目录

 一、JavaWeb

 二、servlet本质:

三、Servlet对象生命周期

四、Servlet类的方法介绍

五、适配器思想


一、JavaWeb

对于一个web应用来说,涉及到的角色和规范协议:

 二、servlet本质:

         可以将servlet理解为web服务器和web app之间的一个接口,通过servlet规定的一系列规范,服务器根据接受到的请求可以找到正确的服务。对于web app来说,每一个服务需要有一个Servlet接口的实现类xxxServlet,配置文件中标明了请求路径和实现类xxxServlet的对应关系(专业术语叫做:配置文件完成实现类xxxServlet的注册)。对于web服务器来说,以tomcat为例。服务器接收到浏览器发送的请求,此时tomcat需要找到与请求路径对应的xxxServlet,对应关系存储在配置文件中,因此先解析配置文件,获取到对应的xxxServlet,然后通过反射创建对象,调用service方法。

        main函数在tomcat服务器中,程序是写死的,这就表明我们的web app的存放位置、命名等需要遵循一定的规范,只有这样tomcat才能够顺利的访问到webapp。

webapps下为项目文件夹,项目文件夹下创建文件夹WEB-INF

注意:在编译java程序时,由于import了servlet的包,但是JavaSE中并不存在这个包。在tomcat中实现了Servlet,因此需要配置CLASSPATH,值为Servlet jar包的文件位置。

三、Servlet对象生命周期

          Servlet对象在tomcat服务器启动时并不会默认创建,只有在用户发送请求后才会创建对应的xxxServlet对象。用户发送请求后,首先调用无参构造器生成对象,然后调用init方法和service方法。当用户后续重复发送请求时,只会调用service方法,不会再实例化对象。

       tomcat服务器销毁Servlet对象时,会调用destroy方法,调用完成之后便销毁。

四、Servlet类的方法介绍

xxxServlet作为Servlet接口的实现类,需要重写Servlet接口的方法:

        init方法为初始化方法,在Servlet对象创建后只执行1次,方法体中多为连接资源等操作。

        init方法入参为ServletConfig类的一个对象,servletconfig去获取xml配置文件中servlet标签中的内容。也就是说,tomcat解析web.xml文件,将<servlet></servlet>标签中的配置信息自动包装到servletconfig中。

        service方法是处理用户请求的核心方法。

        destroy作为对象销毁前调用的方法,通常需要负责保存数据、释放资源等操作。

五、适配器思想

        在实际使用中,通常并不直接实现Servlet接口。servlet接口提供了5个方法,其中最常用的其实只有service方法,但所有xxxServlet类要实现接口的所有方法,这就导致代码冗余,不够美观。为了解决这个问题,Servlet中提供了Servlet接口的实现类,在实际使用中,通常会继承这个实现类,来重写service方法,这就是适配器的思想。

GenericServlet实现类源码:

package javax.servlet;

import java.io.IOException;
import java.util.Enumeration;

public abstract class GenericServlet implements Servlet, ServletConfig,
        java.io.Serializable {
    
    //版本号
    private static final long serialVersionUID = 1L;
	
    private transient ServletConfig config;

    /*
        此构造方法啥也不做,因为Servlet的所有初始化任务都是由init方法完成的。
    */
    public GenericServlet() {
        // NOOP
    }


    @Override
    public void destroy() {
        // NOOP by default
    }

  
    @Override
    public String getInitParameter(String name) {
        return getServletConfig().getInitParameter(name);
    }

  
    @Override
    public Enumeration<String> getInitParameterNames() {
        return getServletConfig().getInitParameterNames();
    }

    
    @Override
    public ServletConfig getServletConfig() {
        /*通过该方法,可以让子类调用父类私有属性*/
        return config;
    }

 
    @Override
    public ServletContext getServletContext() {
        return getServletConfig().getServletContext();
    }

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


    @Override
    public void init(ServletConfig config) throws ServletException {
        /*该方法是形参,tomcat将实参传进来,然后通过this.config=config
          把局部变量变为全局变量。*/
        this.config = config;
      //Tomcat首先调用init()有参方法,然后调用init()无参方法。
        this.init();
    }

   /*目的是让子类重写init()方法的无参构造方法。*/
    public void init() throws ServletException {
        // NOOP by default
    }

 
    public void log(String msg) {
        getServletContext().log(getServletName() + ": " + msg);
    }


    public void log(String message, Throwable t) {
        getServletContext().log(getServletName() + ": " + message, t);
    }


    @Override
    public abstract void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;

 
    @Override
    public String getServletName() {
        return config.getServletName();
    }
}

     注意到,类中有一个public ServletContext getServletContext()方法,ServletContext对应的是一个web.xml文件。它获取到的是应用级配置信息,即由所有xxxServlet类共享的信息。ServletContext对象在服务器启动阶段创建,在服务器关闭的时候销毁。

        以后我们编写Servlet类的时候,实际上是不会去直接继承GenericServlet类的,因为我们是B/S结构的系统,这种系统是基于HTTP超文本传输协议的,在Servlet规范当中,提供了一个类叫做HttpServlet,它继承了GenericServlet抽象类,是专门为HTTP协议准备的一个Servlet类。我们编写的Servlet类要继承HttpServlet。(HttpServlet是HTTP协议专用的。)使用HttpServlet处理HTTP协议更便捷。

六、HttpServlet

        要在继承TttpServlet类的子类中重写后端支持的请求方法。如接口支持post方法,那么需要重写doPost方法,若前端发送请求为get方法,则会走到父类(TttpServlet)中,最终结果会报405错误码(method not allowed)。

七、一个servlet类的开发步骤

        1、servlet类继承TttpServlet

        2、重写doGet方法或 doPost 方法

        3、将servlet类配置在web.xml配置文件中

        4、编写前端页面(form表单),form表单中指定请求路径即可

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

JavaWeb——Servlet 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • html type=hidden 属性,input 属性及类型有哪些(type=text/button/hidden)

    input 从字面意就可以看出专门用来给用户输入文字的 当然也包括选择文件 它不具体表示某一类元素 如文本框 text 要使它具体表示一类元素必须加类型指明 如表示文本框加 type text type 也是 input 众多属性中最重要的
  • spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集

    前言 本章是spring基于XML 配置bean系类中第7篇讲解spring通过文件属性注入bean和基于xml的bean的自动装配以及spring eel表达式的使用加代码合集 个人主页 尘觉主页 个人简介 大家好 我是尘觉 希望我的文章
  • c语言 打空心菱形

    没错 如图所示 我们要整一个这样的菱形 写的挺麻烦的 代码如下 我是一半一半写的 要n 5 先写上半部分的代码 那么它是咋写出来的呢 本题可以完全用for语句写 但我选择了用for和if语句相结合的方式 i是代表的横 j代表的是列 所以它最
  • nginx相关漏洞处理:CVE-2016-2183、CVE-2022-41741、CVE-2022-41742

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 漏洞内容 二 现状 三 centos7安装openssl11 四 升级nginx到1 24 0 1 下载nginx 2 编译安装nginx 3 配置ngi
  • 2022数学建模美赛E题详细思路获取

    已更新 公众号 千千小屋grow 数据在文后链接 背景 正如我们所知 气候变化对生命构成了巨大的威胁 为了减轻气候变化的影响 我们需要采取严厉的行动 以减少大气中的温室气体的数量 仅仅是减少温室气体的排放是不够的 我们需要努力增加通过生物圈
  • log4j日志在java控制台输出,简单实用

    log4j日志在java控制台输出 简单实用 1 log4j输出有2中方式 第一种是将日志信息保存在一个文本当中 第二种是输出到控制台中 下面介绍第二种方式 2 在控制台输出log4j日志信息 是开发项目中常用的也是比不可少的也是必须会的一
  • 微信小程序中slider实现拾色器功能

    微信小程序中slider实现拾色器功能 思路 效果图 体验 代码 效果体验 思路 画板中要实现颜色选择功能 几经周折 效果还可以 整个思路就是 1 利用线性过渡实现slider背景渲染 2 获取slider滑块value值 3 计算该val
  • Markdown公式编辑学习笔记

    一 公式使用参考 1 如何插入公式 行中公式 放在文中与其它文字混编 可以用如下方法表示 数学公式 独立公式可以用如下方法表示 数学公式 自动编号的公式可以用如下方法表示 若需要手动编号 参见大括号和行标的使用 begin equation
  • 再看中国互联网web2.0百强名单

    无意中翻看到一篇我在三年多前写的文章 我看中国互联网web2 0百强名单 读来颇有感概 2005 2006那两年 正是WEB2 0概念轰轰烈烈的时候 大大小小的新网站层出不穷 博客 视频 交友 评点 社区 聚合 不管自己的网站的UGC比例多
  • bootstrap table 表格支持shirt 多选_bootstrap-table 表格行内编辑实现

    这篇文章向大家介绍一下如何使用bootstrap table插件实现表格的行内编辑功能 我的web前端学习交流群点击进入1045267283 欢迎加入 先放一张效果图 应用场景 之前的项目也是采用bootstrap table 添加和修改数
  • 牛客——子序列(组合数学)

    子序列 题目描述 给定一个小写字母字符串 T T T 求有多少长度为 m m m的小写字母字符串 S
  • 端口相关知识总结

    端口相关知识总结 80是服务器上的一个软件 服务器软件 端口是软件的代号 3306是MySQL的端口 1521是Oracle的端口 80是外部服务器的通用端口 京东也是 不写也可以访问 80端口可以省略 文件下载端口 FTP 都是21 FT
  • Android 13 - Media框架(2)- Demo App与MediaPlayer Api了解

    尝试用MediaPlayer写了一个播放demo 实现了网络流和本地流的播放 由于本人对app开发一窍不通 所以demo中很多内容是边查资料边写的 写的也比较杂乱 能够帮助理解api就行 这一节主要会记录demo开发中学到的内容 以及了解M
  • LeetCode 312. Burst Balloons(戳气球)

    原题网址 https leetcode com problems burst balloons Given n balloons indexed from 0 to n 1 Each balloon is painted with a nu
  • 微信小程序云开发实现微信小程序订阅消息服务通知教程

    微信小程序云开发实现微信小程序订阅消息服务通知教程 申请模板 云函数 小程序页面 调试 我这里就直接真机测试了 申请模板 1 在这边菜单栏 找到 功能 里的 订阅消息 2 在 公共模板库 里面选取自己想要的模板 选取自己想要的消息即可 云函
  • 『学Vue2+Vue3』指令补充、computed计算属性、watch侦听器

    day02 一 今日学习目标 1 指令补充 指令修饰符 v bind对样式增强的操作 v model应用于其他表单元素 2 computed计算属性 基础语法 计算属性vs方法 计算属性的完整写法 成绩案例 3 watch侦听器 基础写法
  • linux文件基础-2_linux文件细节_lseek_文件指针

    一 linux管理文件 1 硬盘中的静态文件和inode i节点 1 静态文件 放在硬盘中 固定的形式 2 硬盘的两大区域 1 硬盘内容管理表项和储存内容区域 2 操作系统先去访问硬盘内容管理表项 gt 扇区级别的信息 gt 得到储存内容区
  • SAP 货币类型和公司代码的货币设置

    货币类型分为公司代码和集团货币 一般FI 10类型和集团货币 30 事务代码是8KEM 设置货币类型的事务代码是OB22 在S 4 1809版本里编辑功能统合到事务代码FINSC LEDGER 中了 这里集中了分类账和公司代码的设置 设置多
  • 使用正确的命令重启WSL子系统

    问题 大家都知道一般Linux系统重启非常简单 但是在WSL子系统中执行以下两个重启命令是完全无效的 reboot shutdown r 执行命令后提示如下 System has not been booted with systemd a
  • JavaWeb——Servlet

    目录 一 JavaWeb 二 servlet本质 三 Servlet对象生命周期 四 Servlet类的方法介绍 五 适配器思想 一 JavaWeb 对于一个web应用来说 涉及到的角色和规范协议 二 servlet本质 可以将servle