zoukankan      html  css  js  c++  java
  • javaweb学习总结二十(http响应)

    一:http响应

    1:http响应的组成部分

    状态行、响应头、空行、响应数据

    2:状态行

    常用状态码:

    200:请求成功

    302:请求路径已经转移,请访问别的地址

    307或者304: 请访问缓存信息

    404:访问资源不存在

    403:资源存在,但是没有访问权限

    500:服务器内部错误

    二:HTTP协议响应头

    1:常用响应头

    2:常用响应头分析演示

    1):location:http://www.it315.org/index.jsp   和403搭配使用,告诉浏览器重定向到其他的页面

    代码如下:

     1 public class ServletDemo extends HttpServlet {
     2 
     3     public void doGet(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         doPost(request, response);
     6     }
     7 
     8     public void doPost(HttpServletRequest request, HttpServletResponse response)
     9             throws ServletException, IOException {
    10         response.setStatus(302); // 302状态码代表资源路径转移,重定向到新的资源路径
    11         response.setHeader("location", "/servletDemo/1.html");
    12 
    13     }
    14 
    15 }

    web.xml配置:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" 
     3     xmlns="http://java.sun.com/xml/ns/javaee" 
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     7   <servlet>
     8     <description>This is the description of my J2EE component</description>
     9     <display-name>This is the display name of my J2EE component</display-name>
    10     <servlet-name>ServletDemo</servlet-name>
    11     <servlet-class>com.hlcui.servlet.ServletDemo</servlet-class>
    12   </servlet>
    13 
    14   <servlet-mapping>
    15     <servlet-name>ServletDemo</servlet-name>
    16     <url-pattern>/servlet/ServletDemo</url-pattern>
    17   </servlet-mapping>
    18  
    19   <welcome-file-list>
    20     <welcome-file>index.jsp</welcome-file>
    21   </welcome-file-list>
    22 </web-app>

    tomcat服务器启动后,访问路径:http://localhost:8080/servletDemo/servlet/ServletDemo

    2):Server  Apache tomcat  告诉浏览器服务器的类型信息

    3):Content-Encoding:gzip  告诉浏览器服务器回送数据的压缩类型

    4):Content-Length: 80   告诉浏览器呢服务器回送数据大小

    演示代码如下:

     1 public class ServletDemo extends HttpServlet {
     2 
     3     public void doGet(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         doPost(request, response);
     6     }
     7 
     8     public void doPost(HttpServletRequest request, HttpServletResponse response)
     9             throws ServletException, IOException {
    10         String content = "wertyuiopdfghjkl;dfghjklertyuiodfghjkcvbnmcvb"
    11                 + "wertyuiopdfghjkl;dfghjklertyuiodfghjkcvbnmcvbtyuiopvbhnjk"
    12                 + "wertyuiopdfghjkl;dfghjklertyuiodfghjkcvbnmcvbtyuiopvbhnjk"
    13                 + "wertyuiopdfghjkl;dfghjklertyuiodfghjkcvbnmcvbtyuiopvbhnjk"
    14                 + "wertyuiopdfghjkl;dfghjklertyuiodfghjkcvbnmcvbtyuiopvbhnjk"
    15                 + "wertyuiopdfghjkl;dfghjklertyuiodfghjkcvbnmcvbtyuiopvbhnjk"
    16                 + "wertyuiopdfghjkl;dfghjklertyuiodfghjkcvbnmcvbtyuiopvbhnjk";
    17 
    18         System.out.println("压缩前数据大小:" + content.getBytes().length);
    19         ByteArrayOutputStream array = new ByteArrayOutputStream();
    20         GZIPOutputStream gzip = new GZIPOutputStream(array);
    21         gzip.write(content.getBytes()); // 将内容进行压缩
    22         gzip.close();
    23 
    24         System.out.println("压缩后数据大小:" + array.size());
    25         // 告诉浏览器数据压缩格式以及大小
    26         response.setHeader("Content-Encoding", "gzip");
    27         response.setHeader("Content-Length", array.size() + "");
    28         // 将内容写到浏览器
    29         response.getOutputStream().write(array.toByteArray());
    30 
    31     }
    32 
    33 }

    启动tomcat服务器,访问路径:http://localhost:8080/servletDemo/servlet/ServletDemo

    浏览器显示压缩后的数据:

    5):Content-Language:zh-cn  告诉浏览器服务器的语言环境

    6):Content-Type:text/html ; charset=utf-8 告诉浏览器服务器回送数据的内容类型

    代码如下:

     1 public class ServletDemo extends HttpServlet {
     2 
     3     public void doGet(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         doPost(request, response);
     6     }
     7 
     8     public void doPost(HttpServletRequest request, HttpServletResponse response)
     9             throws ServletException, IOException {
    10         // 告诉浏览器显示内容格式
    11         //response.setContentType("image/jpeg");
    12         // 或者设置响应头的方式
    13         response.setHeader("Content-Type", "image/jpeg");
    14         // 读取图片文件
    15         InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
    16         int len = 0;
    17         byte[] buf = new byte[1024];
    18         while ((len = in.read(buf)) > 0) {
    19             response.getOutputStream().write(buf, 0, len);
    20         }
    21 
    22     }
    23 
    24 }

    查看文件响应头的写法,tomcat服务器到 conf/web.xml

    重新部署服务,访问url:http://localhost:8080/servletDemo/servlet/ServletDemo

    7):Last-Modified:服务器告诉浏览器资源最后的修改时间,如果修改时间和缓存一直,那么就使用缓存时间,如果比缓存时间

    更新,那么就重新发送数据到浏览器。

    8):Refresh:1;url=http://www.baidu.com  服务器告诉浏览器每隔1秒刷新一次

    代码如下:

     1 public class ServletDemo extends HttpServlet {
     2 
     3     public void doGet(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         doPost(request, response);
     6     }
     7 
     8     public void doPost(HttpServletRequest request, HttpServletResponse response)
     9             throws ServletException, IOException {
    10         Date date = new Date();
    11         SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
    12 
    13         response.setHeader("refresh", "1"); // 让日期时间每隔1秒刷新1次
    14         response.getOutputStream().write(sdf.format(date).getBytes());
    15     }
    16 
    17 }

    refresh请求头还可以实现定时重定向页面的作用,例如注册页面注册成功后跳转到首页:

    代码如下:

     1 public class ServletDemo extends HttpServlet {
     2 
     3     public void doGet(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         doPost(request, response);
     6     }
     7 
     8     public void doPost(HttpServletRequest request, HttpServletResponse response)
     9             throws ServletException, IOException {
    10         String msg = "页面跳转中...";
    11         response.setHeader("refresh", "5;url='http://www.baidu.com'"); // 让日期时间每隔1秒刷新1次
    12         response.getOutputStream().write(msg.getBytes());
    13     }
    14 
    15 }

    访问页面5秒后进行页面跳转!!!

    9):  content-disposition :attachment;filename=""  服务器告诉浏览器以下载的方式处理文件

     1 public class ServletDemo extends HttpServlet {
     2 
     3     public void doGet(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         doPost(request, response);
     6     }
     7 
     8     public void doPost(HttpServletRequest request, HttpServletResponse response)
     9             throws ServletException, IOException {
    10         if ("download".equals(request.getParameter("type"))) {
    11             response.setHeader("content-disposition",
    12                     "attachment;filename=1.jpg");
    13             InputStream in = this.getServletContext().getResourceAsStream(
    14                     "/1.jpg");
    15             OutputStream out = response.getOutputStream();
    16             int len = 0;
    17             byte[] buf = new byte[1024];
    18             while ((len = in.read(buf)) > 0) {
    19                 out.write(buf, 0, len);
    20             }
    21             out.flush();
    22             out.close();
    23             in.close();
    24         } else {
    25             response.setCharacterEncoding("utf-8");
    26             response.setContentType("text/html");
    27             PrintWriter pw = response.getWriter();
    28             pw.print("<html>");
    29             pw.print("<head><script type='text/javascript'>" 
    30                     +"function download(){" 
    31                     +"window.open('http://localhost:8080/servletDemo/servlet/ServletDemo?type=download')"
    32                     +"}"
    33                     +"</script>"
    34                     +"</head>");
    35             /*pw
    36                     .print("<body><a href='http://localhost:8080/servletDemo/servlet/ServletDemo?type=download'>下载</a></body>");*/
    37             pw.print("<body><button onclick='download();'>下载</button></body>");
    38             pw.print("</html>");
    39             pw.close();
    40 
    41         }
    42 
    43     }
    44 }

    访问url:http://localhost:8080/servletDemo/servlet/ServletDemo

    显示“下载”按钮,点击下载按钮下载文件:

    10):Cache-control:no-cache  或者 pragma : no-cache 或者 expires :-1都是控制浏览器

    是否缓存服务器数据,一般情况下都写上,就不会有浏览器兼容问题。

    11):range 断续下载

    如果下载服务器的某个资源,已经下载一半,突然网络断了,下次有网络再下载另一半资源,迅雷下载比较常见:

    代码演示:

     1 /**
     2  * 
     3  */
     4 package com.hlcui.socket;
     5 
     6 import java.io.FileOutputStream;
     7 import java.io.IOException;
     8 import java.io.InputStream;
     9 import java.net.HttpURLConnection;
    10 import java.net.MalformedURLException;
    11 import java.net.URL;
    12 
    13 /**
    14  * @author Administrator 实现断续下载文件
    15  */
    16 public class DownloadRange {
    17 
    18     /**
    19      * @param args
    20      * @throws IOException
    21      */
    22     public static void main(String[] args) throws IOException {
    23         URL url = new URL("http://localhost:8080/servletDemo/111.txt");
    24         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    25 
    26         // 设置断续下载,从第4个字符开始下载
    27         conn.addRequestProperty("range", "bytes=4-");
    28         InputStream in = conn.getInputStream();
    29         FileOutputStream out = new FileOutputStream("F:\111.txt",true); //追加到内容的末尾
    30         int len = 0;
    31         byte[] buf = new byte[1024];
    32         while ((len = in.read(buf)) > 0) {
    33             out.write(buf, 0, len);
    34         }
    35         in.close();
    36         out.close();
    37 
    38     }
    39 
    40 }

    代码均已经验证!

  • 相关阅读:
    Search Insert Position
    Sum Root to Leaf Numbers
    String to Integer (atoi)
    Populating Next Right Pointers in Each Node
    Triangle
    Pascal's Triangle II
    Longest Consecutive Sequence
    属性透明度
    ul的列表符号在IE6下显示不全
    table的属性border-collapse 设置边框是否合并
  • 原文地址:https://www.cnblogs.com/warrior4236/p/5883270.html
Copyright © 2011-2022 走看看