Http协议
- 什么是协议
双方在交互、通讯的时候,遵守的一种规范、规则
- http协议
针对网络上的呵护短与服务器端在执行http请求的时候,遵守的一种规范。其实就是规定了客户端在访问服务器端的时候,要带上哪些东西,或者是服务器端在返回数据的时候,也要带上什么东西。
- 版本
1.0 版本 请求数据,服务器返回后,将会断开连接,重新连接需要再次的请求。
1.1 版本 请求数据,服务器返回后,连接还会保持着,除非服务器 | 客户端关掉。有一定的时间限制,如果都空着这个连接,那么连接将会自己中断。
- 抓包工具(HttpWatch)
可以使用抓包工具,对客户端与服务器端之间发送的数据进行抓取,查看客户端与服务器端之间互相发送了那些信息。
客户端与服务器端的数据交互
Http请求数据解释
请求的数据里面包含三个部分内容:请求行、请求头、请求体
- 请求行
POST /examples/servlets/servlet/RequestParamExample HTTP/1.1
POST : 请求方式 ,以post去提交数据
/examples/servlets/servlet/RequestParamExample
请求的地址路径 , 就是要访问哪个地方。
HTTP/1.1 协议版本
- 请求头
Accept: application/x-ms-application, image/jpeg,
application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap,
Referer:http://localhost:8080/examples/servlets/servlet/RequestParamExample
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C;.NET4.0E)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate Host: localhost:8080
Content-Length: 31
Connection: Keep-Alive
Cache-Control:
no-cache
Accept: 客户端向服务器端表示,我能支持什么类型的数据。 Referer : 真正请求的地址路径,全路径
Accept-Language: 支持语言格式 User-Agent: 用户代理 向服务器表明,当前来访的客户端信息。
Content-Type: 提交的数据类型。经过urlencoding编码的form表单的数据
Accept-Encoding:gzip, deflate : 压缩算法 。
Host : 主机地址 Content-Length: 数据长度
Connection : Keep-Alive 保持连接
Cache-Control : 对缓存的操作
- 请求体
浏览器真正发送给服务器的数据
发送的数据呈现的是key=value ,如果存在多个数据,那么使用 & 连接
firstname=zhang&lastname=sansan
Http响应数据解析
请求的数据里面包含三个部分内容 : 响应行 、 响应头 、响应体
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 673
Date: Fri, 17 Feb 2017 02:53:02 GMT
…这里还有很多数据…
- 响应行
HTTP/1.1 200 OK
协议版本 状态码 这次交互到底是什么样结果的一个code.
200 : 成功,正常处理,得到数据。
403 : for bidden 拒绝 404 :
Not Found 500 : 服务器异常
OK : 对应前面的状态码
- 响应头
Server: 服务器是哪一种类型。
Tomcat Content-Type : 服务器返回给客户端你的内容类型
Content-Length : 返回的数据长度
Date : 通讯的日期,响应的时间
Get 和 Post 请求区别
- 请求路径不同。Post 请求,在url后面不跟上任何的数据,Get请求,在地址后面跟上数据。
- 带上的数据不同。Post请求会使用流的方式写数据,Get请求是在地址栏上跟数据。
- 由于Post请求使用流的方式写数据,所以一定需要一个Content-Length的头来说明数据的长度有多少。
-
post
1. 数据是以流的方式写过去,不会在地址栏上面显示。 现在一般提交数据到服务器使用的都是POST 2. 以流的方式写数据,所以数据没有大小限制。
-
get
1. 会在地址栏后面拼接数据,所以有安全隐患。 一般从服务器获取数据,并且客户端也不用提交上面数据的时候,可以使用GET 2. 能够带的据有限, 1kb大小
web资源
在http协议当中,规定了请求和响应双方,客户端和服务器端,与web相关的资源,有两种分类
-
静态资源
html、js、css
-
动态资源
jsp、servlet
Servlet
- servlet是什么?
其实就是一个java程序,运行在我们的web服务器上,用于接收和响应 客户端的http请求。
更多的是配合动态资源来做。 当然静态资源也需要使用到servlet,只不过是Tomcat里面已经定义好了一个 DefaultServlet
Hello Servlet
-
得写一个Web工程 , 要有一个服务器。
-
测试运行Web工程
1. 新建一个类, 实现Servlet接口 2. 配置Servlet , 用意: 告诉服务器,我们的应用有这么些个servlet。 在webContent/WEB-INF/web.xml里面写上以下内容。 <!-- 向tomcat报告, 我这个应用里面有这个servlet, 名字叫做HelloServlet , 具体的路径是com.itheima.servlet.HelloServlet --> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet</servlet-class> </servlet> <!-- 注册servlet的映射。 servletName : 找到上面注册的具体servlet, url-pattern: 在地址栏上的path 一定要以/打头 --> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping> 3. 在地址栏上输入 http://localhost:8080/项目名称/a
Servlet执行过程
Servlet的通用写法
Servlet (接口)
|
|
GenericServlet
|
|
HttpServlet (用于处理http的请求)
定义一个类,继承HttpServlet 复写doGet 和 doPost
Servlet的生命周期
- 生命周期方法
从创建到销毁,所调用的哪些方法,从对象创建到销毁一定会执行的方法。
-
init方法
在创建该servlet的实例的时候,就执行该方法 一个servlet只会初始化一次,init方法只会执行一次 默认情况下是:初次访问该servlet,才会创建执行实例
-
service方法
只要客户端来了一个请求,那么就执行这个方法了 该方法可以被执行很多次,一次请求,对应一次service方法的调用
-
destroy方法
servlet被销毁的时候,就会执行该方法 1.该项目从tomcat的里面移除。 2.正常关闭tomcat就会执行 shutdown.bat
servlet 初始化提前
1.默认情况下,只有在初次访问servlet的时候,才会执行init方法,有的时候,我们可能需要在这个方法里面执行一些初始化的工作,甚至是做一些比较耗时的逻辑。
2.在配置web.xml的时候,使用 load-on-startup 元素来指定,给定的数字越小,启动的时机就越早,一般不写负数,从2开始即可,因为(0,1)已经被Tomcat的配置文件所使用。
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>ServletDemo.ServletDemo</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>An_kkk</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
ServletConfig
servlet的配置,通过这个对象,可以获取servlet在配置的时候的一些信息
//ServletConfig 可以获取到servlet在配置文件的一些信息
//1.得到servlet配置对象
ServletConfig config = getServletConfig();
//获取到的是配置Servlet里面servlet-name 的文本内容
String name = config.getServletName();
//2.可以获得具体的某一个参数
String address = config.getInitParameter(name);
System.out.println(name);
//3.获取所有的参数名称
Enumeration<String> names = config.getInitParameterNames();
//遍历取出所有的参数名称
while (names.hasMoreElements()){
String name1 = names.nextElement();
System.out.println("name==" + name);
}
为什么需要ServletConfig
1.在使用别人所写的Servlet的时候
2.刚好这个Servlet里面需要一个数字或者变量值,但不是固定的值,所以有使用要求,需要在使用这个Servlet的时候,必须要在web.xml里面,声明相应的init-params 以提供变量。
总结
-
http协议
1.使用Httpwatch 抓包工具查看http请求的内容
2.请求和相应的数据内容
请求行,请求头,请求体 响应行,响应头,响应体
-
servlet
1.使用servlet 1.写一个类,实现接口servlet,或者继承HttpServlet 2.配置servlet 3.访问servlet 2.Servlet的生命周期 init 一次 创建对象 默认初次访问,或者可以通过配置load-on-stratup 提前初始化 service 多次,一次请求对应一次service destory 一次,从服务器移除或者 正常关闭服务器 3.ServletConfig 获取配置的信息,params