HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
http协议的再介绍
① http协议是建立在tcp/ip协议基础上
② http协议全称 超文本传输协议
③ http协议1.0 , 1.1版本 ,目前通用的是1.1版本
http1.0 称为短连接
http1.1 称为长连接.
所谓长,和短指的是 持续时间的 长连接 1.1 30s ,短连接是发送完数据就断掉.
Http详解之请求篇
http请求由三部分组成,分别是:请求行、消息报头、请求正文
基本结构:
GET /test/hello.html HTTP/1.1 [请求行]
1) Accept: text/html,image/* [告诉服务器,我可以接受文本,网页,图片]
2. Accept-Charset: ISO-8859-1 [接受字符编码 iso-8859-1]
3. Accept-Encoding: gzip,compress [可以接受 gzip,compress压缩后数据.]
4. Accept-Language: en-us,zh-cn [浏览器支持中,英文]
5. Host: www.sohu.com:80 [我要找主机是www.sohu.com:80]
6. If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT [ 告诉服务器,我的缓冲中有这个资源文件,该文件的时间是。。。]
7. Referer: http://www.sohu.com/index.jsp [告诉服务器,我来自哪里,该消息头,常用于防止盗链]
8. User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)[告诉服务器,浏览器内核]
9. Cookie [cookie??]
10. Connection:close/Keep-Alive [保持连接,发完数据后,我不关闭连接]
11. Date: Tue, 11 Jul 2000 18:23:51 GMT [浏览器发送该http请求的时间]
特别说明: 并不是每一次请求的消息头都一样.]
空行
发送的内容 [格式 : 内容名字=内容体]
请求方式
请求行中的GET称之为请求方式,请求方式有:POST,GET,HEAD,OPTIONS,DELETE,TRACE,PUT
常用的有:POST,GET
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET 请求获取Request-URI所标识的资源。
POST 在Request-URI所标识的资源后附加新的数据。
HEAD 请求获取由Request-URI所标识的资源的响应消息报头。
PUT 请求服务器存储一个资源,并用Request-URI作为其标识。
DELETE 请求服务器删除Request-URI所标识的资源。
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断。
CONNECT 保留将来使用。
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求。
HTTP协议详解之响应篇
在接收和解释请求消息后,服务器返回一个HTTP响应消息。
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
格式:HTTP版本号 状态码 原因叙述
举例:HTTP/1.1 200 OK
状态码 含义
100-199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200-299 表示成功接收请求并完成整个处理过程,常用200
300-399 为完成请求,客户需要进行一步细化请求。例如:请求的资源已经移动一个新的地址,常用302,307
400-499 客户端的请求有错误404
500-599 服务器端出现错误,常用500
http响应的状态行举例说明:
200 就是整个请求和响应过程没有发生错误,这个最常见.
302: 表示当你请求一个资源的时候,服务器返回302 表示,让浏览器转向到另外一个资源,比如: response.sendRedirect(“/web应用/资源名”)
response.setStatus(302);
response.setHeader(“Location”, “/servletPro/Servlet2”);
// 上面两句话等价 response.sendRedirect(“/servletPro/Servlet2”);
404: 找不到资源
500: 服务器端错误
http响应消息头详解
Location: http://www.baidu.org/index.jsp 【让浏览器重新定位到url】
Server:apache tomcat 【告诉浏览器我是tomcat】
Content-Encoding: gzip 【告诉浏览器我使用 gzip】
Content-Length: 80 【告诉浏览器会送的数据大小80节】
Content-Language: zh-cn 【支持中文】
Content-Type: text/html;charset=GB2312 [内容格式text/html; 编码gab2312]
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 【告诉浏览器,该资源上次更新时间】
Refresh: 1;url=http://www.baidu.com 【过多久去,刷新到 http://www.baidu.com】
Content-Disposition: attachment; filename=aaa.zip 【告诉浏览器,有文件下载】
Transfer-Encoding: chunked [传输的编码]
Set-Cookie:SS=Q0=5Lb_nQ; path=/search[后面详讲]
Expires: -1[告诉浏览器如何缓存页面IE]
Cache-Control: no-cache [告诉浏览器如何缓存页面火狐]
Pragma: no-cache [告诉浏览器如何缓存页面]
Connection: close/Keep-Alive [保持连接 1.1是Keep-Alive]
Date: Tue, 11 Jul 2000 18:23:51 GMT
①定时刷新Refresh使用
response.setHeader(“Refresh”,”5;url=/servletPro/Servlet2″);
②文件下载Content-Disposition
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | publicvoid doGet(HttpServletRequest request, HttpServletResponseresponse) throwsServletException, IOException { response.setContentType("text/html"); //PrintWriterout = response.getWriter(); //演示下载文件 response.setHeader("Content-Disposition", "attachment; filename=winter.jpg"); //打开文件.说明一下web 站点下载文件的原理 //1.获取到要下载文件的全路径 String path=this.getServletContext().getRealPath("/images/Winter.jpg"); //System.out.println("path="+path); //2创建文件输入流 FileInputStream fis=new FileInputStream(path); //做一个缓冲字节数组 byte buff[]=newbyte[1024]; int len=0;//表示实际每次读取了多个个字节 OutputStreamos=response.getOutputStream(); while((len=fis.read(buff))>0){ os.write(buff, 0, len); } //缺点: 没有进度条./图标/ //关闭 os.close(); fis.close(); } |
③缓存讲解
提出问题:浏览器默认情况下,会缓存我们的页面,这样出现一个问题:如果我们的用户习惯把光标停留在地址栏,然后回车来取页面,就会默认调用cache中取数据。
(1) 有些网站要求及时性很高,因此要求我们不缓存页面
代码:
//指定该页面不缓存 Ie
response.setDateHeader(“Expires”, -1);【针对IE浏览器设置不缓存】
//为了保证兼容性.
response.setHeader(“Cache-Control”, “no-cache”);【针对火狐浏览器等】
response.setHeader(“Pragma”, “no-cache”);【其他浏览器】
(2) 有些网站要求网页缓存一定时间,比如缓存一个小时
response.setDateHeader(“Expires”, System.currentTimeMillis()+3600*1000*24);后面一个参数表示设置的缓存保持时间,-1表示永远缓存。
HttpServletResponse的再说明:
getWriter()
getOutputStream();
区别
1. getWriter() 用于向客户机回送字符数据
2. getOutputStream() 返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据)
OutputStream os=response.getOutputStream();
os.write(“hello,world”.getBytes());
如何选择:
如果我们是回送字符数据,则使用 PrintWriter对象 ,效率高
如果我们是回送字节数据(binarydate) ,则只能使用 OutputStream
☞ 这两个流不能同时使用.
比如:
1 2 3 4 5 6 7 8 9 10 11 | OutputStream os=response.getOutputStream(); os.write("hello,world".getBytes()); PrintWriter out=response.getWriter(); out.println("abc"); 就会报错: java.lang.IllegalStateException: getOutputStream() has already been called for this response |
不能同时使用printWriter和outputstream的原因
Web服务器会自动检查并关闭流
使用outputstream的write后就会把信息封装到response对象,返回给web服务。然后web服务器就会去检测response的相关流有没有关闭,没有关闭就会自动关闭。所以再去使用response时就会报这个流已经被关闭的错误。
从该图,我们也可以看出. 为什么我们没有主动关闭流,程序也没有问题的原因.
当然:你主动关闭流,更好.
参数的传递方式sendRedirect()和session()
需求: 当用户登录成功后,把该用户名字显示在登录成功页面;
①使用sendRedirect()来传递字符参数
解决思路:
1. 使用java基础 static
2. 使用sendRedirect()
代码:
response.sendRedirect(“/UsersManager/MainFrame?uname=”+username+”&pwd=”+password);
3. 使用session 传递[后面讲]
这里,我们先预热.
说明:
基本格式:
response.sendRedirect(“servlet的地址?参数名=参数值&参数名=参数值…”);
☞ 参照值是String , 参数名应当使用 字母组合
在接受数据的Servlet中:
String 参数=request.getParameter(“参数名”);
②使用session()来传递字符参数和对象
A.传递字符串
放入session request.getSession.setAttribute(“loginUser”,username);
取出session 在JSP中通过session取出request.getSession.getAttribute(“loginUser”);
B.传递对象
User user= new User();
user.setName(“xiaoli”);
user.setPassWord(“123”);
放入session request.getSession.setAttribute(“userObj”,userObj);
取出session User user=(User)request.getSession.getAttribute(“userObj”);
除非注明,Coder文章均为原创,转载请以链接形式标明本文地址