Response响应方法详解
生活随笔
收集整理的這篇文章主要介紹了
Response响应方法详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Response:
- 響應:服務器把請求的處理結果告知客戶端。在B/S架構中,響應就是把結果帶回瀏覽器。
- 響應對象:在項目中用于發送響應的對象
常用狀態碼:
| 200 | 執行成功 |
| 302 | 它和307一樣,都是用于重定向的狀態碼。只是307目前已不再使用 |
| 304 | 請求資源未改變,使用緩存。 |
| 400 | 請求錯誤。最常見的就是請求參數有問題 |
| 404 | 請求資源未找到 |
| 405 | 請求方式不被支持 |
| 500 | 服務器運行內部錯誤 |
狀態碼首位含義:
| 1xx | 消息 |
| 2xx | 成功 |
| 3xx | 重定向 |
| 4xx | 客戶端錯誤 |
| 5xx | 服務器錯誤 |
字節流響應消息&亂碼:
| ServletOutputStream | getOutputStream() | 獲取響應字節輸出流對象 |
| void | setContentType(“text/html;charset=UTF-8”) | 設置響應內容類型,解決中文亂碼 |
演示:
@WebServlet("/ResponseDemo01") public class ResponseDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// setContentType:相當于告訴瀏覽器你要使用這個編碼才能解析我的內容resp.setContentType("text/html;charset=UTF-8");// getOutputStream() 獲取響應字節輸出流對象ServletOutputStream ops = resp.getOutputStream();// 定義消息String s = "測試會不會亂碼";/**為什么有的時候沒有處理亂碼,但是瀏覽器不會亂碼getBytes:在字符串轉成字節的時候,如果沒有傳遞參數(編碼格式),它會根據系統的編碼轉換,這里的系統是電腦的,比如Windows的默認就是GBK那就會轉換成GBK格式的,如果瀏覽器也是GBK就不會亂碼,但是如果瀏覽器是其它的就會亂碼*/ops.write(s.getBytes("UTF-8"));} }字符流響應消息:
| PrintWriter | getWriter() | 獲取響應字符輸出流對象 |
| void | setContentType(“text/html;charset=UTF-8”) | 設置響應內容類型,解決中文亂碼 |
演示:
@WebServlet("/ResponseDemo02") public class ResponseDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8");// getWriter() 獲取響應字符輸出流對象PrintWriter printWriter = resp.getWriter();String s = "我也呵呵了";printWriter.write(s);} }響應圖片:
步驟:
設置緩存:
對于不經常變化的數據,可以合理設置緩存時間,避免瀏覽器頻繁請求服務器,可以提高效率
| void | setDateHeader(String name,long time) | 設置消息頭添加緩存 |
演示:
如果開啟了緩存是可以在電腦中找到這個緩存文件的,可以看到上次訪問時間和過期時間,到了過期時間才會訪問服務器
@WebServlet("/ResponseDemo04") public class ResponseDemo04 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String s = "我是測試緩存內容";// 設置換緩存1小時,只有第一次請求會請求服務端,后面的請求是走的緩存resp.setDateHeader("Expires", System.currentTimeMillis() + 1 * 60 * 60 * 1000);// 設置編碼格式resp.setContentType("text/html;charset=UTF-8");// 寫出數據resp.getWriter().write(s);System.out.println("再次訪問會走我嗎");} }定時刷新:
過了指定時間,頁面自動跳轉
| void | setHeader(String name,String value) | 設置消息頭定時刷新 |
演示:
@WebServlet("/ResponseDemo05") public class ResponseDemo05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String s = "計算機被黑客竊取,正在讀取數據,讀取完畢自動跳轉";resp.setContentType("text/html; charset=UTF-8");// 寫數據resp.getWriter().write(s);// 定時刷新resp.setHeader("Refresh", "3;URL=/regist.html");} }請求重定向:
請求重定向:客戶端的一次請求到達后,發現要借助其他Servlet實現功能
特點:
- 瀏覽器地址會改變
- 兩次請求
- 請求域對象中不能共享數據
- 可以重定向到其他服務器
實現原理:
- 設置響應狀態碼302
- 設置響應的資源路徑(響應消息頭指定響應到哪里)
重定向和請求轉發用哪一個?
- 需要共享數據就轉發,不需要就重定向
重定向方法:
| void | sendRedirect(String name) | 設置重定向 |
演示:
@WebServlet("/ResponseDemo06") public class ResponseDemo06 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ResponseDemo06執行了");// 設置共享數據req.setAttribute("username","itzhuzhu");// 設置重定向resp.sendRedirect(req.getContextPath()+"/servletDemo15");} @WebServlet("/ResponseDemo07") public class ResponseDemo07 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ResponseDemo07執行了");// 獲取共享數據,這里會丟失共享數據System.out.println(req.getAttribute("username"));}文件下載:
@WebServlet("/ResponseDemo08") public class ResponseDemo08 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 獲取文件路徑String realPath = getServletContext().getRealPath("/img/首頁.png");// 2. 把文件讀到字節輸入流中BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));// 3. 告知瀏覽器,以下載的方式打開(告知瀏覽器下載文件的MIME類型)/**Content-type:消息頭名稱,支持的類型application/octet-stream:消息頭參數,應用的類型為字節流Content-Disposition:消息頭名稱,處理的形式attachment;filename=首頁.jpg:消息頭參數,以附件的形式,指定下載文件名稱*/resp.setHeader("Content-type", "application/octet-stream");resp.setHeader("Content-Disposition", "attachment;filename=首頁.jpg");// 4. 使用響應對象的字節輸出流輸出到瀏覽器上ServletOutputStream os = resp.getOutputStream();byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {os.write(bytes, 0, len);}bis.close();} }Response方法詳解:
總結
以上是生活随笔為你收集整理的Response响应方法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oraoledb.oracle 12c,
- 下一篇: 23根火柴游戏 c语言,23 根火柴游戏