1. 程式人生 > >request、response物件

request、response物件

request

request概述: request是Servlet.service()方法的一個引數,型別為javax.servlet.http.HttpServletRequest。在客戶端發出每個請求時,伺服器都會建立一個request物件,並把請求資料封裝到request中,然後在呼叫Servlet.service()方法時傳遞給service()方法,這說明在service()方法中可以通過request物件來獲取請求資料

response

response概述: response是Servlet.service方法的一個引數,型別為javax.servlet.http.HttpServletResponse。在客戶端發出每個請求時,伺服器都會建立一個response物件,並傳入給Servlet.service()方法。response物件是用來對客戶端進行響應的,這說明在service()方法中使用response物件可以完成對客戶端的響應工作

HttpServletResponse的應用

呼叫getOutputStream()方法向瀏覽器輸出資料 呼叫getOutputStream()方法向瀏覽器輸出資料,getOutputStream()方法可以使用print()也可以使用write(),它們有什麼區別呢?

使用servletOutputStream.print()

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取ServletOutputStream流物件
        ServletOutputStream servletOutputStream = resp.getOutputStream();
        //輸出到瀏覽器
        servletOutputStream.print("Hello,World");

    }
}

可以輸出

試著輸出中文,卻出現異常了

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取ServletOutputStream流物件
        ServletOutputStream servletOutputStream = resp.getOutputStream();
        //輸出到瀏覽器
        servletOutputStream.print("你好,世界");
    }
}

異常資訊如下:

<h1>HTTP Status 500 - Not an ISO 8859-1 character: 你</h1>

為什麼會出現異常呢?在io中我們學過,outputStream是輸出二進位制資料的,print()方法接收了一個字串,print()方法要把“中國”改成二進位制資料,Tomcat使用IOS 8859-1編碼對其進行轉換,“你好,世界”根本對ISO 8859-1編碼不支援。所以出現了異常。 使用servletOutputStream.write()

 response.getOutputStream().write("Hello,World".getBytes());

沒有問題,再測試輸出中文

 resp.getOutputStream().write("你好,世界".getBytes());

也沒有問題

為什麼使用write()方法能夠正常向瀏覽器輸出中文呢?"你好,世界".getBytes()這句程式碼在轉成byte[]陣列的時候預設查的是gb2312編碼,而"你好,世界"支援gb2312編碼,所以可以正常顯示出來。

但是,程式要實現通用性,應該使用的是UTF-8編碼,我們在字串轉換成位元組陣列時指定UTF-8編碼,看看會怎麼樣。

resp.getOutputStream().write("你好,世界".getBytes("UTF-8"));

發現也是亂碼 為什麼它變成了亂碼呢? 原因是這樣的:我在向伺服器輸出的中文是UTF-8編碼的,而瀏覽器採用的是GBK,GBK顯示UTF-8的中文資料?沒告訴瀏覽器你要顯示UTF-8編碼時,你要輸出UTF-8不亂碼才怪。既然這這樣. 1、我可以修改程式碼設定輸出編碼是GBK

resp.getOutputStream().write("你好,世界".getBytes("GBK"));

2、也可以去修改瀏覽器的編碼,同樣可以正常顯示中文。

亂碼問題又解決了。可是,很多時候我們都是使用UTF-8的編碼格式,使用UTF-8程式時都要去網頁上改編碼格式嗎?這樣明顯不可能的。

既然HTTP響應有對瀏覽器說明回送資料是什麼型別的訊息頭,那麼HttpServletResponse物件就應該有相對應的方法告訴瀏覽器回送的資料編碼格式是什麼。瀏覽器在顯示資料時,自動把頁面的編碼格式置換成UTF-8,亂碼問題也解決了。

resp.setHeader("Content-Type","text/html;charset=UTF-8");
resp.getOutputStream().write("你好,世界".getBytes("UTF-8"));

Servlet有那麼多方法解決亂碼問題,是不是有一種是最簡便的呢?沒錯!下面這個方法是最簡便的,它不僅設定瀏覽器用UTF-8顯示資料,內部還把中文轉碼的碼錶設定成UTF-8了,也就是說,response.setContentType("text/html;charset=UTF-8");把response.setCharacterEncoding("UTF-8")的事情也幹了!

使用getWriter()顯示中文資料,設定resp.setContentType("text/html;charset=UTF-8");就可以了。

            resp.setContentType("text/html;charset=UTF-8");
            //獲取printWriter物件
            PrintWriter printWriter = resp.getWriter();
            printWriter.write("看完記得點個贊吧");

“掃碼關注“