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"));