Servlet--HttpServletResponse的2個操作流的方法


前面已經說過無數多次了。我們的項目都是基於HTTP協議的一次請求。一次響應。實際編碼中,我們在處理完邏輯后通常是跳轉到一個頁面上,或者用輸出流返回json字符串。事實上跳轉到一個頁面往往也就是JSP,JSP執行在tomcat里面編譯處理后返回響應。最后一步都是通過response獲得輸出流來返回到瀏覽器。這里總結下response的2個輸出流。
  • 首先我們翻下API:
public ServletOutputStream getOutputStream() throws IOException;
返回一個記錄二進制的響應數據的輸出流。
注意:假設這個響應對象已經調用getWriter,將會拋出IllegalStateException。


public PrintWriter getWriter() throws IOException;
這種方法返回一個PringWriter對象用來記錄格式化的響應實體。

假設要反映使用的字符編碼,必須改動響應的MIME類型。


注意:在調用這種方法之前,必須設定響應的content類型。

假設沒有提供這種編碼類型,會拋出一個UnsupportedEncodingException。假設這個響應對象已調用getOutputStream,會拋出一個getOutputStream。

  • 對照上面的2個方法我們來整理一下:
1,getWriter()用於向客戶機回送字符數據
2。getOutputStream()用於向客戶機回送字符數據,也能夠回送字節數據

  • 那么我們應該怎么選擇這2種輸出流呢?
假設我們回送字符數據,就用getWriter,效率高
假設我們回送的是字節數據,也就僅僅能用getOutputStream了。




上面API上已經說的非常明確。這2個方法不能同一時候使用。看以下的代碼:

package linkin;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author LinkinPark
 * @author 2015-7-10
 * @Descri HttpServletResponse的2個輸出流
 */
public class LinkinServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		//resp.setContentType("text/html;charset=UTF-8");
		resp.getWriter().write("林肯公園");
		resp.getOutputStream().write("林肯公園".getBytes());
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		this.doGet(req, resp);
	}
	
}

我們如今訪問下:http://localhost:8080/linkin/LinkinServlet結果報錯了,報錯說:

getWriter() has already been called for this response

什么意思呢?就是說上面第一次使用流返回響應已經將這個流關閉了。這個是Servlet引擎自己主動幫我們做的,所以就不能第2次再去獲得這個流來操作了。當然這里我們也能夠自己來將輸出流關閉,只是即使我們不關閉,引擎也會自己主動幫我關閉了。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM