ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java Web学习(七)HttpServletResponse(客户端响应)

2019-08-28 15:54:46  阅读:282  来源: 互联网

标签:Web OutputStream UTF 输出 HttpServletResponse 响应 Java 浏览器 response


本文借鉴:孤傲苍狼(特此感谢!)

一、定义

  HttpServletResponse对象代表服务端的响应,通过这个对象提供的方法,可以向客户机输出数据。

二、常用方法

PS:在JavaWeb开发中,只要是写URL地址,那么建议最好以"/"开头,也就是使用绝对路径的方式,如果"/"是给服务器用的,则代表当前的web工程,如果"/"是给浏览器用的,则代表webapps目录。

PS:也可以使用request.getContextPath()来代替"/项目名称"的方式,这样更加灵活。

    /**
         * 1.向客户端(浏览器)发送数据
         * 原理:Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
         * PS:getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
         * PS:Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
         */
        OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流(输出二进制数据)
        PrintWriter out = response.getWriter();//获取PrintWriter输出流(输出文本数据)

        /**
         * 2.设置响应头相关(设置响应头可以控制浏览器的行为)
         */
        response.setCharacterEncoding("UTF-8");//设置将数据以"UTF-8"编码输出到客户端浏览器
        response.setHeader("content-type", "text/html;charset=UTF-8");//控制浏览器以UTF-8的编码显示数据
        response.setStatus(HttpServletResponse.SC_OK);//设置响应码
        response.setHeader("refresh", "5");//控制浏览器每隔5秒钟刷新一次
        response.setContentType("image/jpeg");//告诉浏览器以该类型处理数据(控制浏览器以图片的方式打开)
        response.setDateHeader("expries", -1);//控制浏览器不缓存数据
        response.setHeader("Cache-Control", "no-cache");//控制浏览器不缓存数据
        response.setHeader("Pragma", "no-cache");//控制浏览器不缓存数据

        /**
         * 3.重定向
         */
        //法1:调用sendRedirect()方法
        response.sendRedirect("重定向地址");//重定向(内部的实现原理:使用response设置302状态码和设置location响应头实现重定向)
        //法2:设置响应头的Location属性和Status状态码
        response.setHeader("Location", "跳转地址");//设置跳转地址
        response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);

 

三、字符解析详解(中文乱码的问题)

/**
 * 服务器响应(中文乱码问题)
 * PS:在开发过程中,如果希望服务器输出什么浏览器就能看到什么,那么在服务器端都要以字符串的形式进行输出(无论输出的是字符还是数字)。
 */
public class ResponseDemo extends HttpServlet {

    /**
     * 输出中文
     *
     * @param response
     * @throws IOException
     */
    public void outputChinese(HttpServletResponse response) throws IOException {

        String data = "中国";

        /**
         * 1.使用OutputStream流向客户端浏览器输出中文数据
         * PS:服务器端可以通过设置响应头控制浏览器的行为
         * 例:设置响应头控制浏览器以UTF-8的编码显示数据:response.setHeader("content-type", "text/html;charset=UTF-8");
         */
        byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换(将字符转换成字节数组的过程,这个过程中一定会去查码表,如果是中文的操作系统环境,默认就是查找查GB2312的码表)
        OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流
        response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
        outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组

        /**
         * 2.使用PrintWriter流向客户端浏览器输出中文数据
         * PS:当需要向浏览器输出字符数据时,使用PrintWriter比较方便,省去了将字符转换成字节数组那一步。
         */
        response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
        PrintWriter out = response.getWriter();//获取PrintWriter输出流(PS:这句代码必须放在response.setCharacterEncoding("UTF-8");之后,否则response.setCharacterEncoding("UTF-8")这行代码的设置将无效,浏览器显示的时候还是乱码)
        response.setHeader("content-type", "text/html;charset=UTF-8");//设置响应头,控制浏览器以指定的字符编码编码进行显示
        out.write(data);//使用PrintWriter流向客户端输出字符
    }

}

 

四、文件下载

PS:编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。

   /**
     * 下载文件,通过OutputStream流
     * @param response
     * @throws FileNotFoundException
     * @throws IOException
     */
    private void downloadFileByOutputStream(HttpServletResponse response)
            throws FileNotFoundException, IOException {
        //1.获取要下载的文件的绝对路径
        String realPath = this.getServletContext().getRealPath("/download/1.JPG");
        //2.获取要下载的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
        //3.设置content-disposition响应头控制浏览器以下载的形式打开文件(PS:中文文件名的情况要使用URLEncoder.encode方法进行编码:response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));)
        response.setHeader("content-disposition", "attachment;filename="+fileName);
        //4.获取要下载的文件输入流
        InputStream in = new FileInputStream(realPath);
        int len = 0;
        //5.创建数据缓冲区(一次读取1024个字节)
        byte[] buffer = new byte[1024];
        //6.通过response对象获取OutputStream流
        OutputStream out = response.getOutputStream();
        //7.将FileInputStream流写入到buffer缓冲区
        while ((len = in.read(buffer)) > 0) {
        //8.使用OutputStream将缓冲区的数据输出到客户端浏览器
            out.write(buffer,0,len);
        }
        in.close();
    }

 

标签:Web,OutputStream,UTF,输出,HttpServletResponse,响应,Java,浏览器,response
来源: https://www.cnblogs.com/riches/p/11413798.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有