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所示: