(一)HTTP协议
一.概述
-
Hypertext Transfer Protocol 超文本传输协议
-
协议:双方在交互,通讯的时候,遵守的一种规范,规则
-
http协议
针对网络上的客户端与服务器端在执行http请求的时候,遵守的一种规范.
二.演示客户端与服务器端通讯
- - 在地址栏中键入网络地址,回车,或者平时注册点击了注册按钮,浏览器都可以显示出来,
那么浏览器和服务端是如何通讯,并且传输了哪些数据
- 安装抓包工具 HttpWatch (IE插件)
- 打开TomCat . 输入localhost:8080打开首页
- 在首页上找到Examples字样
- 选择Servlets examples - - - >Request Parameters
http://localhost:8080/examples/servlets/
接着点击Request Parameters 的 Execute超链接
执行tomcat的例子,然后查看浏览器和tomcat服务器的对接细节
三.Http请求数据解释
请求的数据里面包含三个部分内容: 请求行 , 请求头 , 请求体
- 请求行
post / example/servlets/servlet/RequestParamExample HTTP/1.1
POST : 请求方式, 以post去提交数据
GET
/ example/servlets/servlet/RequestParamExample HTTP/1.1
请求的地址路径, 就是要访问哪个地方
HTTP/1.1
协议版本 - 请求头
Accept : 客户端向服务器端表示,我能支持什么类型的数据
Referer: 真正请求的地址路径,全路径
Accept - language: 支持语言格式
User-Agent: 用户代理 向服务器表明,当前来访的客户端信息
Content - Type : 提交的数据类型. 经过urlencoding编码的form表单的数据
Accept-Encoding : gzip , deflate : 压缩算法
Host : 主机地址
Content-Length : 数据长度
Connection : keep-Alive 保持连接
Cache-Control : 对缓存的操作 - 请求体
浏览器真正发送给服务器的数据,- 发送的数据呈现的是key =value ,如果存在多个数据,那么使用&
四.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
- - 协议版本 : HTTP/1.1
- - 状态码 :
200 : 成功,正常处理,得到数据
403 : for biddern 拒绝
404 : Not Found
500 : 服务器异常
- - OK : 对应前面的状态码200 - 响应头
Server : 服务器是哪一种类型 Tomcat
Content-Type: 服务器返回给客户端的内容类型
Content-Length: 返回的数据长度
Date: 通讯的日期,响应的事件
五.Get 和 Post请求区别
- 请求的路径不同.
Post请求,在url后面不跟上任何的数据
Get请求,在地址后面跟上数据 - 带上的数据不同,
Post请求会使用流的方式写数据,不会在地址栏上显示, 现在一般提交数据到服务器使用的都是Post
Get请求是在地址栏上跟数据,所以有安全隐患. 一般从服务器获取数据,并且客户端也不用提交上面数据的时候,使用Get - 由于Post请求使用流的方式写数据,所以一定需要一个Content-Length的头来说明数据的长度有多少
Get能够带的数据有限, 1kb大小
六.Web资源
在http协议当中,规定了请求和响应双方, 客户端和服务器端. 与web相关的资源
- 静态资源
html . css . js - 动态资源
servlet / jsp
(二)Servlet
一.概述
- servlet其实就是一个java程序,运行在我们的web服务器上,用于接收和响应 客户端的http请求
- 更多的是配合动态资源来做. 当然静态资源也需要使用servlet,只不过Tomcat里面已经定义好了一个DefaultServlet
二.Hello Servlet
- 得写一个Web工程, 要有一个服务器
- 测试运行Web工程
- 新建一个类,实现Servlet接口
- 配置Servlet . 用意: 告诉服务器,我们有这些Servlet
在webContent/WEB-INF/web.xml里面写上以下内容<!-- 向tomcat报告,我这个应用里面有这个servlet,名字叫做HelloServlet , 具体的路径是com.itmine.servlet.HelloServlet --> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.itmine.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>
- 在地址栏上输入http://localhost:8080/项目名称/上边的url-pattern
三.Servlet执行过程
- 找到tomcat应用
- 找到项目
- 找web.xml,然后在里面找到url-pattern,有没有哪一个pattern的内容是/a
- 找到servlet-mapping中的那个servlet-name [HelloServlet]
- 找到上面定义的servlet元素中的servlet-name中的[HelloServlet]
- 找到下面定义的servlet-class然后开始创建该类的实例
- 继而执行该servlet中的service方法
四.Servlet通用写法
- Servlet(接口) - - - GenericServlet - - - HttpServlet(用于处理http的请求)
- 定义一个类,继承HttpServlet 重写doGet 和 doPost
五.Servlet的生命周期
- init方法
- - 在创建servlet的实例时,就会执行该方法
- - 一个servlet只会初始化一次, init方法只会执行一次
- - 默认情况下是 : 初次访问该servlet,才会创建实例 - service方法
- - 只要客户端来了一次请求,就会执行这个方法
- - 该方法可以被执行很多次,一次请求,对应一次service方法的调用 - destory方法
- - servlet销毁的时候,就会执行该方法
- - 1.该项目从tomcat的里面移除
- - 2.正常关闭tomcat就会执行 shutdown.bat
六.让Servlet创建实例的时机提前
- 默认情况下,只有在初次访问servlet的时候,才会执行init方法.
有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑 - 那么这个时候,初次访问,可能会在init方法中逗留太久的时间,那么就需要让初始化的时机提前一点
- 在配置的时候,使用load-on-startup元素来指定,给定的数字越小,启动的时机就越早,一般不写负数,从2开始即可
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.itmine.servlet.HelloServlet</servlet-class> <load-on-startup>2<load-on-startup> </servlet>
七.ServletConfig
- Servlet的配置
//1.得到servlet配置对象 专门用于在配置servlet的信息 ServletConfig config = getServletConfig(); //获取到的是配置servlet里面servlet-name的文本内容 String servletName = config.getServletName(); System.out.println(servletName); //2. 可以获取具体的某一个参数 String address = config.getInitParameter("address"); System.out.println(address); //3.获取所有的参数名称 Enumeration<String> names = config.getInitParameterNames(); //遍历取出所有的参数名称 while(names.hasMoreElements()){ String key = (String)names.nextElement(); String value = config.getInitParameter(key); System.out.println(key + " " + value); }
- ServletConfig作用
- - 当我们自己开发一些应用,使用一些技术与代码,我们不会,用别人的代码,他的代码放置在了自己的servlet类里面
- - 刚好这个servlet里面需要一个数字或者叫做变量值,但这个值不能是固定的,所以要求使用到这个servlet的公司,在注册servlet的时候,必须要在web.xml里面,声明init-param