HTTP协议介绍(SERVLET)
本文是servlet的入门篇,主要简单介绍下http协议
1.什么是HTTP
_ 1.http协议:_
1. 复杂解释:
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
2. 简单说:
对浏览器客户端 和 服务器端 之间数据传输的格式规范.
3. 协议版本:
http1.0:当前浏览器客户端与服务器端建立连接之后,只能发送一次请求,一次请求之后连接关闭。
http1.1:当前浏览器客户端与服务器端建立连接之后,可以在一次连接中发送多次请求。(基本都使用1.1)
请求一次资源就会出现一次请求,比如三张图片,就有三次请求,如果图片是一样 的就只有一次请求;
2.查看http协议的工具:
1. chrome(谷歌)浏览器查看:
右键点击查看元素(inspect element),点击network即可; 
2. 火狐:
使用火狐的firebug插件(右键->firebug->网络)
3. 使用系统自带的telnet工具(远程访问工具)
a)telnet localhost 8080 访问tomcat服务器
b)ctrl+] 回车.可以看到回显
c)输入请求内容,回车,即可查看到服务器响应信息。
GET / HTTP/1.1Host: www.baidu.com
2.HTTP协议内容:
- 请求:
GET /HttpSer HTTP/1.1Host: localhost:8080Connection: keep-aliveAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: en-US,en;q=0.8
- 响应:
HTTP/1.1 302 Found Server: Apache-Coyote/1.1 Location: http://localhost:8080/HttpSer/ Transfer-Encoding: chunked Date: Fri, 09 Oct 2015 08:55:42 GMT
下面将对这两个协议进行介绍:
3.HTTP请求介绍:
GET /HttpSer HTTP/1.1-请求行Host: localhost:8080--请求头;有多个key-value组成Connection: keep-aliveAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: en-US,en;q=0.8--可选,实体内容;
请求行介绍
GET /HttpSer HTTP/1.1 -请求行
1.请求资源的URL和URI比较:
URL: 统一资源定位符。http://localhost:8080/HttpSer/index.html。只能定位互联网资源。是URI 的子集.
URI: 统一资源标记符。/HttpSer/index.html。用于标记任何资源。可以是本地文件系统,局域网的资源(//192.168.14.10/HttpSer/index.html),可以是互联网。
2.请求方式:
常见的请求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE
常用的请求方式: GET(有将实体信息放在浏览器地址栏) 和 POST(隐藏实体内容)
3. servlet获得请求行信息:_
/*** 1.1请求行的获得*/System.out.println("请求方式:"+request.getMethod());//获得提交方式System.out.println("请求URI:"+request.getRequestURI());//获得uriSystem.out.println("请求url:"+request.getRequestURL());//获得urlSystem.out.println("获得协议:"+request.getProtocol());//获得所用协议##输出:请求方式:GET请求URI:/HttpSer/TestRequst请求url:http://localhost:8080/HttpSer/TestRequst获得协议:HTTP/1.1
4. 测试提交方式:
新建立web工程,建立TestMethod.html文件: 
建立Servlet类TestMethod.java修改get和post方法:
protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("get 方式提交"); }
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("post 方式提交"); }
运行tomcat可以看淡提交方式的不同:浏览器地址栏显示的不同,servlet调用的方法也不同;
get提交 
post提交 
经过对比请求可以发现
get方式在请求行多了?name=wang&pass=123
post多了实体内容:Content-Type: application/x-www-form-urlencoded
请求内容同如下:
#get方式:GET /HttpSer/TestMethod?name=wang&pass=123 HTTP/1.1Host: localhost:8080Connection: keep-aliveAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 Safari/537.36Referer: http://localhost:8080/HttpSer/testMethod.htmlAccept-Encoding: gzip, deflate, sdchAccept-Language: en-US,en;q=0.8#post方式:POST /HttpSer/TestMethod HTTP/1.1Host: localhost:8080Connection: keep-aliveContent-Length: 18Cache-Control: max-age=0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Origin: http://localhost:8080Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.85 Chrome/45.0.2454.85 Safari/537.36Content-Type: application/x-www-form-urlencodedReferer: http://localhost:8080/HttpSer/testMethod.htmlAccept-Encoding: gzip, deflateAccept-Language: en-US,en;q=0.8
请求头介绍:
1. 请求头介绍:
请求头主要包含一些有用信息:
1.Host: localhost:8080主机地址和端口
2.Connection: keep-alive 连接方式
3.User-Agent:浏览器的一些信息
4.Referer:来访页面
5.Content:实体内容;post才有
2. servlet获得请求头主要的方法:
request.getHeader(“Host”));通过建获得相应请求的内容;
Enumeration headerNames = request.getHeaderNames();获得请求头所有的键值
3. 演示如下:
修改doget方法
/*** 设置参数查询的编码*该方法只能对请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效!*GET方法的参数放在URI后面,所以对GET方式无效!!! */request.setCharacterEncoding("utf-8");/** * 1.1请求行的获得 */ System.out.println("请求方式:"+request.getMethod()); System.out.println("请求URI:"+request.getRequestURI()); System.out.println("请求url:"+request.getRequestURL()); System.out.println("获得协议:"+request.getProtocol());/** * 1.2请求头的获得 *///通过键获得请求头的内容 System.out.println("获得host:"+request.getHeader("Host")); System.out.println("获得浏览器的User-Agent:"+request.getHeader("User-Agent"));//通过迭代器迭代,获得键 在取键值 Enumeration<String> headerNames = request.getHeaderNames();while(headerNames.hasMoreElements()){ String key=headerNames.nextElement(); System.out.println(key+":"+request.getHeader(key)); }/** * 得到请求实体内容 * 比如:实体为name=peace&pass=1234 */ ServletInputStream in = request.getInputStream();byte[] buf=newbyte[1024];int len=0;while((len=in.read(buf))!=-1){ String str=new String(buf,0,len); System.out.println(str); }#输出如下:请求方式:GET请求URI:/HttpSer/TestRequst请求url:http://localhost:8080/HttpSer/TestRequst获得协议:HTTP/1.1获得host:localhost:8080获得浏览器的User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.101 Chrome/45.0.2454.101 Safari/537.36host:localhost:8080connection:keep-aliveaccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8upgrade-insecure-requests:1user-agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.101 Chrome/45.0.2454.101 Safari/537.36referer:http://localhost:8080/HttpSer/testMethod.htmlaccept-encoding:gzip, deflate, sdchaccept-language:en-US,en;q=0.8cookie:CNZZDATA1255712369=1133597550-1443969628-%7C1443969628//此去后面文章会介绍;
输入参数的介绍:
1. 输入参数:
输入参数:
对于get来说就是跟在url后面的内容
/TestParam?name=”peace”&password=”sisi” ;name=”peace”&password=”sisi”这就是输入参数
对于post来说就是实体内容,不可见
2. Servlet中获得输入参数的方法:
String name=request.getParameter(“name”);获得对应输入参数名字的内容
Enumeration params = request.getParameterNames();获得所有输入参数的名字,返回一个迭代器
String[] hobits = request.getParameterValues(names);如果对应名字的内容是一个数组,使用这个方法获得,比如复选框
3. 演示如下:
1.建立testParam.html 
2.修改doget方法:
/** * 设置参数查询的编码 * 该方法只能对请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效! * GET方法的参数放在URI后面,所以对GET方式无效!!! */ request.setCharacterEncoding("utf-8"); //获得所有的方式
System.out.println("提交方式:"+request.getMethod()); //获得输入参数 String name=request.getParameter("name"); String pass=request.getParameter("password"); System.out.println("name:"+name+",pass:"+pass);/*此去为如果get方式提交出现乱码,使用; * if("GET".equals(request.getMethod())){ password = new String(password.getBytes("iso-8859-1"),"utf-8"); }*/ System.out.println(">>>>>>>>>>>>>>>>>"); //获得所有输入参数的名字 Enumeration<String> params = request.getParameterNames(); while(params.hasMoreElements()) { String names=params.nextElement(); //如果是复选框,使用getParameterValues(names);方法 if("hobit".equals(names)){ System.out.println(names+":"); String[] hobits = request.getParameterValues(names); for(String s:hobits) System.out.print(s+","); System.out.println(); }
else{ System.out.println(names+":"+request.getParameter(names)); } }##输出结果如下:提交方式:POSTname:peace,pass:124>>>>>>>>>>>>>>>>>name:peacepassword:124gender:男籍贯:湖南hobit:篮球,足球,info:一条小鲨鱼peaceid:001
4.HTTP响应介绍:
HTTP/1.1 302 Found ---响应行 Server: Apache-Coyote/1.1 ---响应头, 有多个key-value组成Location: http://localhost:8080/HttpSer/ Transfer-Encoding: chunked Date: Fri, 09 Oct 2015 08:55:42 GMT
响应行介绍:
HTTP/1.1 302 Found
1基本介绍
1.HTTP/1.1:采用的协议
2.302:状态码
常见的状态:
200 : 表示请求处理完成并完美返回
302: 表示请求需要进一步细化。
404: 表示客户访问的资源找不到。
500: 表示服务器的资源发送错误。(服务器内部错误)
3.Found:状态描述,常见ok和found
2. servlet中的方法
tomcat服务器把请求信息封装到HttpServletRequest对象,且把响应信息封装到HttpServletResponse
response.setStatus(404);//设置状态码
response.sendError(404);// 设置错误页面
3. 演示如下
response.setStatus(404);//错误代码,没有反应response.sendError(404);// 发送404的状态码+404的错误页面#输出结果:HTTP/1.1404 Not FoundServer: Apache-Coyote/1.1Content-Type: text/html;charset=ISO-8859-1Content-Language: enContent-Length: 949Date: Sat, 10 Oct 201513:09:53 GMT

响应头介绍:
1. 基本介绍
格式:Server: Apache-Coyote/1.1;Server响应头名,后面的是响应值;
头里面主要包括:Server,服务器类型;Location:跳转网页地址 Conten*:实体内容
2. servlet中的方法
response.setHeader(“server”, “JBoss”);修改对应头名的内容;
3. 演示如下
//修改服务器类型 response.setHeader("server", "JBoss");/** * 修改实体内容 *///浏览器能直接看到的内容就是实体内容 response.getWriter().println("hello peace");//字符内容,常用//response.getOutputStream().write("hello world".getBytes());//字节内容。不能两个同时使用#输出如下:HTTP/1.1200 OKserver: JBossContent-Length: 12Date: Sat, 10 Oct 201513:11:04 GMTHTTP/1.1200 OKserver: JBossContent-Length: 12Date: Sat, 10 Oct 201513:11:04 GMT

几个常要的方面介绍
- 测试重定向:与转发不同
/** * 测试重定向:与转发不同 * 使用请求重定向:发送一个302状态吗+location的响应 * */response.setStatus(302);//设置状态码response.setHeader("location", "/HttpSer/adv.html");//设置重定向页面//简单写法// response.sendRedirect("/HttpSer/adv.html");#输出:HTTP/1.1302 FoundServer: Apache-Coyote/1.1location: /HttpSer/adv.htmlContent-Length: 12Date: Sat, 10 Oct 201513:15:26 GMT
- 定时刷新:
/** * 定时刷新 * 原理:浏览器解析refresh头,得到头之后重新请求当前资源 * */ //response.setHeader("refresh", "1");//每隔1秒刷新一次 //隔5秒后转到另外的资源 //response.setHeader("refresh", "5;url=/HttpSer/adv.html");#输出: HTTP/1.1200 OKServer: Apache-Coyote/1.1refresh:1Content-Length: 12Date: Sat, 10 Oct 201513:18:39 GMTHTTP/1.1200 OKServer: Apache-Coyote/1.1refresh:5;url=/HttpSer/adv.htmlContent-Length: 12Date: Sat, 10 Oct 201513:21:29 GMT
- 设置编码:
response.setCharacterEncoding("utf-8");
/** * 1. 服务器发送给浏览器的数据类型和内容编码 *///response.setHeader("content-type", "text/html");//设置内容为html//response.setContentType("text/html;charset=utf-8");//和上面代码等价。推荐使用此方法//response.setContentType("text/xml");//设置内容为xml//response.setContentType("image/png");//设置内容为图片
- 设置为下载方式打开文件:
/** * 设置以下载方式打开文件 *///response.setHeader("Content-Disposition", "attachment; filename="+file.getName());
- 发送硬盘图片给浏览器:
File file = new File("/media/peace/本地磁盘/andriod/1.png");//WebContent/** * 发送图片 */ FileInputStream in = new FileInputStream(file);byte[] buf = newbyte[1024];int len = 0;
//把图片内容写出到浏览器while( (len=in.read(buf))!=-1 ){ response.getOutputStream().write(buf, 0, len); }
HTTP协议介绍(SERVLET)的更多相关文章
- JSON-RPC轻量级远程调用协议介绍及使用
这个项目能够帮助开发人员利用Java编程语言轻松实现JSON-RPC远程调用.jsonrpc4j使用Jackson类库实现Java对象与JSON对象之间的相互转换.jsonrpc4j包含一个JSON- ...
- TCP/IP 协议介绍
转自http://blog.jobbole.com/104886/ 一.TCP/IP 协议介绍 在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容.TCP/IP协议是分层的,从底层至应 ...
- 第二章 ZAB协议介绍
ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议)是zookeeper数据一致性的核心算法. ZAB 协议并不像 Paxos 算法那样,是一种 ...
- [转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
[转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357 RTP ...
- Python基础教程之udp和tcp协议介绍
Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...
- 常用音频协议介绍&&有关音频编码的知识与技术参数
(转载)常用音频协议介绍 会议电视常用音频协议介绍及对比白皮书 一.数字化音频原理:声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线.通常人耳可以听到的频率在20 ...
- 各种开源协议介绍 BSD、Apache Licence、GPL V2 、GPL V3 、LGPL、MIT_转
转自:各种开源协议介绍 BSD.Apache Licence.GPL V2 .GPL V3 .LGPL.MIT 现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的 ...
- OSPF协议介绍及配置 (上)
OSPF协议介绍及配置 (上) 一.OSPF概述 回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加 ...
- VRRP协议介绍--转
http://www.cnblogs.com/jony413/articles/2697404.html VRRP协议介绍 参考资料: RFC 3768 1. 前言 VRRP(Virtual Rout ...
随机推荐
- SOA,ESB 与 SCA
SOA,ESB与 SCA SOA 与 ESB SOA(Service Oriented Architecture),面向服务体系结构,是一种组件模型架构,一种支撑软件运行的相对稳定的结构.其本质是一种 ...
- C蛮的全栈之路-node篇(二) 实战一:自动发博客
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...
- HDU3591找零,背包
题目大概的意思就是:小强用硬币买东西,硬币有N种,面值为Vi,店家有各种硬币都有无限个,而小强只有Ci个(分别对应Vi) 问最小交易硬币数,就是一个有找零的背包问题啦. 我的上一篇博客跟这hdu359 ...
- Java环境变量配置&解决版本不一致问题
之前用Myeclipse编译运行Java没有问题 但是突然想用简单点的NotePad++以及cmd直接编译运行Java 这就让我倒腾了一晚上 先说下问题的解决,再总结下查阅的一些知识. 1.进行win ...
- linux vim 基本操作
(一定要在英文输入法的状态下才有效)vi:实际上linux 上的 vi 不是真正的 vi,而是 vim;纯的 vi只在某些 unix 系统上还存在纯 的vi里面不支持退格键盘了,当按退格键盘以后,不是 ...
- DB2 WIN7 WIN8在指示的文件系统中找不到数据库目录
前言:win7下一些软件的不正常,跟win7的权限有很大关系. 在win7下安装db2 9.7客户端后,在cmd中运行db2cmd启动clp,输入db2的任何命令都显示:SQL ...
- windows下面composer安装yii2
1,安装composer "https://getcomposer.org/Composer-Setup.exe" 2,安装 composer-asset-plugin ,打开cm ...
- Linux脚本(二)
1.for循环以及加法的使用 portStr=`lsof -i:56801 | head -2`count=0for str in `lsof -i:56801 | head -2`do ((coun ...
- KVC 与 KVO 理解-b
KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...
- iOS中的隐式动画
隐式动画就是指 在 非 人为在代码中 定义动画 而系统却默认 自带 的动画 叫做隐式动画. 比如 改变 图层 的颜色 位置 和 透明度 的时候 都会 产生附带的渐变的 ...