本文是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协议内容:

  1. 请求:
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
  1. 响应:
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

几个常要的方面介绍

  1. 测试重定向:与转发不同
/** * 测试重定向:与转发不同 * 使用请求重定向:发送一个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
  1. 定时刷新:
/** * 定时刷新 * 原理:浏览器解析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
  1. 设置编码:
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");//设置内容为图片
  1. 设置为下载方式打开文件:
/** * 设置以下载方式打开文件 *///response.setHeader("Content-Disposition", "attachment; filename="+file.getName());
  1. 发送硬盘图片给浏览器:
 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)的更多相关文章

  1. JSON-RPC轻量级远程调用协议介绍及使用

    这个项目能够帮助开发人员利用Java编程语言轻松实现JSON-RPC远程调用.jsonrpc4j使用Jackson类库实现Java对象与JSON对象之间的相互转换.jsonrpc4j包含一个JSON- ...

  2. TCP/IP 协议介绍

    转自http://blog.jobbole.com/104886/ 一.TCP/IP 协议介绍 在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容.TCP/IP协议是分层的,从底层至应 ...

  3. 第二章 ZAB协议介绍

    ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议)是zookeeper数据一致性的核心算法. ZAB 协议并不像 Paxos 算法那样,是一种 ...

  4. [转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

    [转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357 RTP       ...

  5. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

  6. 常用音频协议介绍&&有关音频编码的知识与技术参数

    (转载)常用音频协议介绍 会议电视常用音频协议介绍及对比白皮书 一.数字化音频原理:声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线.通常人耳可以听到的频率在20 ...

  7. 各种开源协议介绍 BSD、Apache Licence、GPL V2 、GPL V3 、LGPL、MIT_转

    转自:各种开源协议介绍 BSD.Apache Licence.GPL V2 .GPL V3 .LGPL.MIT 现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的 ...

  8. OSPF协议介绍及配置 (上)

    OSPF协议介绍及配置 (上) 一.OSPF概述 回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加 ...

  9. VRRP协议介绍--转

    http://www.cnblogs.com/jony413/articles/2697404.html VRRP协议介绍 参考资料: RFC 3768 1. 前言 VRRP(Virtual Rout ...

随机推荐

  1. WCF 无法生成 client

    在MVC中调用WCF 总是没有client 后来在网上查找原因,去掉Reuse type in referrenced assenbiles ,就可以生成代理代码.

  2. C#程序:如何创建xml文件以及xml文件的增、删、改、查

    其实今天的这篇博文 ,是对请几天发表的博文的一个总结,只是想把xml文件的增删改查结合起来,这样更容易让初学的朋友理解,废话也不多说了,开始吧! 下面是我把我在vs环境下写的代码ctrl+V然后ctr ...

  3. 解决SDK Manager无法更新问题

    因为google被封了,导致Android SDK Manager无法更新,解决方案如下: 1.选择tools->options,跳出Settings页面 2.设置HTTP Proxy代理,设置 ...

  4. sql server 数据库基础学习心得 思维导图

  5. Start an installation from GRUB

    Start an installation from GRUB Description This tip will show you how to start an installation for ...

  6. .Net Remoting浅释

    面试的时候,被问到.Net Remoting 工作方式及它和Web Service的区别,在此做个整理,顺便回顾一下. .Net Remoteing: 我们可以认为.Net Remoting是一种分布 ...

  7. WPF DataGrid

    前台代码 <DataGrid Name="gv_GetWork" AutoGenerateColumns="False" CanUserSortColum ...

  8. wampsever 数据库初体验

    Wamp就是Windos Apache Mysql PHP集成安装环境,即在window下的apache.php和mysql的服务器软件.PHP扩展.Apache模块,开启/关闭鼠标点点就搞定,再 也 ...

  9. hadoop 学习笔记 (十) mapreduce2.0

    MapReduce的特色---不擅长的方面 >实时计算 像mysql一样,在毫秒级或者秒级内返回结果 >流式计算 Mapreduce的输入数据时静态的,不能动态变化 MapReduce自身 ...

  10. TCP三次握手和http过程

    pc浏览服务器网页此过程不包括域名查询,只描述TCP与http数据流的变化.一.pc与http服务器进行三次握手来建立连接.1.pc:seq=0 ack=0 syn=1 ack=0 发送给服务器建立同 ...