一抚垄、HttpServletResponse對象介紹
HttpServletResponse對象代表服務(wù)器的響應(yīng)把跨。這個對象中封裝了向客戶端發(fā)送數(shù)據(jù)鸳劳、發(fā)送響應(yīng)頭戈锻,發(fā)送響應(yīng)狀態(tài)碼的方法编兄。查看HttpServletResponse的API轩性,可以看到這些相關(guān)的方法。
1.1 負(fù)責(zé)向客戶端(瀏覽器)發(fā)送數(shù)據(jù)的相關(guān)方法
類型 | 方法 |
---|---|
ServletOutputStream | getOutputStream() |
java.io.PrintWriter | getWriter() |
1.2 負(fù)責(zé)向客戶端(瀏覽器)發(fā)送響應(yīng)頭的相關(guān)方法
類型 | 方法 |
---|---|
void | addCookie(Cookie cookie) |
void | addDateHeader(java.lang.String name, long date) |
void | addHeader(java.lang.String name, java.lang.String value) |
void | addIntHeader(java.lang.String name, int value) |
void | sendError(int sc) |
void | sendError(int sc, java.lang.String msg) |
void | sendRedirect(java.lang.String location) |
void | setDateHeader(java.lang.String name, long date) |
void | setHeader(java.lang.String name, java.lang.String value) |
void | setIntHeader(java.lang.String name, int value) |
boolean | containsHeader(java.lang.String name) |
java.lang.String | encodeRedirectUrl(java.lang.String url) |
java.lang.String | encodeURL(java.lang.String url) |
java.lang.String | encodeUrl(java.lang.String url) |
1.3 負(fù)責(zé)向客戶端(瀏覽器)發(fā)送響應(yīng)狀態(tài)碼的相關(guān)方法
類型 | 方法 |
---|---|
void | setStatus(int sc) |
void | setStatus(int sc, java.lang.String sm) |
1.4 響應(yīng)狀態(tài)碼的常量
HttpServletResponse定義了很多狀態(tài)碼的常量(具體可以查看Servlet的API)狠鸳,當(dāng)需要向客戶端發(fā)送響應(yīng)狀態(tài)碼時(shí)揣苏,可以使用這些常量,避免了直接寫數(shù)字件舵,常見的狀態(tài)碼對應(yīng)的常量:
狀態(tài)碼404對應(yīng)的常量: SC_NOT_FOUND
狀態(tài)碼200對應(yīng)的常量:SC_OK
狀態(tài)碼500對應(yīng)的常量:SC_INTERNAL_SERVER_ERROR
二卸察、HttpServletResponse對象常見應(yīng)用
2.1 使用OutputStream流向客戶端瀏覽器輸出中文數(shù)據(jù)
使用OutputStream流輸出中文注意問題:
在服務(wù)器端,數(shù)據(jù)是以哪個碼表輸出的铅祸,那么就要控制客戶端瀏覽器以相應(yīng)的碼表打開坑质,比如:outputStream.write("中國".getBytes("UTF-8"));使用OutputStream流向客戶端瀏覽器輸出中文合武,以UTF-8的編碼進(jìn)行輸出,此時(shí)就要控制客戶端瀏覽器以UTF-8的編碼打開涡扼,否則顯示的時(shí)候就會出現(xiàn)中文亂碼稼跳,那么在服務(wù)器端如何控制客戶端瀏覽器以以UTF-8的編碼顯示數(shù)據(jù)呢?可以通過設(shè)置響應(yīng)頭控制瀏覽器的行為吃沪,例如:response.setHeader("content-type", "text/html;charset=UTF-8");通過設(shè)置響應(yīng)頭控制瀏覽器以UTF-8的編碼顯示數(shù)據(jù)汤善。
使用OutputStream流向客戶端瀏覽器輸出"中國"這兩個漢字
package gacl.response.study;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo01 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輸出中文注意問題:
* 在服務(wù)器端,數(shù)據(jù)是以哪個碼表輸出的票彪,那么就要控制客戶端瀏覽器以相應(yīng)的碼表打開红淡,
* 比如:outputStream.write("中國".getBytes("UTF-8"));//使用OutputStream流向客戶端瀏覽器輸出中文,以UTF-8的編碼進(jìn)行輸出
* 此時(shí)就要控制客戶端瀏覽器以UTF-8的編碼打開降铸,否則顯示的時(shí)候就會出現(xiàn)中文亂碼在旱,那么在服務(wù)器端如何控制客戶端瀏覽器以以UTF-8的編碼顯示數(shù)據(jù)呢?
* 可以通過設(shè)置響應(yīng)頭控制瀏覽器的行為推掸,例如:
* response.setHeader("content-type", "text/html;charset=UTF-8");//通過設(shè)置響應(yīng)頭控制瀏覽器以UTF-8的編碼顯示數(shù)據(jù)
*/
String data = "中國";
OutputStream outputStream = response.getOutputStream();//獲取OutputStream輸出流
response.setHeader("content-type", "text/html;charset=UTF-8");//通過設(shè)置響應(yīng)頭控制瀏覽器以UTF-8的編碼顯示數(shù)據(jù)颈渊,如果不加這句話,那么瀏覽器顯示的將是亂碼
/**
* data.getBytes()是一個將字符轉(zhuǎn)換成字節(jié)數(shù)組的過程终佛,這個過程中一定會去查碼表俊嗽,
* 如果是中文的操作系統(tǒng)環(huán)境,默認(rèn)就是查找查GB2312的碼表铃彰,
* 將字符轉(zhuǎn)換成字節(jié)數(shù)組的過程就是將中文字符轉(zhuǎn)換成GB2312的碼表上對應(yīng)的數(shù)字
* 比如: "中"在GB2312的碼表上對應(yīng)的數(shù)字是98
* "國"在GB2312的碼表上對應(yīng)的數(shù)字是99
*/
/**
* getBytes()方法如果不帶參數(shù)绍豁,那么就會根據(jù)操作系統(tǒng)的語言環(huán)境來選擇轉(zhuǎn)換碼表,如果是中文操作系統(tǒng)牙捉,那么就使用GB2312的碼表
*/
byte[] dataByteArr = data.getBytes("UTF-8");//將字符轉(zhuǎn)換成字節(jié)數(shù)組竹揍,指定以UTF-8編碼進(jìn)行轉(zhuǎn)換
outputStream.write(dataByteArr);//使用OutputStream流向客戶端輸出字節(jié)數(shù)組
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.2 使用PrintWriter流向客戶端瀏覽器輸出中文數(shù)據(jù)
使用PrintWriter流輸出中文注意問題:
在獲取PrintWriter輸出流之前首先使用"response.setCharacterEncoding(charset)"設(shè)置字符以什么樣的編碼輸出到瀏覽器,如:response.setCharacterEncoding("UTF-8");設(shè)置將字符以"UTF-8"編碼輸出到客戶端瀏覽器邪铲,然后再使用response.getWriter();獲取PrintWriter輸出流芬位,這兩個步驟不能顛倒
response.setCharacterEncoding("UTF-8");//設(shè)置將字符以"UTF-8"編碼輸出到客戶端瀏覽器
/**
* PrintWriter out = response.getWriter();這句代碼必須放在response.setCharacterEncoding("UTF-8");之后
* 否則response.setCharacterEncoding("UTF-8")這行代碼的設(shè)置將無效,瀏覽器顯示的時(shí)候還是亂碼
*/
PrintWriter out = response.getWriter();//獲取PrintWriter輸出流
/*然后再使用response.setHeader("content-type", "text/html;charset=字符編碼");設(shè)置響應(yīng)頭带到,控制瀏覽器以指定的字符編碼編碼進(jìn)行顯示*/
response.setHeader("content-type", "text/html;charset=UTF-8");
除了可以使用response.setHeader("content-type", "text/html;charset=字符編碼");設(shè)置響應(yīng)頭來控制瀏覽器以指定的字符編碼編碼進(jìn)行顯示這種方式之外昧碉,還可以用如下的方式來模擬響應(yīng)頭的作用。
/**
* 多學(xué)一招:使用HTML語言里面的<meta>標(biāo)簽來控制瀏覽器行為揽惹,模擬通過設(shè)置響應(yīng)頭控制瀏覽器行為
*response.getWriter().write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
* 等同于response.setHeader("content-type", "text/html;charset=UTF-8");
*/
response.getWriter().write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
范例:使用PrintWriter流向客戶端瀏覽器輸出"中國"這兩個漢字
package gacl.response.study;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo01 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 = "中國";
//通過設(shè)置響應(yīng)頭控制瀏覽器以UTF-8的編碼顯示數(shù)據(jù)被饿,如果不加這句話,那么瀏覽器顯示的將是亂碼
//response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");//設(shè)置將字符以"UTF-8"編碼輸出到客戶端瀏覽器
/**
* PrintWriter out = response.getWriter();這句代碼必須放在response.setCharacterEncoding("UTF-8");之后
* 否則response.setCharacterEncoding("UTF-8")這行代碼的設(shè)置將無效搪搏,瀏覽器顯示的時(shí)候還是亂碼
*/
PrintWriter out = response.getWriter();//獲取PrintWriter輸出流
/**
* 多學(xué)一招:使用HTML語言里面的<meta>標(biāo)簽來控制瀏覽器行為狭握,模擬通過設(shè)置響應(yīng)頭控制瀏覽器行為
* 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);
}
}
2.4 文件下載
件下載功能是web開發(fā)中經(jīng)常使用到的功能,使用HttpServletResponse對象就可以實(shí)現(xiàn)文件的下載疯溺。
文件下載功能的實(shí)現(xiàn)思路:
1.獲取要下載的文件的絕對路徑
2.獲取要下載的文件名
3.設(shè)置content-disposition響應(yīng)頭控制瀏覽器以下載的形式打開文件
4.獲取要下載的文件輸入流
5.創(chuàng)建數(shù)據(jù)緩沖區(qū)
6.通過response對象獲取OutputStream流
7.將FileInputStream流寫入到buffer緩沖區(qū)
8.使用OutputStream將緩沖區(qū)的數(shù)據(jù)輸出到客戶端瀏覽器
package gacl.response.study;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author gacl
* 文件下載
*/
public class ResponseDemo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
downloadFileByOutputStream(response);//下載文件论颅,通過OutputStream流
}
/**
* 下載文件哎垦,通過OutputStream流
* @param response
* @throws FileNotFoundException
* @throws IOException
*/
private void downloadFileByOutputStream(HttpServletResponse response)
throws FileNotFoundException, IOException {
//1.獲取要下載的文件的絕對路徑
String realPath = this.getServletContext().getRealPath("/download/1.JPG");
//2.獲取要下載的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//3.設(shè)置content-disposition響應(yīng)頭控制瀏覽器以下載的形式打開文件
// response.setHeader("content-disposition", "attachment;filename="+fileName);
//3.設(shè)置content-disposition響應(yīng)頭控制瀏覽器以下載的形式打開文件,中文文件名要使用URLEncoder.encode方法進(jìn)行編碼恃疯,否則會出現(xiàn)文件名亂碼
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
//4.獲取要下載的文件輸入流
InputStream in = new FileInputStream(realPath);
int len = 0;
//5.創(chuàng)建數(shù)據(jù)緩沖區(qū)
byte[] buffer = new byte[1024];
//6.通過response對象獲取OutputStream流
OutputStream out = response.getOutputStream();
//7.將FileInputStream流寫入到buffer緩沖區(qū)
while ((len = in.read(buffer)) > 0) {
//8.使用OutputStream將緩沖區(qū)的數(shù)據(jù)輸出到客戶端瀏覽器
out.write(buffer,0,len);
}
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
文件下載注意事項(xiàng):編寫文件下載功能時(shí)推薦使用OutputStream流撼泛,避免使用PrintWriter流,因?yàn)镺utputStream流是字節(jié)流澡谭,可以處理任意類型的數(shù)據(jù),而PrintWriter流是字符流损俭,只能處理字符數(shù)據(jù)蛙奖,如果用字符流處理字節(jié)數(shù)據(jù),會導(dǎo)致數(shù)據(jù)丟失杆兵。
3雁仲、 HttpServletResponse常見應(yīng)用
3.1 生成隨機(jī)圖片用作驗(yàn)證碼
生成圖片主要用到了一個BufferedImage類
package gacl.response.study;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo03 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("refresh", "5");//設(shè)置refresh響應(yīng)頭控制瀏覽器每隔5秒鐘刷新一次
//1.在內(nèi)存中創(chuàng)建一張圖片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//2.得到圖片
//Graphics g = image.getGraphics();
Graphics2D g = (Graphics2D)image.getGraphics();
g.setColor(Color.WHITE);//設(shè)置圖片的背景色
g.fillRect(0, 0, 80, 20);//填充背景色
//3.向圖片上寫數(shù)據(jù)
g.setColor(Color.BLUE);//設(shè)置圖片上字體的顏色
g.setFont(new Font(null, Font.BOLD, 20));
g.drawString(makeNum(), 0, 20);
//4.設(shè)置響應(yīng)頭控制瀏覽器瀏覽器以圖片的方式打開
response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg");
//5.設(shè)置響應(yīng)頭控制瀏覽器不緩存圖片數(shù)據(jù)
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//6.將圖片寫給瀏覽器
ImageIO.write(image, "jpg", response.getOutputStream());
}
/**
* 生成隨機(jī)數(shù)字
* @return
*/
private String makeNum(){
Random random = new Random();
String num = random.nextInt(9999999)+"";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7-num.length(); i++) {
sb.append("0");
}
num = sb.toString()+num;
return num;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3.2 設(shè)置響應(yīng)頭控制瀏覽器的行為
3.2.1設(shè)置http響應(yīng)頭控制瀏覽器禁止緩存當(dāng)前文檔內(nèi)容
- response.setDateHeader("expries", -1);
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Pragma", "no-cache");
3.2.2 設(shè)置http響應(yīng)頭控制瀏覽器定時(shí)刷新網(wǎng)頁(refresh)
response.setHeader("refresh", "5");//設(shè)置refresh響應(yīng)頭控制瀏覽器每隔5秒鐘刷新一次
3.2.3 通過response實(shí)現(xiàn)請求重定向
請求重定向指:一個web資源收到客戶端請求后,通知客戶端去訪問另外一個web資源琐脏,這稱之為請求重定向攒砖。
應(yīng)用場景:用戶登陸,用戶首先訪問登錄頁面日裙,登錄成功后吹艇,就會跳轉(zhuǎn)到某個頁面,這個過程就是一個請求重定向的過程
實(shí)現(xiàn)方式:response.sendRedirect(String location)昂拂,即調(diào)用response對象的sendRedirect方法實(shí)現(xiàn)請求重定向
sendRedirect內(nèi)部的實(shí)現(xiàn)原理:使用response設(shè)置302狀態(tài)碼和設(shè)置location響應(yīng)頭實(shí)現(xiàn)重定向
package gacl.response.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo04 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.調(diào)用sendRedirect方法實(shí)現(xiàn)請求重定向,
* sendRedirect方法內(nèi)部調(diào)用了
* response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
* response.setStatus(HttpServletResponse.SC_FOUND);//設(shè)置302狀態(tài)碼受神,等同于response.setStatus(302);
*/ response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
//2.使用response設(shè)置302狀態(tài)碼和設(shè)置location響應(yīng)頭實(shí)現(xiàn)重定向?qū)崿F(xiàn)請求重定向
//response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
//response.setStatus(HttpServletResponse.SC_FOUND);//設(shè)置302狀態(tài)碼,等同于response.setStatus(302);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
四格侯、web工程中URL地址的推薦寫法
在JavaWeb開發(fā)中鼻听,只要是寫URL地址,那么建議最好以"/"開頭联四,也就是使用絕對路徑的方式撑碴,那么這個"/"到底代表什么呢?可以用如下的方式來記憶"/":如果"/"是給服務(wù)器用的朝墩,則代表當(dāng)前的web工程醉拓,如果"/"是給瀏覽器用的,則代表webapps目錄收苏。
4.1 "/"代表當(dāng)前web工程的常見應(yīng)用場景
4.1.1 ServletContext.getRealPath(String path)獲取資源的絕對路徑
/**
* 1.ServletContext.getRealPath("/download/1.JPG")是用來獲取服務(wù)器上的某個資源廉嚼,
* 那么這個"/"就是給服務(wù)器用的,"/"此時(shí)代表的就是web工程
* ServletContext.getRealPath("/download/1.JPG")表示的就是讀取web工程下的download文件夾中的1.JPG這個資源
* 只要明白了"/"代表的具體含義倒戏,就可以很快寫出要訪問的web資源的絕對路徑
*/
this.getServletContext().getRealPath("/download/1.JPG");
4.1.2 在服務(wù)器端forward到其他頁面
/**
* 2.forward
* 客戶端請求某個web資源怠噪,服務(wù)器跳轉(zhuǎn)到另外一個web資源,這個forward也是給服務(wù)器用的杜跷,
* 那么這個"/"就是給服務(wù)器用的傍念,所以此時(shí)"/"代表的就是web工程
*/
this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
4.1.3 使用include指令或者<jsp:include>標(biāo)簽引入頁面
<jsp:include page="/jspfragments/demo.jsp" />
<%@include file="/jspfragments/head.jspf" %>
4.2 "/"代表webapps目錄的常見應(yīng)用場景
4.2.1 使用sendRedirect實(shí)現(xiàn)請求重定向
response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
服務(wù)器發(fā)送一個URL地址給瀏覽器矫夷,瀏覽器拿到URL地址之后,再去請求服務(wù)器憋槐,所以這個"/"是給瀏覽器使用的双藕,此時(shí)"/"代表的就是webapps目錄,"/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"這個地址指的就是"webapps\JavaWeb_HttpServletResponse_Study_20140615\index.jsp"
response.sendRedirect("/項(xiàng)目名稱/文件夾目錄/頁面");這種寫法是將項(xiàng)目名稱寫死在程序中的做法阳仔,不靈活忧陪,萬一哪天項(xiàng)目名稱變了,此時(shí)就得改程序近范,所以推薦使用下面的靈活寫法:
response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
改寫后:
- response.sendRedirect(request.getContextPath()+"/index.jsp");
request.getContextPath()獲取到的內(nèi)容就是"/JavaWeb_HttpServletResponse_Study_20140615"嘶摊,這樣就比較靈活了,使用request.getContextPath()代替"/項(xiàng)目名稱"
4.2.2 使用超鏈接跳轉(zhuǎn)
<a href="/JavaWeb_HttpServletResponse_Study_20140615/index.jsp">跳轉(zhuǎn)到首頁</a>
這是客戶端瀏覽器使用的超鏈接跳轉(zhuǎn)评矩,這個"/"是給瀏覽器使用的叶堆,此時(shí)"/"代表的就是webapps目錄。
<a href="${pageContext.request.contextPath}/index.jsp">跳轉(zhuǎn)到首頁</a>
4.2.3 Form表單提交
<form action="/JavaWeb_HttpServletResponse_Study_20140615/servlet/CheckServlet" method="post">
<input type="submit" value="提交">
</form>
4.2.4 js腳本和css樣式文件的引用
<%--使用絕對路徑的方式引用js腳本--%>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/index.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/login.js"></script>
五斥杜、response細(xì)節(jié)問題
getOutputStream和getWriter方法分別用于得到輸出二進(jìn)制數(shù)據(jù)虱颗、輸出文本數(shù)據(jù)的ServletOuputStream、Printwriter對象蔗喂。
getOutputStream和getWriter這兩個方法互相排斥忘渔,調(diào)用了其中的任何一個方法后,就不能再調(diào)用另一方法缰儿。
Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數(shù)據(jù)將被Servlet引擎從response里面獲取辨萍,Servlet引擎將這些數(shù)據(jù)當(dāng)作響應(yīng)消息的正文,然后再與響應(yīng)狀態(tài)行和各響應(yīng)頭組合后輸出到客戶端返弹。
Serlvet的service方法結(jié)束后锈玉,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經(jīng)調(diào)用過close方法,如果沒有义起,Servlet引擎將調(diào)用close方法關(guān)閉該輸出流對象拉背。