request和response對象即然代表請求和響應,那我們要獲取客戶機提交過來的數據,只需要找request對象就行了。要向客戶機輸出數據,只需要找response對象就行了。
一、HttpServletResponse對象常見應用
1.1、使用OutputStream流向客戶端瀏覽器輸出中文數據
public class demoResponse extends HttpServlet {
private static final long serialVersionUID = 4312868947607181532L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
outputChineseByOutputStream(response);//使用OutputStream流輸出中文
}
/**
* 使用OutputStream流輸出中文
* @param request
* @param response
* @throws IOException
*/
public void outputChineseByOutputStream(HttpServletResponse response) throws IOException{
/**使用OutputStream輸出中文注意問題:
* 在服務器端,數據是以哪個碼錶輸出的,那麼就要控制客戶端瀏覽器以相應的碼錶打開,
* 比如:outputStream.write("中國".getBytes("UTF-8"));//使用OutputStream流向客戶端瀏覽器輸出中文,以UTF-8的編碼進行輸出
* 此時就要控制客戶端瀏覽器以UTF-8的編碼打開,否則顯示的時候就會出現中文亂碼,那麼在服務器端如何控制客戶端瀏覽器以以UTF-8的編碼顯示數據呢?
* 可以通過設置響應頭控制瀏覽器的行爲,例如:
* response.setHeader("content-type", "text/html;charset=UTF-8");//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據
*/
String data = "中國";
OutputStream outputStream = response.getOutputStream();//獲取OutputStream輸出流
response.setHeader("content-type", "text/html;charset=UTF-8");//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那麼瀏覽器顯示的將是亂碼
/**
* data.getBytes()是一個將字符轉換成字節數組的過程,這個過程中一定會去查碼錶,
* 如果是中文的操作系統環境,默認就是查找查GB2312的碼錶,
* 將字符轉換成字節數組的過程就是將中文字符轉換成GB2312的碼錶上對應的數字
* 比如: "中"在GB2312的碼錶上對應的數字是98
* "國"在GB2312的碼錶上對應的數字是99
*/
/**
* getBytes()方法如果不帶參數,那麼就會根據操作系統的語言環境來選擇轉換碼錶,如果是中文操作系統,那麼就使用GB2312的碼錶
*/
byte[] dataByteArr = data.getBytes("UTF-8");//將字符轉換成字節數組,指定以UTF-8編碼進行轉換
outputStream.write(dataByteArr);//使用OutputStream流向客戶端輸出字節數組
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
看一下結果:
1.2、使用PrintWriter流向客戶端瀏覽器輸出中文數據
public class demoResponse2 extends HttpServlet {
private static final long serialVersionUID = 4312868947607181532L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
outputChineseByPrintWriter(response);//使用PrintWriter流輸出中文
}
/**
* 使用PrintWriter流輸出中文
* @param request
* @param response
* @throws IOException
*/
public void outputChineseByPrintWriter(HttpServletResponse response) throws IOException{
String data = "中國";
//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那麼瀏覽器顯示的將是亂碼
//response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");//設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器
/**
* PrintWriter out = response.getWriter();這句代碼必須放在response.setCharacterEncoding("UTF-8");之後
* 否則response.setCharacterEncoding("UTF-8")這行代碼的設置將無效,瀏覽器顯示的時候還是亂碼
*/
PrintWriter out = response.getWriter();//獲取PrintWriter輸出流
/**
* 多學一招:使用HTML語言裏面的<meta>標籤來控制瀏覽器行爲,模擬通過設置響應頭控制瀏覽器行爲
* out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
* 等同於response.setHeader("content-type", "text/html;charset=UTF-8");
*/
out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
out.write(data);//使用PrintWriter流向客戶端輸出字符
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
查看一下結果:
注意點:
1)在開發過程中,如果希望服務器輸出什麼瀏覽器就能看到什麼,那麼在服務器端都要以字符串的形式進行輸
出。如果使用PrintWriter流輸出數字,那麼也要先將數字轉換成字符串後再輸出。
2)文件下載注意事項:編寫文件下載功能時推薦使用OutputStream流,避免使用PrintWriter流,
因爲OutputStream流是字節流,可以處理任意類型的數據,而PrintWriter流是字符流,
只能處理字符數據,如果用字符流處理字節數據,會導致數據丟失。