Servlet(三个核心API介绍以及错误排查)【二】

news2024/10/6 16:20:54

文章目录

  • 一、三个核心API
    • 1.1 HttpServlet
      • 【1】地位
      • 【2】方法
    • 1.2 HttpServletRequest
      • 【1】地位
      • 【2】方法
      • 【3】关于构造请求
    • 1.3 HttpServletResponse
      • 【1】地位
      • 【2】方法
  • 四、涉及状态码的错误排查(404……)
  • 五、关于自定义数据 ---- body或query String 里面的内容
    • 5.1 地位
    • 5.2 给服务器传递自定义数据
    • 5.3 获取自定义数据

学习Servlet就是学习API以及如何进行web开发

一、三个核心API

1.1 HttpServlet

【1】地位

编写 Servlet 代码会用到的核心的类。我们通过继承这个类并重写其中的方法,把代码交给Tomcat,Tomcat负责在合适的时机去调用

【2】方法

  1. init()
    (1)使用时机:原则上 init() 是在Tomcat启动加载webapp的时候就执行了,但是Tomcat是可以配置webapp为“懒加载”状态的(让webapp在首次且真正被访问到的情况下才加载)

    (2)作用:进行一些初始化操作

  2. destory()
    (1)使用时机:webapp 被销毁的时候执行

    (2)作用:进行一些收尾工作

    (3)该方法不一定会被调用到:因为destory()是webapp被销毁时被调用到,而Tomcat有两种方式结束。实际开发中,以第二种方式居多,所以我们不能太依赖destory()

    • 一种是通过 8005 端口,给Tomcat发送特殊的请求(告诉Tomcat要关闭了),然后Tomcat调用destory()
    • 直接杀死Tomcat进程,如任务管理器上直接结束进程,此时Tomcat没有机会执行destory()
  3. service()
    (1)使用时机:每次收到请求,都会处理service。实际开发中用得不多,多用下面的do三部曲。

    (2)作用:处理每个请求

  4. doGet()
    (1)使用时机:收到Get请求时

    (2)作用:处理Get请求的情景

  5. doPost()
    (1)使用时机:收到 Post 请求时

    (2)作用:处理 Post 请求的情景

  6. doPut/doDelete……:使用时机同doGet、doPost,遇到对应的请求会被调用

1.2 HttpServletRequest

【1】地位

Tomcat 收到HTTP请求后,就会把请求解析成该对象

【2】方法

  1. getProtocol():返回请求协议的名称和版本
  2. getMethod():回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT
  3. getRequestURI():返回该请求的 URL
    • 什么是URI:URL可以理解为是URI的一种实现方式,但是两者经常混用
      • URI指的是唯一资源标识符,可以区分不同的资源
      • URL则是唯一资源定位符,用来描述网络上一个资源,又因为资源是唯一的,所以可以定位资源
  4. 获取请求中参数的值
    • getParameterNames():拿到所有的key
    • getParameter(String name):根据key拿到value
    • getParameterValues(String name):涉及到一个key对应到多个value值的情况,并不经常使用
  5. 获取请求头中的内容:获取到请求头的键值对。Tomcat 在收到请求之后会把请求头解析成Map。
    • getHeaderNames()
    • getHeader(String name)
  6. 获取请求主体中的内容
    • getCharacterEncoding():获取到 contentText 里的字符集。字符集本质上是 contentType 的一部分,但是由于关于字符集的操作使用很频繁,所以被单独拉出来
    • getContentType():获取到 body 里的类型
    • getContentLength():获取到 body 的长度
    • getInputStream():获取到能读取到body内容的流对象

【3】关于构造请求

  1. 服务器只能比较方便地构造出Get请求,至于其他类型的请求,我们需要使用ajax或者postman构造
  2. 实际开发中,常用的请求是 Get或Post

1.3 HttpServletResponse

【1】地位

与 HTTP响应数据匹配

【2】方法

  1. 给 header 赋值
    • setHeader(String name, String value):如果存在,新覆盖旧
    • addHeader(String name, String value):如果存在,新旧并存
      • 一般来说,约定键值对的key是要唯一的,但是实践中,可能会出现一个key对应多个value的情况,但这个是由浏览器/HTTP客户端来控制的
      • Map无法允许key重复矛盾:注意,【Tomcat会将header解析成Map形式】只是一种粗略说法,实际上Tomcat内部不一定是把header解析成Java标准库的Map。Java标准库的Map并不允许key重复,但有第三方库是允许的
    • 示例:通过 refresh 属性,设置浏览器自动刷新
      • resp.setHeader(“Refresh”, 2): 浏览器每隔2s自动刷新一次。
        实际上并非是精确的2000ms,一般会大一些。因为从 “浏览器发起请求” 到 “服务器响应”再到“页面被解析出来”都是需要消耗一定的时间的
  2. 设置状态码
    • setStatus(int sc)
    • 关于个性化错误页面:Tomcat 是可以在返回状态码的时候,给body写入数据的,此时就可以得到一个“个性化的错误页面”。Tomcat有自己内置的错误页面,比如【resp.sendError(404)】,但由于太丑,日常开发中我们往往还是会选择自定义

四、涉及状态码的错误排查(404……)

  1. 404:浏览器要访问的资源,服务器上并不存在
    • 检查请求路径和服务器配置是否一致
    • 确认webapp是否被正确加载:我们的程序是通过
  2. 405:方法不允许
    • 请求发起的方法与对应的doXX方法不匹配。如在浏览器中输入一个url地址,就是发起Get请求。
    • 没有删除父类的方法。如父类的doGet方法会先获取一个版本号,根据版本号发送不同的错误,并会指定一个错误页面
  3. 500:服务器内部错误,代码出现了异常
  4. 空白页面:服务器没有给浏览器返回任何的body数值
  5. 无法访问此网站:Tomcat 服务器未正确运行/IP/端口号编写不对

五、关于自定义数据 ---- body或query String 里面的内容

5.1 地位

实际开发中,利用header的部分较少,更多的时候,我们是希望获取到 query string 或 body 的内容,因为这些内容是自定义的,可以供我们完成服务。

5.2 给服务器传递自定义数据

  1. 方式:HttpServletResponse有获取参数的方法,获取的参数就是我们传过去的这些数据。我们共有四种方式传递数据:a=x传递、Postman传递form表单、Postman传递JSON数据、ajax传递。
  2. a=x传递
    • 这个是把数据传到query string里
    • query string本身是键值对结构的数据,Tomcat 在收到这个请求后,就会把这个query string解析成Map这样的键值对,使用getparameter就可以根据key获取到value。
  3. Postman传递form表单:使用form表单的形式提交,此时的body也是键值对格式
    • 这个是把数据传到 body 里
    • 如果是通过post form表单的形式提交的请求,body此时就也是和query string一样的键值对格式
    • 如何发送数据
      在这里插入图片描述
  4. Postman传递JSON数据
    • 注意:JSON格式下,key一定是字符串格式,原则上key是不需要加“”,但是有些库/程序检查比较严格,是需要给key加上“”的.
    • Postman 构造的JSON数据需要给key加上“”,Ajax 构造的则不需要加上“”
      在这里插入图片描述
    • 类里面的属性为什么不使用private:本身,Jackson 会通过反射的方式,把User类里包含的public属性都获取到,此时就可以根据反射这里得到的“属性名字”,去JSON解析出来的键值对中进行匹配,如果匹配到了,就把value设置到刚才得到的属性中。而Jackson并不会直接针对private属性进行扫描,所以如果要使用private,需要提供getter和setter方法
class User{
    public String username;
    public String password;
}
@WebServlet("/JSON")
public class JSONServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(req.getInputStream(), User.class);
        resp.getWriter().write(user.username);
        resp.getWriter().write("<br>");
        resp.getWriter().write(user.password);
    }
}
  1. ajax传递
    • 既可以传到 query string,也可以传递body中
    • 如果是传递到 query string 中,依旧可以使用 getParameter 来获取
    • 如果是使用 ajax Post 提交【不是 from表单的格式】,就需要使用 getInputStream 来获取

5.3 获取自定义数据

  1. 获取query string 里的值
    • 约定数据:约定前端传过来一个怎样的数据
      • 形如 【password = 】这样的请求(只说明 key,不说明 value),password的值将是“”,即一个空字符串。
      • 如果不传password(忽略key),password的值是null
    • 选择调用的方法:调用getParameterNames()、getParameter(String name)、getParameterValues(String name)方法
  2. 获取body(只考虑form表单的格式)
    • 约定数据:Post方法下,提交的数据才会在body里
    • 和query string一样,使用 getParameter(String name)方法获取数据
  3. 获取body(考虑为JSON格式)
    • 为什么要引入Jackson库
      Servlet 自身不能对JSON的数据进行解析,所以我们需要引入第三方库来解析body数据,把这里面的键值对还原成如Map一样【key-value】的形式。而能够实现解析操作的库很多,我们这里使用Jackson来解析。
    • 引入 Jackson 库:通过Maven引入,选择【Jackson Databind】。版本选哪个都行,但最好不要选择新版本,因为新版本往往没有经过时间充分的验证,可能会有问题
    • 如何使用Jackson库:一个类,两个方法
      • ObjectMapper类:对象映射,可以实现JSON数据和对象间的转换
      • JSON数据转类对象:readValue(InputStream src,JavaType valueType),该方法会先把JSON字符串解析成键值对,再放到Map中,然后根据参数填入的类对象,通过反射API知道这个类的属性名和类型,一次把这里的每个属性都取出来后,通过属性名字查询上述的Map,最后把得到的值赋值给这个类的属性。
      • 类对象转JSON数据:writeValueAsString(Object value)
    • 关于类和JSON格式的转换问题:因为是使用匹配来转换,所以构建类要求属性名和键值对相同

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络抓包工具tcpdump是如何实现抓包的,在哪个位置抓包的?

Linux网络抓包工具tcpdump是如何实现抓包的&#xff0c;在哪个位置抓包的&#xff1f; 1. tcpdump抓包架构2. BPF介绍3. 从内核层面看tcpdump抓包流程3.1. 创建socket套接字3.2. 挂载BPF程序 4. 网络收包抓取5. 网络发包抓取6. 疑问和思考6.1 tcpdump抓包跟网卡、内核之间的顺序…

ffmpeg音视频裁剪

音视频裁剪&#xff0c;通常会依据时间轴为基准&#xff0c;从某个起始点到终止点的音视频截取出来&#xff0c;当然音视频文件中存在多路流&#xff0c;所对每一组流进行裁剪 基础概念&#xff1a; 编码帧的分类&#xff1a; I帧(Intra coded frames): 关键帧&#xff0c;…

linux(ubuntu18.04.2) Qt编译 MySQL(8.0以上版本)链接库 Qt版本 5.12.12及以上 包含Mysql动态库缺失问题

整理这篇文档的意义在于&#xff1a;自己走了很多弯路&#xff0c;淋过雨所以想为别人撑伞&#xff0c;也方便回顾&#xff0c;仅供参考 一、搭建开发环境&#xff1a; 虚拟机&#xff08;ubuntu-20.04.6-desktop-amd64&#xff09;&#xff1a;Mysql数据库 8.0.36Workbench …

pytorch库 01 安装Anaconda、Jupyter,Anaconda虚拟环境连接pycharm

文章目录 一、安装Anaconda1、卸载Anaconda&#xff08;可选&#xff09;2、下载并安装Anaconda3、配置环境变量4、桌面快捷方式 二、安装 PyTorch&#xff08;GPU 版&#xff09;库1、创建虚拟环境&#xff0c;并安装一些常用包2、GPU 基础3、检查驱动4、安装CUDA&#xff08;…

数字化转型新篇章:企业通往智能化的新范式

早在十多年前&#xff0c;一些具有前瞻视野的企业以实现“数字化”为目标启动转型实践。但时至今日&#xff0c;可以说尚无几家企业能够在真正意义上实现“数字化”。 在实现“数字化”的征途上&#xff0c;人们发现&#xff0c;努力愈进&#xff0c;仿佛终点愈远。究其原因&a…

Springboot+Vue项目-基于Java+MySQL的校园外卖服务系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

企业营销战略新思考:营销5.0与开源AI智能名片S2B2C商城小程序引领私域流量经营新纪元

随着互联网的深入发展&#xff0c;企业营销战略已经不再是单一、静态的规划&#xff0c;而是一个持续进化、与市场紧密相连的动态过程。在这个过程中&#xff0c;营销5.0和开源AI智能名片S2B2C商城小程序的结合&#xff0c;为企业营销战略注入了新的活力&#xff0c;也为私域流…

EasyRecovery数据恢复软件2025永久免费电脑版下载

EasyRecovery数据恢复软件是一款业界知名的数据恢复工具&#xff0c;它凭借强大的恢复能力和广泛的数据兼容性&#xff0c;帮助用户从各种存储设备中恢复丢失或删除的数据。以下是关于EasyRecovery数据恢复软件的详细介绍。 EasyRecovery绿色破解下载网盘链接: https://pan.ba…

《QT实用小工具·四十七》可交互的创意动态按钮

1、概述 源码放在文章末尾 该项目实现了可交互的创意动态按钮&#xff0c;包含如下功能&#xff1a; 所有颜色自定义 鼠标悬浮渐变 两种点击效果&#xff1a;鼠标点击渐变 / 水波纹动画&#xff08;可多层波纹叠加&#xff09; 额外鼠标移入/移出/按下/弹起的实时/延迟共8种事…

2024最新版JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)

目录 一、编码与加密原理1.1 ASCII 编码1.2 详解 Base641.2.1 Base64 的编码过程和计算方法1.2.2 基于编码的反爬虫设计1.2.3 Python自带base64模块实现base64编码解码类封装 1.3 MD5消息摘要算法1.3.1 MD5 介绍1.3.2 Python实现md5以及其他常用消息摘要算法封装 1.4 对称加密与…

在kuboard中添加k8s集群

1.登录kuboard后&#xff0c;点击添加集群面板 系统会跳转到k8s集群添加页面&#xff0c;按照页面提示输入自身的集群信息即可&#xff0c;此处没有什么难点。 添加成功后&#xff0c;点击集群面板&#xff0c;然后点击集群概要信息&#xff0c;就可以查看集群节点信息。 集群节…

mac配置maven

在 macOS 上配置 Maven 也相对简单。以下是一种常用的方法&#xff1a; 1. 安装maven **下载 Maven&#xff1a;**首先&#xff0c;你需要从 Maven 官网&#xff08;https://maven.apache.org/download.cgi&#xff09;下载最新版本的 Maven。你可以选择二进制压缩包&#xf…

ctfshow web78 获取flag(用老版的火狐浏览器)

题&#xff1a; 第一种&#xff1a;利用input伪协议 ,获取到flag ?filephp://input POST data <?php system(tac ls) ?> 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readcon…

Java网址url工具类

功能描述 无需引入三方依赖文本匹配网址&#xff08;支持多个&#xff09;网址解析&#xff08;包括协议、主机、路径、参数等&#xff09; package com.qiangesoft.image.utils;import org.springframework.util.Assert; import org.springframework.util.CollectionUtils;i…

使用 Wireshark 实现 ARP 嗅探监听网络

前言 Wireshark是一个开源的网络协议分析工具&#xff0c;用于捕获和分析网络数据包。它可以在多个操作系统上运行&#xff0c;并提供了强大的功能和用户友好的界面。 通过Wireshark&#xff0c;用户可以捕获网络流量&#xff0c;并对其进行深入的分析。它支持多种协议的解析…

Unity 合并子物体获得简化Mesh

合并子物体获得简化Mesh &#x1f959;环境&#x1f96a;Demo &#x1f959;环境 PackageManager安装Editor Coroutines 导入插件&#x1f448; &#x1f96a;Demo 生成参数微调&#xff1a;Assets/EasyColliderEditor/Scripts/VHACDSettings/VHACDSettings.asset

大数据开发工作中的数仓设计(Hadoop,hive ,mysql )

1.HUE工具介绍使用 HUE是CDH提供一个hive和hdfs的操作工具&#xff0c;在hue中编写了hiveSQl也可以操作hdfs的文件 http://主机名字:端口号 hdfs的web访问端口 http://主机名字:端口号 hdfs的程序访问端口 进入后确保hdfs hive yarn 开启 在点击hue开启 在这里面也可以进行h…

android studio拍照功能问题解决

1.点击拍照功能直接闪退 2.拍照后不能选择确认键&#xff0c;无法保存 上述是在android studio做项目中经常会使用到模拟器或真机的拍照功能时主要遇到的两个问题。 解决方法&#xff1a; 1.直接闪退问题&#xff1a; if(Build.VERSION.SDK_INT>Build.VERSION_CODES.N)…

【HTML植物大战僵尸源码】

HTML植物大战僵尸源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 index.html <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta name"KeyWords" content"lonelys…

Vue3 + TS 项目实战 - 后台管理系统 - 按钮权限

前期回顾 网站的打赏 —— 新一代的思路-CSDN博客https://blog.csdn.net/m0_57904695/article/details/136704914?spm1001.2014.3001.5501 目录 &#x1f6a9; XX银行_系统管理_按钮权限控制_前端_提测单 项目信息 提测版本信息 功能列表 测试范围 测试环境 ✅ 步…