美文网首页我爱编程
Web 基础 9 Response对象的简介

Web 基础 9 Response对象的简介

作者: 小熊先生很不开心 | 来源:发表于2018-03-27 21:16 被阅读18次

    1.1 Response的概述

      Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。

      request和response对象既然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象即可。

      HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送响应状态码(即响应行)、发送响应头、发送数据的方法。

    1.1 HttpServletResponse(Response) 对象

    1.1.2 Response 输出流

    • 字符输出流
    response.getWriter().println("hahaha");
    
    • 字节输出流
    response.getOutputStream().write("hahah".getBytes());
    
    • 输出中文
      • 由于浏览器与服务器之间的的编码不统一 会导致中文输出出现乱码

    可以使用以下代码查看编码格式

    String encoding = response.getCharacterEncoding();//ISO-8859-1
    pw.println(encoding);
    

    为了中文输出格式统一,需要统一客户端与服务器端的编码格式

    • 方法一 :设置响应头,告诉浏览器你应该使用什么编码
    //response.setHeader("Content-type", "text/html;charset=UTF-8");
    //注释的方法和setContenType效果相同可以根据习惯自己使用
    response.setContentType("text/html;charset=UTF-8");
    os.write("小熊先生不开心".getBytes("UTF-8"));
    
    • 方法二 : 设置响应的编码

    字符流

    //设置浏览器接收数据使用的编码
    response.setContentType("text/html;charset=UTF-8");
    
    //获取字符输出流对象
    PrintWriter pw = response.getWriter();
    pw.println("小熊先生不开心");//默认使用的编码是ISO-8859-1
    

    字节流

    response.setContentType("text/html;charset=UTF-8");
    response.getOutputStream().write("小熊先生".getBytes("UTF-8"));
    这里的后面的getBytes("UTF-8")必须加(一定要记住啊)
    
    

    1.2 常用的响应行头操作

    1.2.1 Refresh 定时刷新或者跳转

    • 格式
    response.setHeader("Refresh", "需要的时间单位秒");//刷新
    
    response.setHeader("Refresh", "需要的时间单位秒;URL=需要跳转的网址或者内部资源");//刷新
    
    • 代码实现
    public class ResponseDemo4 extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            /*
             * Refresh:
             *          定时自动刷新
             *          定时自动跳转
             *          
             */
            
            //设置响应数据的类型和编码
            response.setContentType("text/html;charset=UTF-8");
            //获取字符输出流对象
            PrintWriter out = response.getWriter();
            /*
            //随机数
            Random r = new Random();
            int n = r.nextInt();
            out.println(n);
            
            
            //定时自动刷新
            response.setHeader("Refresh", "3");
    
            
            */
            
            //定时自动跳转
            //response.setHeader("Refresh", "3;URL=http://www.baidu.com");
            //正斜杠代表WEB服务器的根路径
            response.setHeader("Refresh", "3;URL=/myResponse/ResponseDemo");
        
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    
    

    1.2.2 Location 可以用于重定向

    • 格式
    设置相应头
    设置相应状态码
    
    • 代码实例
    //原理:设置location响应头,同时还需要设置一个响应码(状态码),302/307
    response.setHeader("Location", "http://www.baidu.com");
    //response.setStatus(307);
    response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);//307
    
    • 简化代码

    是不是觉的这样比较麻烦,其实有更简单的方法

    //重定向
    response.sendRedirect("http://www.baidu.com");
    //正斜杠代表的是WEB服务器的根路径
    response.sendRedirect("/myResponse/ResponseDemo");
    

    1.3 Content-disposition 可以用于下载文件

    //文件下载
    
    //设置响应头
    //response.setHeader("Content-disposition", "attachment;filename=pic01.jpg");
    //响应头里不能有中文,中文被认为是不安全的字符
    //可以用下面的方法进行编码
    String s = URLEncoder.encode("最可爱的熊本部.jpg", "UTF-8");
    response.setHeader("Content-disposition", "attachment;filename=" + s);
    
    //获取字节输出流对象
    OutputStream os = response.getOutputStream();
    
    //创建字节输入流对象
    String path = getServletContext().getRealPath("/WEB-INF/pic01.jpg");
    FileInputStream fis = new FileInputStream(path);
    
    
    int len = 0;
    byte[] bys = new byte[1024];
    
    while((len = fis.read(bys)) != -1) {
        //向客户端发送数据
        os.write(bys,0,len);
    }
    
    //释放资源
    fis.close();
    
    
    

    其中对于IO的对接 有Apache的工具类IOUtils 可以自行百度下载

    这里有一个重要的说明对于新手,把jar包直接放在WEN-INF下的lib文件夹即可

    response.setHeader("Content-disposition", "attachment;filename=br.png");
    String path = getServletContext().getRealPath("/WEB-INF/br.png");
    BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
    
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
    
    IOUtils.copy(bis, bos);
    
    

    是不是简单了很多了 哈哈

    相关文章

      网友评论

        本文标题:Web 基础 9 Response对象的简介

        本文链接:https://www.haomeiwen.com/subject/oafecftx.html