1. 程式人生 > 其它 >JavaWeb-03-Servlet-04-HttpServletResponse介面

JavaWeb-03-Servlet-04-HttpServletResponse介面

HttpServletResponse介面

1.HttpServletResponse簡介

  1. HttpServletResponse介面來自於Servlet規範中,存在於Tomcat中的servle-api.jar,具體位置是【javax.servlet.http.HttpServletResponse】
  2. HttpServletResponse介面實現類由Http伺服器負責提供。
  3. HttpServletResponse介面負責將doGet/doPost方法執行結果寫入到【Http響應協議包】的【響應體】中交給瀏覽器。
  4. 開發人員習慣將HttpServletResponse介面修飾的物件稱為【響應物件】

2.響應物件的主要功能

  1. 將執行結果以二進位制形式寫入到【響應體】中
  2. 設定【響應頭】中【content-type】的屬性值,從而控制瀏覽器使用對應的編譯器將響應體中的二進位制資料編譯為【文字、圖片、視訊、命令】
  3. 設定響應頭中的【location】屬性,將一個請求地址賦給location,從而遠端控制瀏覽器向指定伺服器傳送請求。

3.功能實現1:響應物件將方法中執行結果寫入響應體

3.1實現流程

新建一個專案,建立一個Servlet介面實現類。

重寫doGet()方法,在方法內使用HttpServletResponse介面物件將執行結果寫入到響應體中。

package com.tsccg.controller;

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

/**
 * @Author: TSCCG
 * @Date: 2021/08/13 13:16
 * 響應物件將執行結果寫入到響應體中
 */
public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //執行結果
        String str = "Hello World";
        
        //---響應物件將執行結果寫入到響應體中---
       //1.通過響應物件向Tomcat索要輸出流
        PrintWriter out =  response.getWriter();
        //2.通過輸出流將執行結果以二進位制形式寫入到響應體中
        out.write(str);
        //response.getWriter().write(str);//合起來寫
        //---響應物件將執行結果寫入到響應體中---
        
    }//doGet方法執行結束,伺服器將Http響應協議包推送給瀏覽器
}

釋出網站後,開啟伺服器,通過瀏覽器向Tomcat伺服器發起請求訪問OneServlet:

Tomcat伺服器接收到請求後,建立一個OneServlet的例項物件,然後通過該例項物件呼叫其doGet()方法。

在doGet方法中,得到執行結果後,通過響應物件response向Tomcat伺服器索要一個輸出流物件:

PrintWriter out =  response.getWriter();

然後通過輸出流物件呼叫write()方法將執行結果寫入到Http響應協議包的響應體中:

out.write(str);

doGet方法執行結束後,伺服器將帶有執行結果的Http響應協議包傳送給瀏覽器,

瀏覽器接收到資料後,讀取響應體中的執行結果,將其展示到瀏覽器上。

3.2write和print

write()方法可以將【字元】、【字串】、【ASCII碼】寫入到響應體中。

上面程式中,寫入一個字串沒有什麼問題,但如果寫入的是一個數字的話,就會將數字當作是一個ASCII碼。

把上面程式中的執行結果換成97,重啟伺服器,重新寫入響應體:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //執行結果
    //String str = "Hello World";
    int result = 97;
    //1.通過響應物件向Tomcat索要輸出流
    PrintWriter out =  response.getWriter();
    //2.通過輸出流將執行結果以二進位制形式寫入到響應體中
    out.write(result);
}

通過瀏覽器訪問,得到的結果是ASCII碼中97對應的字元【a】。

當我們想寫入一個真實資料時,使用write()顯然不可行。

此時,我們可以使用print()方法。

print()方法可以將真實資料寫入響應體中。

使用print()方法重新寫入:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //執行結果
    int result = 97;
    //1.通過響應物件向Tomcat索要輸出流
    PrintWriter out =  response.getWriter();
    //2.通過輸出流將執行結果以二進位制形式寫入到響應體中
    //out.write(result);
    out.print(result);
}

通過瀏覽器訪問,可以接收到真實資料。

4.功能實現2:設定響應頭中content-type的屬性值

4.1設定編譯html標籤命令

新建立一個Servlet介面實現類TwoServlet:

將一句包含html標籤的字串作為執行結果寫入響應體中。

package com.tsccg.controller;

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

/**
 * @Author: TSCCG
 * @Date: 2021/08/13 15:23
 */
public class TwoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //執行結果
        String str1 = "java<br>c++<br>python";
        //向伺服器索要輸出流
        PrintWriter out = response.getWriter();
        //將執行結果以二進位制形式寫入響應體中
        out.print(str1);
    }
}

開啟伺服器,通過瀏覽器訪問TwoServlet

從結果可見,瀏覽器在接收到響應結果時,將寫入的html語句作為文字內容展示在視窗上了,並沒有將其作為html標籤命令執行。

原因是什麼呢?

瀏覽器在接收到響應包後,根據響應頭中的【content-type】屬性值,來選擇相對應的【編譯器】對響應體中的二進位制內容進行編譯處理。

在預設情況下,【content-type】的屬性值為"text",瀏覽器會使用【文字編輯器】編譯響應體中的二進位制檔案。

如何解決呢?

在得到輸出流之前,通過【響應物件】設定響應頭中的【content-type】屬性值:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //執行結果
    String str1 = "java<br>c++<br>python";
    //設定響應頭中content-type屬性值
    response.setContentType("text/html");
    //向伺服器索要輸出流
    PrintWriter out = response.getWriter();
    //將執行結果寫入響應體中
    out.print(str1);
}

這樣,瀏覽器接收到響應結果時,就會採用【文字編譯器】和【HTML命令編譯器】一起對響應體中的二進位制資料進行編譯。

重啟伺服器並通過瀏覽器訪問TwoServlet。

4.2設定字元編碼集

將一句包含中文的字串寫入到響應體中:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String str1 = "java<br>c++<br>python";
    String str2 = "北京烤鴨<br>大盤雞<br>雞公煲";//中文字串
    //設定響應頭中content-type屬性值
    response.setContentType("text/html");
    //向伺服器索要輸出流
    PrintWriter out = response.getWriter();
    //將執行結果寫入響應體中
    out.print(str1);
    out.print(str2);
}

重啟伺服器,通過瀏覽器訪問

由結果可見,寫入的中文顯示亂碼。

原因是響應頭中,Content-Type屬性值的【字元編碼集charset】預設是【ISO-8859-1】,不支援中文。

我們可以在得到輸出流之前設定Content-Type的屬性值,將字元編碼集設定為【utf-8】。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String str1 = "java<br>c++<br>python";
    String str2 = "北京烤鴨<br>大盤雞<br>雞公煲";
    //設定響應頭中content-type屬性值
    //response.setContentType("text/html");
    response.setContentType("text/html;charset=utf-8");
    //向伺服器索要輸出流
    PrintWriter out = response.getWriter();
    //將執行結果寫入響應體中
    out.print(str1);
    out.print(str2);
}

5.功能實現3:遠端控制瀏覽器傳送請求行為

響應物件可以呼叫sendRedirect方法將一個網址賦值給響應頭中的location屬性。

瀏覽器在接收到響應包後,如果發現響應頭中有location屬性,會自動通過位址列向location指定的網站傳送請求。

新建一個Servlet介面實現類ThreeServlet,通過響應物件呼叫sendRedirect方法將百度地址賦給響應頭中的location屬性。

package com.tsccg.controller;

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

/**
 * @Author: TSCCG
 * @Date: 2021/08/13 17:31
 */
public class ThreeServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //百度地址
        String result = "http://www.baidu.com";
        //通過響應物件將地址賦給響應頭中的location屬性
        response.sendRedirect(result);
    }
}

通過瀏覽器請求訪問ThreeServlet:

瀏覽器發現響應頭中的location屬性有地址,會在位址列寫入該地址併發起請求。

sendRedirect方法還可以控制瀏覽器的【請求地址,請求方式,請求引數】。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //百度地址
    //String result = "http://www.baidu.com";
    String result = "http://www.baidu.com?username=zhangsan";//【請求引數】
    //通過響應物件將地址賦給響應頭中的location屬性
    response.sendRedirect(result);
}