百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

提莫:请求、响应和重定向("请求 - 响应"式网络服务有什么优势呢?)

wxin55 2025-02-04 16:35 10 浏览 0 评论

大家好,我是提莫。这节来讲三个东西,分别是请求、响应和上下文。转发和重定向将放在下一节再来讲。

什么是请求?在这里HTTP Server request对象封装了客户端发送的HTTP请求的所有信息,包括请求的方法、请求的URL、请求参数等。怎么去获取这些信息?待会会带大家在代码里面来看一下。

另外需要提到的是servlet,HttpServletRequest对象是reguest,它的生命周期只是一次请求,也就是当请求结束之后,它的对象会被销毁。

来到代码里面看一下,在之前是不是有一个获取验证码的servlet?在这里是不是有两个对象,分别是request对象跟response对象。request就是请求,response是不是就是响应?

先来看一下从请求里面能够拿到哪些数据?首先可以通过它点getProtocol,就是协议,在这写一下注释,然后去打印一下。当然也直接可以把文档里面内容复制过来,逐一看一下究竟是哪些内容。

·第一个是不是协议?

·第二个是不是请求方法?

·第三个请求的URL。

·第四个请求的URI。

·第五个获取的是什么?获取的是一个参数,这个参数的名字叫做username。当然同理前面加一个前缀,这样看的比较清晰一点。

在最后在这里去设置了一个值,设置的内容放在后面再来讲。

·先看一下前面的这一部分,可以先把项目给启动起来,点击这里的开机,现在项目已经启动好了。

·接下来访问一下验证码,验证码已经正常输出。

·接下来看一下控制台,在这里会发现协议是多少,是不是HTTP1.1的协议?请求方法是不是get请求?请求的URL是不是完整的?地址栏这里的请求路径,当然前面有这个协议。

·接下来请求的URI是什么?是不是就是这里的captcha,它是去除了前面的加端口,加你的项目名,只保留了最后这一个。

·这里我还获取了一个什么?我是不是还获取了一个username的这样一个参数,但是现在打印出来是什么?是不是null?因为并没有这个username。

·可以把控制台先清空一下,怎么清空?这里有一个删除的小图标,点击它就可以把控制台清空了。

·接下来要怎么做?我要模拟用户名的参数,怎么模拟?接收get请求,传参是通过一个问号,在问号后面就可以给你的参数。例如我这里需要一个username,那它的值是什么?值就叫做提莫。注意,我这里是英文的提莫,当然这是拼音,然后我写一个英文的提莫。

·访问一下验证码,还是正常刷新的,看一下控制答案,这里username是不是就提莫?我已经拿到了这个参数,这就是request对象,从里面去获取一些信息。这些信息上节是不是提到过了?其实也可以在浏览器的控制台这里看到,这里是不是有个网络,刷新一下,可以看到这里是不是有这些信息,有请求头、响应头等等,包括请求方式。

·说完了request的对象之后,接下来说一下response对象,response就是响应,它主要的作用就是将servlet处理后的数据封装成HTTP响应消息,返回给客户端。

·刚刚验证码的内容是不是把验证码封装成了HTTP响应,然后返回给了浏览器,在响应里面主要有一些内容可以来设置,这里我给大家看一下(Conte),说了Wob变范内,例如设置它的字节编码,就是有的时候输出的内容可能会乱码,尤其是中文,这里可以设置字符编码是UTF杠8。

·还可以去设置响应头,现在其实也可以看一下,默认也是有一些响应头的,在这里是不是有个响应表头,这里是有服务器的信息,有日期,以及响应的内容,它的长度是不是5000多个字节。

·除此之外还可以去设置响应的类型,这是什么意思?也就是响应给前端的内容可能多种多样,例如响应的是一张图片,或者响应的是一个网页,或者响应的是一个音频文件,是不是都有可能?所以可以去设置响应类型。

这样浏览器在拿到这个类型之后,是不是就可以根据这个类型来做不同的处理?来尝试一下。

·其实在这里先拿到response对象,然后去设置字符编码,是不是可以设置character encoding?例如这里设置为什么?UTF杠8。

·还可以设置什么?设置响应的类型,也就是content type。这里是什么类型?这里应该是图片,当然图片是一个比较详细的分类。

·还可以设置它是什么类型?设置它是二进制数据,图片本身也是二进制的数据,这里主要是两个大的分类,前面是大分类,后面是小的分类。关于这个分类后面可以出一个单独的章节再来讲,本身还是很简单的。

·然后看一下还可以设置什么?是不是去设置一个响应头,点setheader,这个响应头的内容有的时候可以随便写,当然通常会有一定的开发规范,这随便写一个就叫做test adder,它的值是什么?就叫做提莫。

这样响应头就设置好了。

·接下来重启一下项目,重新运行一下,再来访问看一下响应结果会不会有什么变化。

·项目已经重启好了,接下来重新访问一下,可以先把这个清空,重新来刷新一下。看这一次的请求与响应,在响应头这里之前是不是只有三个,但是现在大家会发现这里是不是有一个响应的类型,并且它的编码是utf杠八。

·这里还有个test header值是t,这是不是我自己定义的数据,也展示在了这里,这就是设置请求与响应。

·接下来再看这节的最后一点,Sytenoutite最一点是什么?System.out.printin("neRath:是一个context,Sytenott,大家可能初次听到这个词汇会觉得有一点陌生,什么叫做上下文?其实上下文就代表一个事情的来龙去脉,例如请求跟想,请求从哪来?最终得到一个什么结果?是不是在一个环境中发生的?

·这里看一下Sytenoutite的定义,它其实是Web应用中的接口,代表的Web应用的上下文,提供了Web应用内共享数据、配置参数、资源访问等等功能。在这里它代表的是应用,并且在应用启动时由服务器创建,什么时候销毁?当外部应用停止时候才会销毁,这样是不是可以在所有的server letter中共享数据?

·接下来怎么做?还是先回到代码里面,看一下究竟怎么去拿到对象。在这里直接调用,叫做get servlet context,是不是就拿到了上下文对象?点进去看一下是不是在父类中来的。

·拿到了对象之后可以干什么?它代表的是当前的项目,获取一下访问的跟路径,context path。其实context path从哪来?其实在之前配置插件的时候,是不是在这里配置的?它的pass是不是就是一个斜杠。所以在这里如果获取可能是一个空的字符串,也有可能如果在这里配置了一个什么?例如叫做mayven杠Demo,它在获取的时候获取的值就应该是mayven杠Demo。

除此之外它还可以去获取某一个文件的真实路径,这里可以怎么做?是不可以通过context点get attribute,这里传进去一个文件,最终它可以返回这个文件的真实路径。这里暂时先不调用,但是要了解servlet context主要还是去了解它怎么去共享数据。

为什么要了解它怎么共享数据?大家想一下,在这里仅仅是一个servlet,一个request的response,在这里可以拿到数据。但是大家想一下,如果想在多个servlet之间共享数据,是不是要把它存放到一个公共的地方?

context怎么存数据?可以通过它点set attribute,比如要存一个什么数据?存一个用户,那个用户叫什么名字?叫做提莫,是不是这样就可以把它存进去了?在需要使用它的时候是不是可以通过它点get attribute,这样又把user给取出来,是不是就拿到了它的名字?然后就可以进行使用了。

当然它得到的是一个object对象,可以对它做一定的类型转换。这节只是简单的去了解一下这三个对象,大家有个初步的印象就可以了。下一节来讲一下请求转发跟请求重定向,下节再见。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: