web服務器在處理一次請求時會創建一個代表這個請求的HttpServletRequest對象和一個包含響應給瀏覽器信息的HttpServletResponse對象。通過HttpServletResponse對象我們可以設置給瀏覽器的響應內容,響應格式,響應編碼和發起重定向。下面我來介紹一下HttpServletResponse對象是如何向瀏覽器響應數據的。
一、向瀏覽器發送響應頭的相關方法
(1)addDateHeader(String name ,long date):添加一個響應頭,值為date,數據類型是long。
(2)setDateHeader(String name,long date):設置一個響應頭,值為date,數據類型是long。
(3)addHeader(String name,String value):添加一個響應頭,值為value,數據類型是String。
(4)setHeader(String name,String value):設置一個響應頭,值為value,數據類型是String。
(5)addIntHeader(String name,int value):添加一個響應頭,值為value,數據l類性是int。
(6)setIntHeader(String name,int value):設置一個響應頭,值為value,數據類型是int。
下面我們用代碼來設置一下給瀏覽器響應的頭信息:
public class TestResponseServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("content-type", "text/html;charset=UTF-8"); //通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據 response.addHeader("TOKEN",UUID.randomUUID().toString()); response.setIntHeader("Context-Length", 1); //通知客戶端響應內容長度,但是如果存在Transfer-Encoding(重點是chunked),則在header中不能有Content-Length,有也會被忽視 response.setDateHeader("expries", -1L); //設置響應過期時間 PrintWriter writer = response.getWriter(); writer.print("你好!"); writer.flush(); writer.close(); } }
我們可以在瀏覽器的響應頭中看到:
二、負責向瀏覽器發送數據
(1)getOutputStream():該方法用於返回Servlet引擎創建的字節輸出流對象,Servlet程序可以按字節形式輸出響應正文。
(2)getWriter():該方法用於返回Servlet引擎創建的字符輸出流對象,Servlet程序可以按字節形式輸出響應正文。
其實剛才我們已經使用了getWriter()方法在瀏覽器上打印了“你好!”,這里需要注意的地方有兩個:首先是要小心中文的亂碼問題,其次是要注意如果你想要輸入的東西都在瀏覽器上展示就都要轉化為字符串的形式,圖片,視頻等除外。第二個注意點知道即可,我主要說一下如何解決中文的亂碼問題。首先我們需要控制服務端要以utf-8的編碼格式寫入然后在控制瀏覽器端要以utf-8展示,代碼如下:
public class TestResponseServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); //控制服務端以utf-8寫入 response.setHeader("content-type", "text/html;charset=UTF-8"); //通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據 PrintWriter writer = response.getWriter(); writer.print("你好!"); writer.flush(); writer.close(); } }
這樣就可以解決中文亂碼問題了。
三、重定向
重定向的定義:一個web資源收到客戶端請求后,通知客戶端去訪問另外一個web資源,這稱之為請求重定向。在response對象中使用sendRedirect(String serverPath)方法實現重定向其底層使用的response.setStatus(301)和response.setHeader("Location",serverPath)實現,這里301表示的是臨時跳轉。
public class TestResponseServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendRedirect(request.getContextPath()+"/index.jsp"); } }
當我在瀏覽器上輸入:http://localhost:8080/web/response后瀏覽器會重定向到http://localhost:8080/web/index.jsp頁面。