zoukankan      html  css  js  c++  java
  • http 的request和response 在servlet的应用文件下载

    一)response

    我们通过浏览器访问网站的时候,处理响应的是response。

    它由三部门组成:响应行、响应头、响应体 作用:往浏览器写东西。

    1)响应行

    格式:协议/版本  状态码 状态码说明。

    状态码:

      1xx 已发送请求。

           2xx  已完成响应  200 正常响应。

           3xx   还需浏览器进一步操作。

                 302 重定向,配合响应头:location。

                  304 读缓存。

           4xx  用户操作错误。

                   404  用户操作错误。

                    405   访问方法不存在。

            5xx

                   500  服务器内部错误。

      常用方法:

          setStauts()该方法,设置http返回码的时候,如果返回的自定义的比如说111的状态码直接浏览器处于pending状态,4xx的返回码也会显示请求有问题等。

     1 @WebServlet(name = "Servlet_Rsq")
     2 public class Servlet_Rsq extends HttpServlet {
     3     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     4 
     5     }
     6 
     7     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     8         response.setContentType("text/html;charset=utf-8");
     9         response.setStatus(400);
    10         response.getWriter().print("<h1>状态码400</h1>");
    11     }
    12 }

     

    操作响应头:

        setHeader(String key,String val) addHeader(String  key,String val)设置相应头,如果存在则追加,如果不存在添加。

    1         response.getWriter().print("<div>三秒之后进行跳转!</div>");
    2         response.setHeader("refresh","3;url=/");

     常用响应头:

                  1): 重定向建议使用第二种

                         1、location:需要注意必须配合setstatus()方法

    1         response.setStatus(302);
    2         response.setHeader("location","/local");

          2:sendRedirect()

    1 response.sendRedirect("/local");

        2)文件下载

        1、超链接下载:之前我们在部署下载服务器的时候,直接使用超链接下载,但是有的类型文件,比如说:xml 在下载的时候,直接被打开。而有的zip包取能被下载,这是为什么呢?

    之所以会被下载是因为:浏览器解析不了的文件,会被浏览器下载处理,如果可以被解析的文件的,则会在浏览器呈现出来。也就是文件的mintype类型问题。所以出现之前的情况。

           2、代码下载

                   通过指定文件mimeType的类型,通过输入IO流和输出流,返回给浏览器可以直接被下载,不会被出现上面的问题。

        还有一个问题:文件名字中带有中文的时候,不同的浏览器需要编码不同。

        Firefox:需要的base64编码

                  其他浏览器:需要utf-8

         1)获取文件的mimeType类型。

         2)设置头部信息。

         3)对拷流。

     1     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     2         String filename=request.getParameter("filename");
     3         System.out.println(filename);
     4         ServletContext context=this.getServletContext();
     5         String mi=context.getMimeType("/download/"+filename);
     6         System.out.println(mi);
     7         response.setContentType(mi);
     8         InputStream inp=context.getResourceAsStream("WEB-INF/download/time.jpg");
     9         //设置头部信息。
    10         response.setHeader("content-disposition","attachment;filename="+filename);
    11         ServletOutputStream out=response.getOutputStream();
    12         //io对拷。使用common.io
    13         IOUtils.copy(inp,out);
    14     }

     二)request

      作用:获取浏览器的发送过来的数据。

            组成部分:

                  请求行、请求头、请求体

           操作请求行:

                   格式:

                           请求方式  请求资源  协议/版本

                   常用方法: HttpServletRequest

                       掌握的方法:                

    1         //获取请求方法:get、post等
    2         String method=request.getMethod();
    3         //获取远程执行IP
    4         String ip=request.getRemoteAddr();
    5         //获取项目名称。
    6         String pro=request.getContextPath();
    7         System.out.println(method+" "+ip+" "+pro);

       操作请求头:

    1         //获取请求浏览器内核。
    2         String nut=request.getHeader("user-agent");
    3         //获取页面请求的来源 防盗链
    4         String com=request.getHeader("referer");
    5         System.out.println(nut+" "+com);

       获取单个key多个值情况(checkbox)

     1         //获取单个请求参数。
     2         String  finame=request.getParameter("filename");
     3         //获取多个请求参数的值。
     4         String[]  vals=request.getParameterValues("info");
     5         for(String i:vals){
     6             System.out.println(i);
     7         }
     8         //获取多组参数值。
     9         Map<String,String[]> get_val=request.getParameterMap();
    10 //        System.out.println(get_val);
    11         for(String key:get_val.keySet()){
    12             System.out.println(Arrays.toString(get_val.get(key)));
    13         }

    三:

         get请求和post请求中文乱码,是因为在浏览器处理中文的时候utf8但是到tomcat使用的编码的是iso-8859-1。所以,我们需要转换相应的编码。

    使用String   str=String.getBytes("iso-8859-1",“utf-8”)

    因为得到参数已经被iso-8859-1处理过,需要用iso-8859-1解码然后用utf-8解码。new String(oldstring.getBytes("iso-8859-1"),"utf-8")

    1         //获取多个请求参数的值。
    2         String[]  vals=request.getParameterValues("info");
    3         for(String i:vals){
    4             System.out.println(new String(i.getBytes("iso-8859-1"),"utf-8"));
    5         }

     下载文件扩展:

          针对带有中文的下载文件处理。针对不同的浏览器进行不同的处理

     1       String filename=request.getParameter("filename");
     2         filename=new String(filename.getBytes("iso-8859-1"),"utf-8");
     3         System.out.println(filename);
     4         String _filename;
     5         if(nut.contains("Firefox")){
     6              _filename=base64EncodeFileName(filename);
     7         }else{
     8              _filename= URLEncoder.encode(filename,"utf-8");
     9         }
    10         System.out.println(_filename);
    11         ServletContext context=this.getServletContext();
    12         String mi=context.getMimeType("/download/"+filename);
    13         System.out.println(mi);
    14         response.setContentType(mi);
    15         //获取输入的流的时候需要注意的是:原始的文件名字 需要转码处理。
    16         InputStream inp=context.getResourceAsStream("WEB-INF/download/"+filename);
    17         //设置头部信息。
    18         //添加不同的转码的文件名字。
    19         response.setHeader("content-disposition","attachment;filename="+_filename);
    20         ServletOutputStream out=response.getOutputStream();
    21         //io对拷。使用common.io
    22         IOUtils.copy(inp,out);
    23     }
    24 
    25     public static String base64EncodeFileName(String fileName) {
    26         /**
    27          * 该函数主要处理判断请求的浏览器内核进行处理。
    28          * 针对不同的浏览器内核,进行不同转码。
    29          */
    30         BASE64Encoder base64encoder = new BASE64Encoder();
    31         try {
    32             return "=?UTF-8?B?" + new String(base64encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
    33         } catch (java.io.UnsupportedEncodingException e) {
    34             e.printStackTrace();
    35             throw new RuntimeException(e);
    36         }
    37     }
    38 
    39 }
  • 相关阅读:
    dutacm.club_1094_等差区间_(线段树)(RMQ算法)
    dutacm.club_1087_Common Substrings_(KMP)_(结合此题通俗理解kmp的next数组)
    dutacm.club_1089_A Water Problem_(dp)
    14年第五届蓝桥杯第八题_地宫取宝_(记忆化搜索)
    14年第五届蓝桥杯第七题_蚂蚁感冒_(思维)
    dutacm.club_1085_Water Problem_(矩阵快速幂)
    HDU_2476_String painter_(区间dp)
    第五届蓝桥杯校内选拔第七题_(树型dp)
    第五届蓝桥杯校内选拔第六题_(dfs)
    15年第六届蓝桥杯第九题_(矩阵快速幂优化的动态规划)
  • 原文地址:https://www.cnblogs.com/evilliu/p/8570107.html
Copyright © 2011-2022 走看看