面对浏览器的请求,服务器如何回应?

今天是刘小爱自学Java的第90天。

感谢你的观看,谢谢你。

话不多说,开始今天的学习:

昨天学习了request,做一个简单的回顾:

request是浏览器向服务器发起请求,会传递一些信息。

那么现在问题来了,我向你发起了请求,你是不是应该给我一个回应?

这就需要使用到response响应了。

response和request有一定的类似之处,今天就来仔细学一学这个response。

一、响应response

1响应流程

浏览器向服务器发起请求

浏览器通过映射路径向服务器发起请求,昨天已详细讲解,不再赘述。

服务器响应浏览器

既然是响应,肯定是通过response对象调用方法响应,其API为:

getWriter().print("hello")。

就是一个输出语句,这样在服务器中就将信息响应给浏览器了。

我这里使用的是一个字符串,也可是使用某个对应路径的文件,比如图片。

2响应报文

在请求中有请求行、请求头、请求体;在响应中也会有响应行、响应头、响应体。

同样的操作,使用抓包工具查看响应数据:

响应行

昨天学请求报文的时候,我一直以为General中的都是请求头。

事实上这是由请求行和响应行共同组成,其中它们还有重复的部分。

请求行包括:请求方式 ,url 和协议/版本

响应行包括:状态码,协议/版本。

响应头

同样也是以键值对的形式传递一些信息。

响应体

在Response选项卡中可以看到响应体,也就是输出的内容。

3响应行中的状态码

关于状态码是非常多的,状态码由三个数字组成,根据开头第一个数字有不同的功能。

根据第2、3个数字又有进一步垂直细分。

因为状态码太多了,很难将其每一个都记下来,了解常用的几个即可。

200:请求成功,上述例子中的也就是200

301:资源永久被转移到其他URL了

302:请求的资源临时从不同的URI响应请求。

404:资源不存在,这也是非常常见的状态码了。

500:服务器内部错误,通常也就是代码哪里写错了。

二、响应API

和请求API一样,响应API是通过Java中HttpServletResponse这个类对应的对象操作。

1响应行

setStatus(200)方法,参数即为状态码,可以向服务器发送对应的额状态码。

虽然说响应行中也有协议/版本,但是这些服务器是不能设定的,这也很好理解,都是由统一制定的规则。

2响应头

setHeader(参数a,参数b)方法,一共有两个参数,可以实现对应的功能,逐一讲解:

关于页面定时刷新:

参数a:refresh,刷新的意思。

参数b:由时间和url组成,两者之间使用分号隔开。

比如“2;url”即表示2秒后页面刷新到对应的url。

我做了一个测试,发现如果时间不写,只写一个url,刷新页面时竟然不会跳转。

也不知道我是不是忽视了什么,暂且就以这个测试作为一个结果好了。

内容类型为简单文本:

参数a:content-type,也就是内容类型。

参数b:text/plain;charset=utf-8,两者之间也是使用分号隔开,前者为文本内容,后者为编码。

因为该方式时常被使用,所以其有一个简化版的方法:

setContentType(text/plain;charset=utf-8)

说白了也就是将setHeader()方法中的参数a变成方法名里的一部分了,也好理解记忆。

内容类型为HTML:

中参数为text/plain,plain,简单的朴素的意思,也就是其输出的内容是没有经过渲染的,输出什么就是什么。

而中是text/html,html是超文本标记语言,在浏览器中会经过渲染成对应的格式。

输出的虽然是h1标签,但是在浏览器中会被渲染成一个标题格式的字体。

3响应体

也就是最先开始说的API:getWriter().print()

三、重定向

昨天学习了request中的转发,在response中有个和其非常类似的功能,叫重定向。

重定向,重新定了一个方向。浏览器访问服务器是有多次的。

第一次访问服务器

根据浏览器的访问路径,服务器通过响应头实现重定向:

setHeader("location","/responseServletTwo")

前面参数为location,后面参数为对应的路径。

这个的意思就是服务器响应浏览器,告诉它:你去找我给你设定的这个路径。

事实上,这时就已经完成一次请求一次响应了

其还有一种简写方法:

response.sendRedirect("/responseServletTwo")

Redirect,翻译就是重定向的意思。

第二次访问服务器

浏览器根据服务器重定向的路径再次访问,这样就找到了ResponseServletTwo。

该servlet再次响应浏览器,从而输出内容。

以上就是对于重定向的说明,其作用和request中的转发非常的相似。

转发与重定向也有一定的区别,画图分析:

转发本质上只有一次请求一次响应,是服务器内部的转发行为。

无论多少次转发就一次请求和一次响应,浏览器上的路径不变。

重定向是多次请求多次响应,浏览器上的路径发生了改变。

用现实生活中的一个例子来理解:

我去吃饭的时候,发现碗里有不喜欢的菜。

我将菜直接给我妈妈了,这就叫转发。

我将菜重新放回菜碗里了,并对我妈说您吃,妈妈从菜碗里夹过去吃了,这就叫重定向。

菜碗就相当于浏览器,我和我妈都是服务器中的servlet之一。

当然,这个例子不太准确,毕竟浏览器是主动方,是由它发起请求的,菜碗是被动的。

这是暂且使用这个例子来加深自己对其的理解。

最后

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200713A0RMO600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券