目錄
1. 核心方法?
2. 關于setStatus(400)與sendError
2.1 setStatus(400)
2.2 sendError
3. setHeader方法
4. 構造重定向響應
4.1? 使用setHeader和setStatus實現重定向
4.2? 使用sendRedirect實現重定向
本專欄已有文章介紹HttpServlet和HttpServletRequest類,文章鏈接如下:
1. 關于HttpServlet類:
【JavaEE】_HttpServlet類-CSDN博客
2. 關于HttpServletRequest類:
【JavaEE】_HttpServletRequest類-CSDN博客
本文介紹第三個類:
HttpServletResponse類;
HttpServletResponse類表示一個響應;
1. 核心方法?
方法 | 描述 |
void setStatus(int sc) | 為該響應設置狀態碼 |
void setHeader(String name, String value) | 設置一個帶有給定的名稱和值的header,如果name已經存在,則覆蓋舊值 |
void addHeader(String name, String value) | 添加一個帶有給定的名稱和值的header,如果name已經存在,不覆蓋舊值,并列添加新的鍵值對 |
void setContentType(String type) | 設置被發送到客戶端的響應的內容類型 |
void setCharacterEncoding(String charset) | 設置被發送到客戶端的響應的字符編碼(MIME字符集),例如UTF-8 |
void sendRedirect(String Location) | 使用指定的重定向URL發送臨時重定向響應到客戶端 |
PrintWriter getWriter() | 用于往body中寫入文本格式數據 |
OutputStream getOutputStream() | 用于往body中寫入二進制格式數據 |
注:1.?可以通過setCharacterEncoding指定響應的編碼格式:
瀏覽器默認不知道程序員的頁面編碼方式,會采取猜測的方式使用字符集進行解析,比如在getParameterServlet.java中將寫回瀏覽器的響應格式寫為:
resp.setContentType("text/html");
resp.getWriter().write("學生id: "+studentId +" 班級id: "+classId);
?此時根據路徑打開瀏覽器頁面,就會出現亂碼:?
為了避免這種情況,我們需要在寫回響應前,顯式指定響應的編碼格式字符集:
resp.setContentType("text/html");resp.setCharacterEncoding("utf-8");resp.getWriter().write("學生id: "+studentId +" 班級id: "+classId);
刷新瀏覽器頁面,有:?
2. 對于后兩個方法,用于構造響應,注意響應的body也是通過流對象來體現的,
對于響應而言,是寫入,需要使用輸出流;
而對于請求,為讀出,使用的是輸入流;
3.對于響應HttpServletResponse,其API都是set系列方法;
對于請求HttpServletRequest,其API都是get系列方法;
2. 關于setStatus(400)與sendError
2.1 setStatus(400)
.java文件內容如下:
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;@WebServlet("/Status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 不顯式書寫200,默認響應狀態碼就是200resp.setStatus(404);}
}
使用Postman構造一個GET請求并發送:
可見響應部分為:
這種寫法并不利于在瀏覽器頁面查看到響應的直接狀態碼設置,可以使用servlet提供的sendError方法,返回默認的錯誤頁面;
2.2 sendError
.java文件內容如下:
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;@WebServlet("/Status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendError(404,"錯誤頁面");}
}
使用Postman發送一個GET請求:
響應如下:
3. setHeader方法
setHeader方法可以向響應中設置一些特殊的header;
以refresh header為例,令瀏覽器頁面每秒刷新一次頁面并顯示時間戳:
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;@WebServlet("/Refresh")
public class RefreshServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("refresh","1");resp.getWriter().write(""+System.currentTimeMillis());}
}
Postman處可以查看到設置的refresh的header:
但postman并不會對其進行處理,可以使用瀏覽器打開目標webapp:
就可以看到頁面每秒更新一個時間戳;
注:并不是精確的1000ms刷新一次,會略多一點(發送請求與返回響應也需要時間);
4. 構造重定向響應
4.1? 使用setHeader和setStatus實現重定向
重定向響應的特點:
(1)狀態碼為3××系列;
(2)header需要有一個Location屬性,描述要跳轉到哪里;
.java文件內容如下:
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;@WebServlet("/Redirect")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(302);resp.setHeader("Location", "https://sogou.com");}
}
輸入127.0.0.1:8080/Servlet/Redirect后回車,隨即頁面跳轉至搜狗主頁:
使用Fiddler抓包,HTTP請求如下:
HTTP響應如下:
4.2? 使用sendRedirect實現重定向
.java文件內容如下:
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;@WebServlet("/Redirect")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("https://sogou.com");}
}
重新啟動服務器驗證即可,同上,此處不再展示結果;