文章目录
1-Http协议介绍
-
什么是协议
双方在交互、通讯的时候, 遵守的一种规范、规则。
-
http协议
针对网络上的客户端 与 服务器端在执行http请求的时候,遵守的一种规范。
其实就是规定了客户端在访问服务器端的时候要做什么,服务器端返回数据的时候要做什么。
-
版本
1.0 > 请求数据,服务器返回后,将会断开连接
1.1 > 请求数据,服务器返回后,连接还会保持着。除非服务器 | 客户端关掉
2-Tomcat例子
演示, 客户端如何与服务器端通讯:
- 安装抓包工具 HttpWatch (IE插件)
- 打开tomcat。 输入localhost:8080 打开首页
- 在首页上找到Example 字样
6.x 和 7.x 的文档页面有所不同,但是只要找到example就能够找到例子工程
- 选择 servlet 例子 —> Request Parameter
接着点击Request Parameters 的 Execute超链接
执行tomcat的例子,然后查看浏览器和 tomcat服务器的对接细节
3-(请求、响应)数据解析
请求的数据里面包含三个部分内容:请求行、请求头、请求体
-
请求行
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; MSIE 8.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/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 : 通讯的日期,响应的时间
4-Servlet初识
当用户发送请求时,服务器该如何响应请求? 用Servlet
- 写一个Web工程,配置好Service(视频有讲),实现Servlet
- 配置Servlet,用意:告诉服务器,我们的应用有这么些个Servlet(否则无法响应)
//服务器向请求响应的语句
System.out.println(“hello client!”);
实现Servlet要重写接口的方法,这里就重写Service方法 - 光有实现Servlet的文件还不能运行,没效果,所以还得在web.xml中配置Servlet,让它有存在感
< !-- 配置Servlet:向tomcat报告,我们这个应用里面有这个servlet,名字叫做HelloSevlet
servlet-class中写的是类文件全路径(包名+类名) --><servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>Servlet.HelloServlet</servlet-class> </servlet> <!-- 注册Servlet映射:servlet-name就是上面的 url-pattern是在地址栏上的path路径(要加/) --> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
- 在地址栏上输入 http://localhost:8080/项目名称/hello
5-Servlet生命周期与方法
生命周期:从创建到销毁的一段时间
生命周期方法:从创建到销毁的方法,所用的都是叫生命周期方法
怎么判断生命周期结束?1. 项目从tomcat的里面移除 2. 正常关闭tomcat或执行shutdown.bat
- init方法
在创建该servlet的实例时,就执行该方法
一个servlet只会初始化一次,init方法只会执行一次
默认情况下是:初次访问该servlet,才会创建实例 - service方法
只要客户端来了一个请求,那么就执行这个方法了
该方法可以被执行很多次.一次请求,对应一次service方法的调用 - destroy方法
servlet销毁的时候,就会执行该方法
doGet和doPost不算生命周期方法,所谓的生命周期方法是指,从对象的创建到销毁一定会执行的方法,但是这两个方法,不一定会执行。
6-Servlet初始化提前(load-on-startup)
- 默认情况下,只有在初次访问servlet的时候,才会执行init方法有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑
- 那么这个时候,初次访问,可能会在init方法中逗留太久的时间那么有没有方法可以让这个初始化的时机提前一点
- 在配置的时候,使用load-on-startup元素来指定,给定的数字越小,启动的时机就越早一般不写负数,从2开始即可
因为1是专门用来加载404错误等关键信息的,所以不抢<servlet> <servlet-name>HelloServlet04</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet04</servlet-class> <load-on-startup>2</load-on-startup> </servlet>
7-ServletConfig
通过这个对象,可以获取servlet在配置的时候一些信息
- 得到servlet配置对象 专门用于在配置servlet的信息
ServletConfig config = getServletConfig(); //获取到的是配置servlet里面servlet-name 的文本内容 String servletName = config.getServletName(); System.out.println("servletName="+servletName);
- 可以获取具体的某一个参数。
String address = config.getInitParameter("address"); System.out.println("address="+address);
- 获取所有的参数名称
Enumeration<String> names = config.getInitParameterNames(); //遍历取出所有的参数名称 while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = config.getInitParameter(key); System.out.println("key==="+key + " value="+value); }
个人使用总结:
使用方法和上述一样,只不过有几点补充与注意点:
-
当要使用ServletConfig来获取参数信息的时候,我们不能够在实现Servlet接口的类中写,而要在继承了HttpServelt的类中写。
原因:既然要获取参数信息,就必须使用getServletConfig()方法,但是,如果我们实现了接口,就必须重写所有方法,包括该方法,但是该阶段并不要求掌握重写该方法。所以,当我们使用这个方法的时候,是获取不到对象的,会有空指针异常,故我们直接继承HttpServlet即可,也只需重写两个方法。
-
参数信息的书写在servlet里面,具体代码如下:
<init-param> <param-name>name</param-name> <param-value>Hillain</param-value> </init-param> //注意:如果要写多个参数信息,就必须写多个init-param,否则报错
-
关于getInitParameterNames()方法
该方法的返回值是Enumeration类型,遍历该类型的方法如上。此时如果我们要把返回值强转为List的话,也是行不通的(测试过)。
-
ServletConfig的作用:
未来我们自己开发的一些应用,使用到了一些技术,或者一些代码,我们不会但是有人写出来了。它的代码放置在了自己的servlet类里面。刚好这个servlet里面需要一个数字或者叫做变量值,但是这个值不能是固定了所以要求使用到这个servlet的公司,在注册servlet的时候,必须要在web.xml里面,声明init-params。ServletConfig在开发当中比较少用。
自我总结
这一部分其实最重要的是懂得Servlet的生命周期,会配置Servlet和写功能就🆗了。虽然说Java可以自动帮你配置,但是你最起码要自己会配啊,就好比现在有计算器了,但不代表你自己都不用算数。好了,废话不多说,奥里给,淦就完了XDM!
——— 不积跬步,无以至千里;不积小流,无以成江海。