深入解析HTTP响应数据格式:数据行、状态码与网页载入速度优化
回复

首先我们介绍一下它的数据格式
首先需要了解两个主要类别,数据行和数据标题。其他还有数据空白行和数据体,这里就不写了。
关于数据线,我们介绍两大类,一类是数据响应线,一类是状态码。
数据响应线
HTTP/1.1 200 正常; // 这是它的数据响应行,我们可以去浏览器F12看看
以下是状态码
1xx:服务器收到客户端消息一段时间后,发送1xx状态码,主要是为了防止请求一次断开,大大降低了网页的加载速度。
2xx:通常是200,表示成功。
3xx:代表302,表示重定向成功,还有304。即客户端请求一次服务器的文件资源后,本地会生成缓存。下次客户端请求时,客户端可以直接使用本地缓存直接加载。
4xx:代表404,说明服务器没有这个资源路径,是客户端问题。 405:代表网页提交的表单方法,服务器中没有对应的处理方法。
5xx:代表500,表示客户端出现错误。一般会出现异常日志。您可以根据日志查找错误。
我们可以通过code来设置其响应的状态码。该函数将用于重定向操作,如下:
response.setStatus(int 状态码);
数据头,里面有很多信息,所以我们后面很多操作都会用到它。
这里介绍两个,一个是Context-Type,另一个是Context-disposition
Context-Type:告诉服务器响应内容是什么以及编码格式
上下文类型:text/html;charset=utf-8;
关于响应头,这里提一下text/html可以通过函数获取。
servletContext.getMimeType(); // 这里获取的是当前请求网页的响应体内容的格式。
Context-disposition:用于告诉浏览器如何处理响应正文。响应正文是网页的数据。
一般有两种方法,如下:
排队; // 在当前浏览器页面中打开,这是默认方法
附件;文件名=文件名; //这是作为附件打开并用于下载文件
这是一个可用于设置所有响应标头的格式的函数。注意,是resposne的响应头,而不是request。两者的响应头不同。
response.setHeader("响应头的昵称", "响应头对应的格式"); // Context-Type 和 Context-Disposition 都可以通过该函数设置
接下来我们就来说说如何设置编码格式,因为浏览器的编码解析是固定的,有的是GBK,有的是UTF-8,但是我们响应的是ISO编码,所以我们需要设置一下,看下面的代码细节
// 下面先讲复杂的
response.setCharacterEncoding("utf-8"); // 这是设置流的默认编码,流:就是给浏览器的响应体数据
response.setHeader("context-type","text/html;charset=utf-8"); // 这里是建议浏览器采用我们服务器所采用的编码格式
// 这个就是简单的
reponse.setContextType("text/html;charset=utf-8"); // 这个就是强制浏览器使用这个编码了,一般来说,这个用的比较多
接下来我们就来介绍一下路径的规则。这部分比较复杂,需要手动练习才能获得更好的体验和理解。
我们先说相对路径,就是自身资源相对于目标资源的路径。让我们看下面的例子。
首先我们访问服务器后,是这样一个网页,链接如下(/test是虚拟目录)
本地主机/测试/web/login.html;
其次,我们在登录界面输入登录数据后,还需要跳转到某个资源去查数据库,对吗?然后我们需要在login.html中写入资源路径。用户触发某个按钮后,可以跳转到下面的资源路径来验证用户数据。
本地主机/测试/web/loginServlet;
那么我们来看看上面的内容。 localhost/test/web 的路径都是一样的。这是相对的。我们只想访问同一级别的另一个资源。然后我们就可以使用下面的访问方式
./ 这是访问当前同级目录下的另一个资源
…/ 两点是访问上层目录中的另一个资源。这是相对于我们的 localhost/test/web 资源路径,也就是我们当前所在的资源路径。
需要注意的是,任何以 .是相对路径! ! !
存放特定资源的路径(IDEA版本)
项目名称\out\artifacts\Web_war_exploded
我们继续讨论绝对路径。绝对路径就像我们电脑文件夹上的方框,比如C:\Windows。这是利用盘符直接将文件从根目录移动到文件所在目录。全部显示出来。这是绝对目录。不添加绝对目录。以/开头,/代表服务器资源的根目录。
说了这么多,其实Web中的绝对路径只是是否添加虚拟目录的问题。
如果服务器向客户端发送资源,则无需添加。如果客户端发送给服务器,则需要添加。
为什么?因为比如上面的login.html,在虚拟目录/text下有login.html,而且它在其他目录下也有一个叫login.html的资源,那么客户端要找哪一个呢?
不需要服务器内部转发,就像请求的转发功能一样。它是内部转发,不会让浏览器重新发送请求。重定向必须添加虚拟目录,因为重定向是两个请求。最后,客户端将其发送到服务器。
我们在编写代码时,获取虚拟目录时最好不要手动编写,而是使用 request.getContextPath();这样,如果虚拟目录发生变化,也可以动态更改。
我们先来说说简单的字符输出流和字节输出流。记得转换编码格式。
response.getWrite.write(需要输出的字符); // 这个就可以将数据发送到网页上显示
response.getOutputStream.write("Hello World".getBytes()); // 这个就可以将字节数据发送到网页上
最后我们来说一下重定向
重定向有两种方法,一种是简单的,另一种是困难的。
重定向是两个请求
第一次:客户端->服务器,服务器->客户端(服务器告诉客户端需要重定向的资源)
第二次:客户端->服务器(跳转到上一次服务器发送的资源路径),服务器->客户端
所以请求字段在这里没有用处
难的
response.setStatus(302); // 先设置状态码,302是代表重定向
response.setHeader("location","资源路径"); // location 是代表的是位置,也就是资源路径,后面的资源路径可以是当前服务器的资源路径,也可以是任意一个网页的地址
简单的
response.sendRedriect("资源路径"); // 这个就是简化版的,它直接帮我们解决了上面两个固定的东西
本文最后是ServletContext的介绍
ServletnContext:代表整个服务器域。只要服务器不断开,就可以访问该域内的任何数据和所有资源。
获取并使用
cont = request.getServletContext(); // 这里会得到一个 ServletContext 对象
cont.setArrtibute("key","value"); // 和 request域 操作数据一样,都是这个方法,只不过调用的对象不一样
cont.getArrtibute("key");
cont.removeAttribute("key");
获取MIME类型:text/htm:大类型/小类型。您可以通过web.xml了解每个文件。
String getMimeType(字符串文件); // 获取给定文件的大小类型,如1.jpg 2.html
获取文件的真实路径,即文件在服务器上存放的本地资源路径
如果服务器中存储的是1.jpg文件,可以通过该方法直接定位到本地资源,一般用于上传文件。
注意:src目录下的文件存放在WEB-INF下的classes文件夹中。
String getRealPath(字符串路径); // 需要给出服务器的绝对路径,如/test/day15/login.html
设置不使用缓存,因为服务器会存储缓存,导致我们下次访问时仍然有最后的数据。
response.setDateHeader("Expires",0 );
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");