1.response響應(yīng)流介紹
response是響應(yīng)對(duì)象,向?yàn)g覽器端輸出響應(yīng)正文可以使用response響應(yīng)流。response提供了兩個(gè)響應(yīng)流對(duì)象:
- PrintWriter writer=response.getWriter():獲取字符流;
- ServletOutputStream out=response.getOutputStream():獲取字節(jié)流;
如果響應(yīng)正文是字符,就使用字符流,如果是字節(jié)就使用字節(jié)流。當(dāng)然,也可以使用字節(jié)流向?yàn)g覽器響應(yīng)字符信息,前提是先將字符轉(zhuǎn)換成字節(jié)或字節(jié)數(shù)組。
response對(duì)象的類型是HttpServletResponse,獲取響應(yīng)流的兩個(gè)方法并不是HttpServletResponse接口定義的,而是由其父類ServletResponse接口定義的,下面通過一張圖來了解獲取相應(yīng)流的這兩個(gè)方法,如圖1-1所示:
圖1-1 獲取響應(yīng)流方法
response對(duì)象的getWriter()方法的使用在
禁止瀏覽器緩存和
定時(shí)刷新都有介紹,它返回PrintWriter類型的對(duì)象,該對(duì)象可以將字符響應(yīng)給瀏覽器。今天我們的主要內(nèi)容是使用response對(duì)象獲取字節(jié)流的方法getOutputStream()。該方法的返回值類型是ServletOutputStream,該類的父類是OutputStream。
需要注意的是response的getWriter()方法和getOutputStream()方法不能同時(shí)使用,即字符流和字節(jié)流不能同時(shí)出現(xiàn),否則會(huì)拋出異常,如圖1-2所示:
圖1-2 getOutputStream()方法介紹
圖1-2中紅色矩形標(biāo)注的部分的意思是說:如果getWriter()方法在response調(diào)用getOutputStream()方法之前被調(diào)用了,那么response在調(diào)用getOutputStream()方法時(shí)會(huì)拋出IllegalStateException。該異常是非法的狀態(tài)異常,詳細(xì)信息可參考JDK API。在getWriter()方法介紹中也有這句話存在,表示的是同一個(gè)response對(duì)象不能同時(shí)調(diào)用getWriter()和getOutputStream()方法。
2.response響應(yīng)字節(jié)數(shù)據(jù)案例練習(xí)
通過以上對(duì)response響應(yīng)字節(jié)流的了解,下面通過案例更進(jìn)一步的去了解response對(duì)象的getOutputStream()方法的使用,具體如下所示:
(1)創(chuàng)建一個(gè)web應(yīng)用,Example05,在該應(yīng)用下創(chuàng)建一個(gè)Servlet類,StreamServlet,主要代碼如例1-1所示:
例1-1 StreamServlet.java
public class StreamServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//使用字節(jié)流向?yàn)g覽器端響應(yīng)字符信息
String value="hello outputStream";
//將字符轉(zhuǎn)換成字節(jié)數(shù)組
byte bytes[]=value.getBytes();
response.getOutputStream().write(bytes);
}
}
(2)StreamServlet在web.xml文件中其訪問路徑的配置為:“/StreamServlet“。
(3)將Example05發(fā)布到Tomcat服務(wù)器,然后啟動(dòng)Tomcat服務(wù)器,在瀏覽器地址欄上輸入:http://localhost:8080/Example05/StreamServlet,瀏覽器顯示結(jié)果如圖1-3所示:
圖1-3 瀏覽器顯示結(jié)果
(4)在Example05應(yīng)用下新建一個(gè)Servlet類,ImgServlet,該Servlet的功能是將磁盤上的圖片轉(zhuǎn)換成字節(jié)輸出在瀏覽器端,主要代碼如例1-2所示:
例1-3 ImgServlet.java
public class ImgServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//首先給出圖片的路徑
String path="D:/風(fēng)景.jpg";
//將圖片寫入到文件輸入流中
FileInputStream input=new FileInputStream(path);
//使用幫助類將輸入流轉(zhuǎn)換成字節(jié)數(shù)組
byte btyes[]=IOUtils.toByteArray(input);
//使用response的getOutputStream()方法將該字節(jié)數(shù)組響應(yīng)給瀏覽器
response.getOutputStream().write(btyes);
}
}
例1-2中,首先獲得圖片的路徑,然后將圖片寫入到文件輸入流中,再通過IOUtils類的toByteArray(InputStream input)方法將文件輸入流轉(zhuǎn)換成字節(jié)數(shù)組,最后由response調(diào)用getOutputStream()方法將字節(jié)數(shù)組響應(yīng)給瀏覽器。其中,IOUtils類是commons-io-1.4.jar包中的類,所以我們要將這個(gè)jar包導(dǎo)入到WEB-INF目錄下的lib目錄中。點(diǎn)擊此處
下載commons-io-1.4.jar。
(5)ImgServlet在web.xml文件中其訪問路徑配置為:“/ImgServlet“。
(6)重新啟動(dòng)Tomcat服務(wù)器,在瀏覽器端地址欄上輸入:http://localhost:8080/Example05/ImgServlet,瀏覽器顯示結(jié)果如圖1-4所示: