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

文章目录

  • 一、三个核心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.mfbz.cn/a/585058.html

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

相关文章

【AI写作】未来科技趋势:揭秘DreamFusion的革新力量

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

分享一个网站实现永久免费HTTPS访问的方法

免费SSL证书作为一种基础的网络安全工具&#xff0c;以其零成本的优势吸引了不少网站管理员的青睐。要实现免费HTTPS访问&#xff0c;您可以按照以下步骤操作&#xff1a; 一、 选择免费SSL证书提供商 选择一个提供免费SSL证书的服务商。如JoySSL&#xff0c;他们是国内为数不…

Ubuntu C++ man手册安装及使用

Ubuntu下C++ man手册安装 C++在线文档: http://www.cplusplus.com/reference/ 第一种办法:使用cppman $ sudo apt install cppman 使用方法 第二种办法: 打开网页:GCC mirror sites- GNU Project 点击下图中的突显行链接: Russia, Novosibirsk:

可平滑替代FTP的FTP替代解决方案,具有哪些强大功能?

FTP是一种广泛使用的文件传输协议&#xff0c;主要用于在网络上的计算机之间传输文件。具有以下特点&#xff1a; 1.简单易用&#xff1a;FTP协议相对简单&#xff0c;易于设置和使用&#xff0c;许多操作系统和应用程序都内置了对FTP的支持。 2.广泛的客户端支持&#xff1a…

售价不当人暴涨后,盘点当前更值得入手的SSD

PC 硬件市场本无测&#xff0c;去年 SSD 白菜价到如今彻底反转这一案例&#xff0c;可以说再次给我们狠狠上了一课。 当初被降价冲昏头脑&#xff0c;坚信 SSD 售价还会继续下探做起等等党的同学&#xff0c;看到今年这价格近乎翻倍行情估计得懵逼了吧。 不过既然有等等党&…

基于OpenCv的图像二值图和灰度直方图

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

Python新手入门基础英文笔记

1、字符串的操作 user&#xff1a;用户 name&#xff1a;名称/姓名 attibute&#xff1a;字段/属性 Value&#xff1a;值 2、重复/转换/替换/原始字符号 upper&#xff1a;上面 lower&#xff1a;下面 capitalize&#xff1a;用大写字母写或印刷 title&#xff1a;标题…

「笔试刷题」:求最小公倍数

一、题目 输入描述&#xff1a; 输入两个正整数A和B。 输出描述&#xff1a; 输出A和B的最小公倍数。 示例1 输入&#xff1a; 5 7 输出&#xff1a; 35 示例2 输入&#xff1a; 2 4输出&#xff1a; 4二、思路解析 这道题&#xff0c;也是模拟实现这一大类的一题…

探索的时光 (整数三分)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 5 3 2 1 2 3 输出 28 思路&#xff1a; 根据题意&#xff0c;已经给出了运算函数 当我们看到这些函数的时候&#xff0c;联想一下&#xff0c;它们的单调性&#xff0c;以…

Adobe PS 2023、Adobe Photoshop 2023下载教程、安装教程

Adobe Photoshop &#xff08;<-下载连接&#xff09;简介&#xff1a; Adobe Photoshop是一款广泛使用的图像处理软件&#xff0c;由Adobe公司开发。它提供了许多强大的工具和功能&#xff0c;可以用于图像编辑、合成、修饰、设计等各个领域。用户可以使用Photoshop来调整…

HotSpot VM概述

许多技术人员只把JVM当成黑盒&#xff0c;要想改善Java应用的性能和扩展性无疑是一项艰巨的任务。若要提高Java性能调优的能力&#xff0c;就必须对现代JVM有一定的认知。 HotSpot VM是JDK 1.3版本之后默认的虚拟机&#xff0c;目前是使用最广泛的Java虚拟机。本文主要介绍HotS…

行为型设计模式

一、责任链设计模式 &#xff08;一&#xff09;概念 使多个对象都有机会处理同一个请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 &#xff08;二&#xf…

算法学习Day1——【数据结构】单调栈

1.什么是单调栈以及单调栈的作用 &#xff08;1&#xff09;定义 顾名思义&#xff0c;单调栈是一个有序的栈&#xff0c;可能从栈顶到栈底单调递增&#xff08;单调递增栈&#xff09;&#xff0c;也有可能从栈顶到栈底单调递减&#xff08;单调递减栈&#xff09;。 &…

芯启智行丨基于G32A1445的汽车音乐律动氛围灯解决方案

随着智能汽车技术的深度渗入&#xff0c;汽车照明作为汽车设计的重要组成部分&#xff0c;正在重塑驾驶员与汽车的互动方式&#xff0c;从简单的照明工具优化升级为承载更多丰富功能和不同应用场景的智能化安全装置。现代智能车型广泛配备了前照灯、车内环境氛围灯、尾灯等汽车…

栈和链表的区分

栈&#xff08;Stack&#xff09;&#xff1a; 栈是一种特殊的线性表&#xff0c;遵循“后进先出”&#xff08;Last In First Out, LIFO&#xff09;原则。栈通常用数组或链表来实现&#xff0c;但重点在于其操作的限制而非底层数据结构。无论使用顺序栈&#xff08;基于数组…

读懂一本书笔记

文章目录 引言 我是一个用读书改变自己生活的人01 会读书&#xff0c;更要会讲书复杂时代&#xff0c;阅读是大众反脆弱的武器你焦虑吗&#xff1f;如何从“单向度的人”变为“多向度的人”第一&#xff0c;读书是主动的学习方式第二&#xff0c;读书是有针对性的学习方式 讲书…

kettle下载安装

下载方式&#xff1a; 1.官网下载 kettle下载链接&#xff1a; 老网站下载链接&#xff1a;https://sourceforge.net/projects/pentaho/files/这个网站已经弃用了 新网站地址获取方法&#xff1a;老网站下载链接打开&#xff0c;可以看到一个pdf下载链接&#xff0c;下载pdf 打…

二维码门楼牌管理应用平台建设:共治力量信息管理的革新

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、共治力量信息管理的重要性三、二维码门楼牌管理应用平台在共治力量信息管理中的应用四、二维码门楼牌管理应用平台的优势与挑战五、结语 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台的建设已成…

Spark原理之Cache Table的工作原理及实现自动缓存重复表的思考

CACHE TABLE的能力 使用此语法&#xff0c;可以由用户自定义要缓存的结果集&#xff0c;实际上就是一个临时表&#xff0c;不过数据存储在Spark集群内部&#xff0c;由Application所分配的executors管理。 一旦定义了一个缓存表&#xff0c;就可以在SQL脚本中随处引用这个表名…

Android 11 裁剪系统显示区域(适配异形屏)

概述 在显示技术中&#xff0c;"OverScan"&#xff08;超扫描&#xff09;是一种调整显示图像边界的技术。通常情况下&#xff0c;OverScan 会在显示屏的边缘周围裁剪一小部分图像。这种裁剪是为了确保显示内容在屏幕上的完整可见性&#xff0c;尤其是在老式电视或投…
最新文章