HTTP协议

1.什么是服务器

服务器:分为服务器硬件 和 服务器软件。在硬件服务器(计算机)上安装了服
务器软件,才可以对外提供服务。
比如:让其他的计算机来访问当前服务器,为其他的计算机提供服务。
(1) 服务器硬件:是指在互联网上具有独立IP地址的计算机,比如我们自己用的
计算机也可以作为服务器使用。
(2) 服务器软件:就是一个计算机程序,比如MySQL服务器软件,tomcat服务器
软件。服务器软件分为很多类型,比如:ftp服务器,数据库服务器,web服务器软
件,邮件服务器等。

2.什么是Web服务器

(1) web服务器是指驻留在互联网上的某种类型的计算机程序。当浏览器访问服
务器,请求服务器上的文件时,服务器将会处理该请求,并将请求的文件响应给浏览
器,并会附带一些信息告诉浏览器如何查看该文件(即文件的类型)
(2) web服务器是可以向 “发出请求的浏览器提供文档” 的程序,比如在访问百度
时,其实就是在访问百度的服务器。

tomcat就是一个web服务器软件,是由apache组织提供的一款服务器软件,特
点:小巧灵活,免费开源,简单易用。
在这里插入图片描述

3.什么是HTTP协议?

在这里插入图片描述

  • HTTP协议是用于规定浏览器和服务器之间的通信方式/规则
  • 主要规定了浏览器给服务器发送的请求信息的格式
  • 以及规定了服务器给浏览器发送响应信息的格式

3.1HTTP协议在工作时所遵循的基本原则:

(1)一次请求,只对应一次响应
(2)请求只能由浏览器发起,服务器只能被动的等待请求,根据请求作出回应。

3.2 HTTP请求

在这里插入图片描述

3.2.1 请求行

(1)GET:表示请求方式,在HTTP协议中一共定义了7种提交方式,常用的是GET和POST。
(2)/news/hello.html:请求资源路径,表示浏览器请求的是哪一个Web应用以及哪一个web资源文件。
(3)HTTP/1.1:请求所遵循的协议和版本。

3.2.2若干请求头

(1) Host:localhost – 通知服务器,浏览器要请求的是哪一台虚拟主机。
(2) Accept:text/html, appliaction/xhtml+xml,… – 通知服务器,浏览器能 接收的响应数据类型。 …
(空白行,用于分隔请求头和请求实体)

3.3 HTTP响应

在这里插入图片描述

3.3.1状态行

(1)HTTP/1.1:表示响应所遵循的协议和版本
(2)200:状态码,三位的数字,表示服务器对请求处理的结果。

 200: 表示请求处理成功 
 302: 表示请求重定向(即需要再进一步请求才可以获取到相应的资源) 
 304/307: 表示通知浏览器使用缓存 
 404: 表示浏览器请求的资源不存在(浏览器的问题, 请求路径错误) 
 500: 表示服务器在处理请求的过程中抛出了异常。

(3)OK:描述短语(可以忽略),也表示服务器对请求处理的结果,和状态码
表示的结果一致。

200:OK 
404:Not Found 
500: Internal Server Error 
...

3.3.2若干响应头

Content-Type: 表示服务器响应的数据类型,
text/html, image/*... Content-Length: 表示服务器响应数据的长度, 例如: 384 /字节 
Set-Cookie: 和cookie技术相关的一个头, 后面会提到。
...

3.3.3响应实体内容

响应实体就是浏览器所请求文件的内容。例如:浏览器向服务器请求一个
hello.html文件,服务器会找到hello.html文件,将文件的内容作为响应实体发送给浏
览器。

3.4 GET提交和POST提交

3.4.1GET提交

  • 将数据通过问号拼接在地址栏URL地址的后面,相对非常不安全。
  • 将数据拼接在地址栏URL地址的后面,数据量是有限制的,通常不能超过1KB或者4KB。
  • 如果请求方式为 GET 提交,请求实体是没有内容的!

3.4.2POST提交

  • POST是通过请求实体将数据提交给服务器,不会显示在地址栏上,因此相对更加安全。
  • POST提交通过请求实体提交数据,数据量理论上是没有限制的。
  • 如果请求方式为 POST 提交,并且请求中携带了数据,请求实体中才会有内容!

总结

  • 如果只是单纯做一个跳转,或者只是访问一个网页,请求中没有数据,都是使用GET提交。
  • 如果在请求中有数据,但数据量不大,并且数据没有隐私性,也尽量使用GET提交。
  • 如果在请求中有数据,数据量比较大或者数据较为隐私,此时推荐使用POST提交,如果是提交文件,只能用POST提交。
  • POST提交和GET提交主要区别体现在请求参数传输过程的不相同

4.Servlet

– Servlet是用于扩展web服务端软件业务功能的组件,每一种业务都需要对应的一个单独的Servlet
Web服务软件做了哪些事:
1.负责建立底层的网络连接
2.负责将客户端请求的文件返回给客户端
3.web服务器又称为web容器,web容器负责装组件(Servlet),web服务软件通过解析请求路径,找到对应的Servlet做出响应

4.1Servlet生命周期

加载类(加载阶段)
实例化阶段(为对象分配空间)
初始化阶段(为对象的属性赋值)
请求处理(服务阶段)
销毁

4.2Servlet响应流程

浏览器发出http://localhost:8080/servlet_1_1/HelloServlet请求,
请求先有Tomcat拦截,并且获取地址中的/HelloServlet,然后拿着此路径去web.xml配置文件中找到对应的Servlet的完整类名(cn.tedu.HelloServlet),找到完整类名后通过反射技术,将该Servlet类实例化,然后Tomcat会调用Servlet的service方法.

5.静态页面和动态页面

静态页面:任何客户端,任何时间访问页面显示的内容都是一样的,称为静态页面
动态页面:显示的内容会受某些因素的影响而改变,动态页面=从数据库中查询的数据+标签。

5.1 Thymeleaf框架

如果不使用此框架,我们服务器需要给客户端返回动态页面时,处理动态页面的代码需要全部写在Servlet中,动态页面部分包含很多页面标签,如果把标签代码写在Servlet中,首先代码书写效率低,而且Servlet中的代码量会暴增,不利于代码的维护,使用Thymeleaf框架可以将动态页面中的数据和页面分离开,在html页面中写一个模板页面,通过该框架可以将数据库里面查询到的数据和模板页面整合到一起,整合到一起后再把数据返回给浏览器,最终目的就是将页面相关代码从Servlet中分离写到单独的html页面中,提高开发效率,使Servlet类更易维护。

详情:Thymeleaf的官网;

6.Cookie和Session

6.1 Cookie

  • 数据保存在客户端(浏览器),类似打孔式的会员卡
  • 1.保存时间:默认保存在浏览器内存中,浏览器关闭则数据删除,如果单独设置了时间,数据则保存到磁盘中,时间到之后再删除
  • 2.保存数据大小:每个cookie数据不能超过4K,而且只能保存字符串数据
  • 3.应用场景:需要长时间保存的数据使用cookie,如:记住用户名和密码

6.2 Session

  • 数据保存在服务器,类似银行卡
  • 1.保存时间:默认为半个小时左右,这个时间可以修改但是不建议,因为Session数据保存在服务器,如果用户量比较大非常占用服务器资源,Session只适合短时间的数据保存
  • 2.保存数据大小:没有大小限制,而且可以保存任意对象类型
  • 3.应用场景:短时间的数据存储和安全性要求高的数据,如:记住登录状态

6.3为什么要使用Session和Cookie?

浏览器和服务器之间进行数据传输遵循的时HTTP数据传输协议,此协议属于无状态协议(一次请求对应一次响应,服务无法跟踪客户端的请求),通过cookie服务器可以给客户端设置一个标识,设置完之后客户端每次发出请求都会带着这个标识,从而识别客户端。但是Cookie是明文保存在客户端浏览器中,可以被客户端伪造造成完全隐患,这时Session的出现解决了此问题,Session是基于Cookie实现,但是数据保存在了服务器端,这样数据就不能像Cookie一样被伪造,从而提高了安全性。

作用:
Cookie和Session都是为了实现多个Servlet之间的数据共享而存在的

7.request和response介绍

  • request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。
  • 当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的 service方法来处理请求。在调用service方法之前会创建出request和response对象。
  • 其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。

7.1 request对象

7.1.1获取请求参数:

所谓的请求参数,就是浏览器发送给服务器的数据(不区分请求方式),例如:
通过表单向服务器提交的用户名、密码等,或者在超链接后面通过问号提交的数据,
都是请求参数。

http://localhost/day10/TestParam?user=zhangsan&pwd=123&like=篮球 &like=足球

```java
request.getParameter(String paramName) ;
//-- 根据请求参数的名字获取对应的参数值,返回值是一个字符串; 
//-- 如果一个参数有多个值,该方法只会返回第一个值。
//-- 如果获取的是一个不存在的参数,返回值为null 

request.getParameterValues(String paramName) ;
//-- 根据请求参数的名字获取该名字对应的所有参数值组成的数组,返回值是一个字符 串数组,其中包含了这个参数名对应的所有参数值
 //-- 如果获取的是一个不存在的参数,返回值为null
//1.获取请求参数中的用户名(user) 
String user = request.getParameter("user"); System.out.println( "user="+user ); 
//2.获取请求参数中的爱好(like) 
String[] like = request.getParameterValues( "like" ); 
System.out.println( "like="+Arrays.toString( like ) );

7.1.2获取请求参数时的中文乱码问题

在获取中文的请求参数时,可能会出现乱码问题(和请求方式、tomcat服务器版
本有关),具体可以分为以下三种情况:
(1)如果请求是GET提交,并且tomcat是8.0及以后的版本,GET提交的中文参
数,在获取时不会出现乱码问题!(8.0以后的tomcat包括8.0在获取GET提交的中文
参数时,已经处理中文乱码问题。)
(2)如果请求是POST提交,不管是哪个版本的tomcat服务器,在获取中文参数
时,都会出现乱码问题。因为tomcat底层在接收POST提交的参数时,默认会使用
iso8859-1编码接收,而这个编码中没有中文字符,所以在接收中文参数时,一定会出
现中文乱码问题!
解决方法是:通知服务器在接收POST提交的参数时,使用utf-8编码来接收!

request.setCharacterEncoding("utf-8");

注意:这行代码不会影响GET提交,只对POST提交有效!
这行代码要放在任何获取参数的代码之前执行!
(3)如果请求是GET提交,并且tomcat是7.0及以前的版本,GET提交的中文参
数,在获取时会出现乱码问题!
在[tomcat安装目录]/ conf/server.xml文件的(修改端口的)Connector标
签上,添加一个 URIEncoding=“utf-8” 属性,如下:

<Connector port="80" 
protocol="HTTP/1.1" 
connectionTimeout="20000" 
redirectPort="8443" 
URIEncoding="utf-8" />

7.2实现请求转发

  • 请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中
    的某一个资源(A)时,该资源将请求转交给另外一个资源(B)进行处理并且由资
    源B做出响应的过程,就叫做请求转发。
  • 请求转发和重定向都是资源的跳转方式,但是跳转的过程有所不同。

在这里插入图片描述

7.2.1特点

(1)转发是一次请求,一次响应
(2)请求转发前后,浏览器的地址栏地址不会发生变化。(浏览器–访问–> A --转 发–> B,地址栏地址始终指向A的地址)
(3)请求转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发。(A–转 发–>B,A和B必须属于同一个Web应用!)
(4)在转发时,可以带数据到目的地(比如,从A转发到B,可以从A带数据给B,需要配合域 对象才可以)

7.3作为域对象使用

request在实现转发时,通过request. setAttribute 方法和request. getAttribute 方法带数据到目的地时,就是通过request对象中的map集合带数据,这个request对象上的map集合以及request对象所在的范围即称之为是一个域对象。

request.setAttribute(String attrName, Object attrValue);
// 往request域中存入一个域属性,属性名(key)只能是字符串,属性值(value)可 以是任意类型。 
request.getAttribute(String attrName);
// 根据属性名(key)获取对应的属性值(value)。返回的是一个Object类型的对象。

7.3.1 request域对象所具备的三大特征:

生命周期:在服务器调用Servlet程序的service方法之前,会创建代表请求的
request对象,在请求处理完,响应结束时,会销毁request对象。
作用范围:在一次请求范围内,可以通过request域带数据到目的地。
主要功能:和请求转发配合使用,从Servlet带数据到JSP(带数据到目的地)

  • request对象的 getParameter 和 getAttribute 方法有什么区别?
  • getParameter()方法是用于获取(从浏览器发送过来的)请求参数的,请求参数不能设置,只能是浏览器发送给服务器,在服务器端再通过getParameter方法获取请求中的参数getAttribute()方法是用于从request域中获取域属性时用的,域属性得先存入到域中(即得先通过setAttribute方法将数据存入request域中),再通过getAttribute()方法从域中获取。

7.4 response对象

7.4.1 向客户端发送数据

  • PrintWriter out = response.getWriter();
  • 由于服务器在通过response获取的流发送数据时,默认使用iso8859-1编码,而这
    个编码中没有中文字符,所以在通过response获取的流发送中文数据时,会出现乱码
    问题。
/* 通知服务器在响应数据时,使用utf-8编码 * 也能通知浏览器使用utf-8接收服务器发送的数据 */ response.setContentType( "text/html;charset=utf-8" ); PrintWriter out = response.getWriter(); out.write( "你好" );

7.5 实现重定向

当浏览器向服务器发请求访问某一个资源A,资源A在响应时通知浏览器需要再
进一步请求才能获取到对应的资源,浏览器再次发请求访问服务器中的资源B,最终
由资源B响应浏览器要获取的资源,这个过程叫做重定向。
在这里插入图片描述

7.5.1特点

(1)重定向是两次请求、两次响应
(2)重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发 起,浏览器知道这个跳转的过程,因此地址栏地址会变化)
(3)重定向前后的request对象不是同一个(因为重定向是两次请求,服务器会根据两 次请求创建两个不同的request对象,request对象不是同一个,也就不能在重定向时通 过request带数据到目的地。)
(4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务 器。(进行跳转的两个资源之间没有限制)

s

7.6 总结

7.6.1 转发和重定向区别?

(1)请求转发是一次请求,一次响应; 而重定向是两次请求两次响应
(2)请求转发前后地址栏地址不会发生变化; 而重定向前后地址栏地址会发生变化
(3)请求转发前后的request对象是同一个,可以配合request域对象带数据到目的地; 而重定向前后的request对象不是同一个, 不能结合request域对象在重定向前后带数 据.
(4)请求转发要求两个资源必须属于同一个Web应用; 而进行重定向的两个资源可以是同 一个Web应用,也可以不是同一个Web应用,甚至可以是来自于不同的主机或服务器.

7.6.2 什么时候用请求转发(forward)?什么时候用重定向(redirect)?

(1)如果希望跳转前后地址栏地址不会发生变化, 只能使用转发; 如果希望跳转前后地址 栏地址会发生变化, 只能使用重定向
(2)如果希望在跳转前后, 能够通过request对象带数据到目的地, 只能使用转发
(3)如果仅仅是做一个跳转,没有其他要求,此时推荐使用转发(转发是一次请求,一次响 应,可以减少访问服务器的次数,降低服务器的压力)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值