前言:本系列文章很多地方会以小白的角度来思考很多看似“简单”的问题。适用于对Servlet 有简单了解的人。本文是自己学习的过程,学习的体验,也是在本人的能力范围内,给大家尽量带来由浅入深的文章
本文章讲了什么
- 在你了解了基础Servlet运行原理之上,了解HTTP和Servlet的爱恨情仇
- HTTP的基础格式,以及和Servlet、服务器相关的HTTP知识
为了不打扰您的时间,本文不以介绍HTTP是什么为主要目的,若是您要从0-1学习HTTP,本文不适合您。
- 需要一点点的HTML知识
- 需要一点点HTTP知识
HTTP有什么作用
即使没有学过Servlet,您也知道HTTP是干啥的,数据传输的呗,OK,知道这点足够了。 稍微修饰一下语句:HTTP是web上客户和服务器进行通信的一个协议。 注:平时说HTTP,可能指的是这个协议本身,也可能指的是携带数据的HTTP报文(您认为成一个带有数据的信封也可以)
发送响应
响应就是:从客户端发送的HTTP请求,在后台有Servlet接口,容器在接收到用户的HTTP请求之后,把这个请求封装成HttpServletRequest,然后容器在自己管理的Servlet里面找到对应的Servlet处理。
传输网页信息HTML“字符串”
不知道你在浏览界面的时候,有没有思考,你的网页是谁管理的,是国家吗?还是某个机构?亦或者是网站管理员,我相信你应该知道是管理员,那么这个HTML是怎么到你的电脑的呢? 【HTML】:HTML是啥,其实也是一段字符,一个HTML网页,其实你可以看成一个字符串,也是一段信息,这个信息是可以被传递的,后台把HTML响应作为返回数据给用户浏览器。 【HTTP】:用户要啥,HTTP询问啥,能找到我都给你,怎么处理数据是浏览器的事情喽,怎么显示也是。
网址URL
要想介绍HTTP,URL不介绍,真的很难进行下去欸。 当我们访问一个服务器下的网页,浏览器会发送请求,这个请求包括了啥呢,主要说明一些属性,比如说User-Agent,请求方法,数据大小,域名URL 一个请求,请求的最重要的参数我觉得是URL了,下面看看URL包括了啥
流程解析: 当输入一个网址,会调用 get请求发送到服务器,服务器反应后找到页面代码,包装到响应体中,然后返回给用户。 没有URL,你不知道去哪请求,你不知道对方使用的协议–无法交流,你不知道对面端口(只知道几号楼,不了解第几层),你不知道请求的页面(你找对位置了,却不知道你要杀)。
POST和Get
谈及HTTP,谈及获取数据,POST和Get是逃不掉的。 这两个都是请求方法,也就是请求的类型。 对于POST和Get,都能传输数据,但是是有一些区别的。 最主要的区别
- POST有请求体,存放参数更安全;Get没有体
- POST数据长度没有限制,Get参数长度有限制
POST
一般用户传输一些数据较长的数据,或者是携带一些重要的,需要隐藏的参数数据。
例如如下:第二个框,里面写了两个参数,这个位置是POST请求的体,是用来传输数据的,POST和Get的区别之一就是参数是放在体中的,这个比Get要安全很多,Get的参数是在URL中以键值对的形式出现的,并且Get是没体的传输的参数是以Get显式跟在URL之后的。 简要说明上面的图片: 分为两个部分,第二个红框及之前都是请求的报文,之后是HTTP响应报文
- 【请求行】以POST方式,发送到目标地址
- 【请求字段】携带了很多信息,包括内容格式,长度…这里着重强调一下content-type:常用的两种一种是表单form,一种是json。
form是以键值对的形式传递参数的,例如你看看下面的图片。 如果要获取这个vvalue就需要 request.getParamter(key);来获取,对于POST和Get请求都是一样的
要注意的是,如果是POST请求,是可能有请求体的。如果要获取请求体内容 request.getReader();操作字符数据 request.getInputStream();获取字节输入流,可以操作所有类型数据 4. 【请求体】可以放传输的数据,参数等
Get
举个真实的例子,就是搜索,可以看见,使用的是Get,其实一般传递不是很重要的参数来获取数据,用Get是很多的,比如说获取网页,获取资源。 从这里,很容易可能到Get请求的URL中携带了很多参数。
POST和Get的幂等性探究及使用场景推荐
幂等性:这里指的是作用于对于资源产生的结果而非资源本身,即例如get如果返回的是不同的内容,但是不影响资源,那么就是幂等的。举个例子,使用get获取时间,获取到的时间不同,但是不影响其对后台资源。 Get方法
Get /tickets # 获取ticket列表 这里的get方法用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。 例如Get /time # 获取当前时间 这里每次调用会返回不同的内容,但是对资源本身不产生影响,所以是幂等的
Post方法 Post /tickets # 新建一个ticket 这是一个非幂等的方法,因为调用多次,都会产生新的资源,它对资源本身能产生影响,因此不满足幂等性。
【使用场景探究】 GET通过URL提交数据,数据在URL中。这方法是幂等的,所以他适合查询类的 POST放在响应体中。这方法是非幂等的,所以代表的是新增操作 当如果数据过长,会考虑讲GET使用POST来代替。
POST和Get请求发送到后台有啥区别
其实区别不大,都会被封装成一个HttpServletRequest,然后交给Servlet,下面是Servlet的生命周期,也是其运行的原理
Servlet处理完是怎么返回数据的
上文说到了容器,不知道你对网络编程有没有了解,例如通过TCP可以建立两个主机之间的联系,HTTP是基于TCP。在用户传递HTTP请求之前,会建立一个连接,使得两者之间可以通过这个通道来传输信息。 当用户处理好响应和数据之后,就可以通过response.getWriter来获取输入流了。 代码示例:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
总结:
- PrintWriter:把文本数据打印到一个字符流。
PrintWriter writer = response.getWriter(); writer.println(“sfadfa”); - OutputSream:输出字节输入,可以是任何内容,但是注意要setContentType
ServletOutputSream out = response.getOutputStream() out.write(bytesArray)
响应返回其实就是在容器建立的socket通道之上,通过写入输入流来生成响应并返回。
总结:
- HTTP运行在TCP/Ip之上
- HTTP使用一种请求/响应模型,客户发送一个HTTP请求,然后web服务器返回一个HTTP响应,再由浏览器 (根据响应的类型)确定如何处理
- 如果返回一个HTML界面,会把HTML内容放入响应中
- GET请求把表单参数追加到URL后
- POST请求将表单数据包括在请求的体重
- URL代表统一资源定位(Uniform Resource Locator),Web每个资源都有自己的唯一地址,都采用这种URL格式。
|