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