HTTP协议简介
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和
超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由
万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering
Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC
2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1。
2014年12月,互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组将
HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC
7540正式发表,取代HTTP 1.1成为HTTP的实现标准。
HTTP请求方法
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作
中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好
处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信
息或称元数据)。POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文
中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
PUT
向指定资源位置上传其最新内容。
DELETE
请求服务器删除Request-URI所标识的资源。
TRACE
回显服务器收到的请求,主要用于测试或诊断。
OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称,向Web服务器发
送OPTIONS请求,可以测试服务器功能是否正常运作。
CONNECT
Tomcat
(1) Tomcat的介绍
开源小型web服务器 ,完全免费,主要用于中小型web项目,只支持Servlet和JSP 等少量javaee规范
(就是JavaWeb编程接口)
什么是Servlet
(1) Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序,其主要功能在于交互
式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的
Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
(2) Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多
数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
(3) Servlet工作模式:
① 客户端发送请求至服务器
② 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
③ 服务器将响应返回客户端
(4) Servlet的API:
1.javax.servlet 其中包含定义servlet和servlet容器之间契约的类和接口。
2.javax.servlet.http 其中包含定义HTTP Servlet 和Servlet容器之间的关系。
3.javax.servlet.annotation 其中包含标注servlet,Filter,Listener的标注。它还为被标注元件定义元数
据。
4.javax.servlet.descriptor,其中包含提供程序化登录Web应用程序的配置信息的类型。
2. 如何使用Servlet
Servlet技术的核心是Servlet它是所有Servlet类必须直接或者间接实现的一个接口。在编写实现Servlet
的Servlet类时,直接实现它。在扩展实现这个这个接口的类时,间接实现它。
3. 第一个Servlet的编写
(1) 创建一个类实现Servlet接口
Public class LoginServlet extends HttpServlet{
//重写HttpServlet 类中的方法
/* void init(ServletConfig var1) throws ServletException {} */
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Date d = new Date();
}
public void destroy() {
System.out.println("对象即将销毁");
}
(2) 在web.xml文档中配置映射关系
XML中配置好这个Servlet的映射关系:
配置声明一个Servlet
服务器名称
服务器类的路径
服务器名称
/访问路径
(3) 启动tomcat,在浏览器输入
http://localhost:8080/工程名/访问服务器的路径
4.Servlet工作原理
(1) Servlet接口定义了Servlet与servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内
存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型
只能有一个实例。
(2)用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个
ServletResponse对象**。**ServletRequest对象和ServletResponse对象都是由Servlet容器(例如
TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。
(3)ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。
ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻
松的发回给用户。
(4)对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文
(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装
Servlet配置的ServletConfifig对象。
5. Servlet的生命周期
init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”
的过程。Servlet容器(例如TomCat)会根据下面的规则来调用这三个方法:
1.init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出
来,但是这个方法在后续请求中不会在被Servlet容器调用,就像人只能“出生”一次一样。我们可以利用
init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfifig对象进
来从而对Servlet对象进行初始化。
2.service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。就像人一样,需要不停的接
受老板的指令并且“工作”。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出
来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法
了。
\3. destory,当要销毁Servlet时,Servlet容器就会调用这个方法,就如人一样,到时期了就得死亡。
在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代
码。
\4. 下面用程序来演示生命周期
6.get和post的区别
1、GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编
码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际
的传输数据。
因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。
2、传输数据的大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特
定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限
制。
对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数
据大小进行限制,Apache、IIS都有各自的配置。
3、安全性POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,
上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都
会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的
用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request
frogery攻击
7.Servlet的Response接口
javax.servlet.ServletResponse接口表示一个Servlet响应,在调用Servlet的Service( )方法前,
Servlet容器会先创建一个ServletResponse对象,并把它作为第二个参数传给Service( )方法。
ServletResponse隐藏了向浏览器发送响应的复杂过程。
让我们也来看看ServletResponse内部定义了哪些方法:
在Service API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来
封装HTTP响应消息。 由于HTTP请求消息分为状态行,响应消息头,响应消息体三部分,因此,在
HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。
**voidaddCookie(Cookie var1);//**给这个响应添加一个cookie
**void sendRedirect(String var1) throws IOException;//**发送一条响应码,讲浏览器跳转到指定的位
置
PrintWriter getWriter()
获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后
Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
- HttpServletRequest接口HttpServletRequest表示Http环境中的Servlet请求。它扩展于javax.servlet.ServletRequest接口,并
添加了几个方法
**String getContextPath();//**返回请求上下文的请求URI部分
**Cookie[] getCookies();//**返回一个cookie对象数组
**String getHeader(String var1);//**返回指定HTTP标题的值
**String getMethod();//**返回生成这个请求HTTP的方法名称
**String getQueryString();//**返回请求URL中的查询字符串
**HttpSession getSession();//**返回与这个请求相关的会话对象
9. HttpServletReponse和HttpServletRequest的乱码解决
在前面我们讲过,在service中使用的编码解码方式默认为:ISO-8859-1编码,但此编码并不支持中
文,因此会出现乱码问题,所以我们需要手动修改编码方式为UTF-8编码,才能解决中文乱码问题,
解决post提交方式的乱码:request.setCharacterEncoding(“UTF-8”);
解决get提交的方式的乱码:
parameter = newString(parameter.getbytes(“iso8859-1”),“utf-8”);
**原因:**response缓冲区的默认编码是iso8859-1,此码表中没有中文。所以需要更改response的编码
方式
10. 转发和重定向
1. 什么是转发
概念
由服务器端进行的页面跳转
转发的特点
地址栏不发生变化,显示的是上一个页面的地址
请求次数:只有1次请求
根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
请求域中数据不会丢失
2.什么是重定向
概念
由浏览器端进行的页面跳转
原理图重定向的特点
地址栏:显示新的地址
请求次数:2次
根目录:http://localhost:8080/ 没有项目的名字
请求域中的数据会丢失,因为是2次请求
疑问
问:什么时候使用转发,什么时候使用重定向?
如果要保留请求域中的数据,使用转发,否则使用重定向。
以后访问数据库,增删改使用重定向,查询使用转发。
问:转发或重定向后续的代码是否还会运行?
无论转发或重定向后续的代码都会执行