1. 程式人生 > 其它 >servlet中的HttpServletResponse物件

servlet中的HttpServletResponse物件

當有多個客戶端瀏覽器去請求Tomcat時,Tomcat會為每一個客戶端瀏覽器建立一對獨立的HttpServletRequest與HttpServletResponse物件

HttpServletResponse物件代表伺服器的響應,在該物件中封裝了響應客戶端瀏覽器的流物件,以及向客戶端瀏覽器響應的響應頭,響應資料,響應狀態碼等資訊

設定響應型別

客戶端瀏覽器根據給定的響應型別決定如何處理響應

setContentType("MIME")通過MIME-Type設定響應型別。

 

設定字元型響應

  • resp.setContentType("text/html")

    響應型別為文字型,內容含有html字串,是預設響應型別

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設定響應型別為html型
        resp.setContentType("text/html;utf-8");

        //獲取響應字元流
        PrintWriter pw=resp.getWriter();

        //向客戶端響應資料
        pw.println("<!DOCTYPE html>");
        pw.println(
"<html lang=\"en\">"); pw.println("<head>"); pw.println("<meta charset=\"UTF-8\">"); pw.println("<title>Title</title>"); pw.println("</head>"); pw.println("<body>"); pw.println("<font color='#663399'>HelloWord</font>"); pw.println(
"</body>"); pw.println("</html>"); //重新整理流 pw.flush(); //關閉流 pw.close(); }

 

 

 

  • resp.setContentType("text/plain")

    響應型別為文字型,內容是普通文字,不會解析html標籤。

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設定響應型別為普通文字型
        resp.setContentType("text/plain;utf-8");

        //獲取響應字元流
        PrintWriter pw=resp.getWriter();

        //向客戶端響應資料
        pw.println("<!DOCTYPE html>");
        pw.println("<html lang=\"en\">");
        pw.println("<head>");
        pw.println("<meta charset=\"UTF-8\">");
        pw.println("<title>Title</title>");
        pw.println("</head>");
        pw.println("<body>");
        pw.println("<font color='#663399'>HelloWord</font>");
        pw.println("</body>");
        pw.println("</html>");

        //重新整理流
        pw.flush();
        //關閉流
        pw.close();
    }

 

 

 

  • resp.setContentType("application/json")

    響應型別為JSON格式的字串。

 

 

 

 設定位元組型響應

  • resp.setContentType("image/jpeg")

    響應型別為圖片型別,圖片型別為jpeg或jpg格式。

  • resp.setContentType("image/gif")

    響應型別為圖片型別,圖片型別為gif格式。

設定響應編碼

 

 

  •  response.setContentType("text/html;charset=utf-8");

    不僅傳送到瀏覽器的內容會使用UTF-8編碼,而且還通知瀏覽器使用UTF-8編碼方式進行顯示。所以總能正常顯示中文

  • response.setCharacterEncoding("utf-8");

    僅僅是傳送的瀏覽器的內容是UTF-8編碼的,至於瀏覽器是用哪種編碼方式顯示不管。 所以當瀏覽器的顯示編碼方式不是              UTF-8的時候,就會看到亂碼,需要手動指定瀏覽器編碼

重定向響應

 

 

 

 

 

 

 

  • response.sendRedirect(URL地址)

    重定向響應會在響應頭中新增一個Location的key,對應的value是給定的URL。客戶端瀏覽器在解析響應頭後自動向Location中的URL 傳送請求。

 

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //產生重定向響應
        resp.sendRedirect("http://www.baidu.com");
    }

 

重定向響應的特點:

 

1)產生兩次請求和兩次響應

2)重定向的URL由客戶端瀏覽器傳送

3)瀏覽器位址列發生改變

案例:

建立一個搜尋頁面,通過百度搜索引擎完成內容搜尋

1)完成搜尋頁面search.html的編寫

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>search</title>
</head>
<body>
<form action="redirect">
<!--    搜尋框-->
    <input type="text" name="text">
<!--    搜尋按鈕-->
    <input type="submit" value="search" name="search">
</form>
</body>
</html>

2)完成servlet的編寫

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

@WebServlet("/redirect")
public class redirect extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取搜尋框的值
        String value=req.getParameter("text");
        //產生重定向響應
        resp.sendRedirect("https://www.baidu.com/s?wd="+ URLEncoder.encode(value,"utf-8"));//對瀏覽器進行URL編碼
    }
}

 

 HttpServletResponse物件實現檔案下載

在實現檔案下載時,需要在響應頭中新增附加資訊。

 //Content-Disposition-----檔案配置,attachment-----附件
 response.addHeader("Content-Disposition","attachment; filename="+檔名);
  • Content-Disposition:attachment

    該附加資訊表示作為對下載檔案的一個標識欄位,直接啟動下載功能下載檔案。不會在瀏覽器中 顯示而是直接做下載處理。

  • filename=檔名

    瀏覽器使用該檔名作為下載檔案的檔名。

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //讀取要下載的檔案
        File file=new File("D:\\flower.jpg");
        //用位元組輸入儲存檔案
        InputStream is= new FileInputStream(file);
        //建立位元組陣列
        byte[] buff=new byte[is.available()];
        is.read(buff);

        //在響應新增附加資訊
        resp.addHeader("Content-Disposition", "attachment; filename="+file.getName());
        //產生響應
        //建立位元組輸出流
        OutputStream os=resp.getOutputStream();
        //響應到客戶端
        os.write(buff);
        //重新整理流
        os.flush();
        //關閉流
        os.close();
    }

 

解決檔名是中文名所出現的亂碼問題

//將原來的檔名按照gbk的方式變成位元組,再按iso-8859-1編碼方式變成新的字串
resp.addHeader("Content-Disposition","attachment;filename="+
                new String(file.getName().getBytes("gbk"),"iso-8859-1"));