HttpServletResponse 對象

一抚垄、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)閉該輸出流對象拉背。

驗(yàn)證碼圖片

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市默终,隨后出現(xiàn)的幾起案子椅棺,更是在濱河造成了極大的恐慌,老刑警劉巖齐蔽,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件两疚,死亡現(xiàn)場離奇詭異,居然都是意外死亡含滴,警方通過查閱死者的電腦和手機(jī)诱渤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谈况,“玉大人勺美,你說我怎么就攤上這事递胧。” “怎么了赡茸?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵缎脾,是天一觀的道長。 經(jīng)常有香客問我占卧,道長遗菠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任华蜒,我火速辦了婚禮辙纬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘友多。我一直安慰自己,他們只是感情好堤框,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布域滥。 她就那樣靜靜地躺著,像睡著了一般蜈抓。 火紅的嫁衣襯著肌膚如雪启绰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天沟使,我揣著相機(jī)與錄音委可,去河邊找鬼。 笑死腊嗡,一個胖子當(dāng)著我的面吹牛着倾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燕少,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼卡者,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了客们?” 一聲冷哼從身側(cè)響起崇决,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎底挫,沒想到半個月后恒傻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡建邓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年盈厘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官边。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡扑庞,死狀恐怖譬重,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罐氨,我是刑警寧澤臀规,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站栅隐,受9級特大地震影響塔嬉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜租悄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一谨究、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泣棋,春花似錦胶哲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至把敢,卻和暖如春寄摆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背修赞。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工婶恼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柏副。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓勾邦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親割择。 傳聞我的和親對象是個殘疾皇子检痰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容