全国咨询/投诉热线:400-618-4000

Java培训之response响应字节数据

更新时间:2016年07月29日18时10分 来源:传智播客Java培训学院 浏览次数:

1.response响应流介绍

response是响应对象,向浏览器端输出响应正文可以使用response响应流。response提供了两个响应流对象:
  • PrintWriter writer=response.getWriter():获取字符流;
  • ServletOutputStream out=response.getOutputStream():获取字节流;
如果响应正文是字符,就使用字符流,如果是字节就使用字节流。当然,也可以使用字节流向浏览器响应字符信息,前提是先将字符转换成字节或字节数组。
response对象的类型是HttpServletResponse,获取响应流的两个方法并不是HttpServletResponse接口定义的,而是由其父类ServletResponse接口定义的,下面通过一张图来了解获取相应流的这两个方法,如图1-1所示:
图1-1 获取响应流方法
response对象的getWriter()方法的使用在禁止浏览器缓存定时刷新都有介绍,它返回PrintWriter类型的对象,该对象可以将字符响应给浏览器。今天我们的主要内容是使用response对象获取字节流的方法getOutputStream()。该方法的返回值类型是ServletOutputStream,该类的父类是OutputStream。
需要注意的是response的getWriter()方法和getOutputStream()方法不能同时使用,即字符流和字节流不能同时出现,否则会抛出异常,如图1-2所示:
图1-2 getOutputStream()方法介绍
图1-2中红色矩形标注的部分的意思是说:如果getWriter()方法在response调用getOutputStream()方法之前被调用了,那么response在调用getOutputStream()方法时会抛出IllegalStateException。该异常是非法的状态异常,详细信息可参考JDK API。在getWriter()方法介绍中也有这句话存在,表示的是同一个response对象不能同时调用getWriter()和getOutputStream()方法。

2.response响应字节数据案例练习

通过以上对response响应字节流的了解,下面通过案例更进一步的去了解response对象的getOutputStream()方法的使用,具体如下所示:
(1)创建一个web应用,Example05,在该应用下创建一个Servlet类,StreamServlet,主要代码如例1-1所示:
例1-1 StreamServlet.java
public class StreamServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
           //使用字节流向浏览器端响应字符信息
       String value="hello outputStream";
       //将字符转换成字节数组
       byte bytes[]=value.getBytes();
       response.getOutputStream().write(bytes);
    }
}
(2)StreamServlet在web.xml文件中其访问路径的配置为:“/StreamServlet“。
(3)将Example05发布到Tomcat服务器,然后启动Tomcat服务器,在浏览器地址栏上输入:http://localhost:8080/Example05/StreamServlet,浏览器显示结果如图1-3所示:
图1-3 浏览器显示结果
(4)在Example05应用下新建一个Servlet类,ImgServlet,该Servlet的功能是将磁盘上的图片转换成字节输出在浏览器端,主要代码如例1-2所示:
例1-3 ImgServlet.java
public class ImgServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
            //首先给出图片的路径
       String path="D:/风景.jpg";
       //将图片写入到文件输入流中
       FileInputStream input=new FileInputStream(path);
       //使用帮助类将输入流转换成字节数组
       byte btyes[]=IOUtils.toByteArray(input);
       //使用response的getOutputStream()方法将该字节数组响应给浏览器
       response.getOutputStream().write(btyes);
    }
}
例1-2中,首先获得图片的路径,然后将图片写入到文件输入流中,再通过IOUtils类的toByteArray(InputStream input)方法将文件输入流转换成字节数组,最后由response调用getOutputStream()方法将字节数组响应给浏览器。其中,IOUtils类是commons-io-1.4.jar包中的类,所以我们要将这个jar包导入到WEB-INF目录下的lib目录中。点击此处 下载commons-io-1.4.jar。
(5)ImgServlet在web.xml文件中其访问路径配置为:“/ImgServlet“。
(6)重新启动Tomcat服务器,在浏览器端地址栏上输入:http://localhost:8080/Example05/ImgServlet,浏览器显示结果如图1-4所示:
图1-4 浏览器显示结果

本文版权归传智播客Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Java培训学院
首发:http://www.itcast.cn/javaee