Servlet技術 兩條主線1、HTTP協議 2、Servlet生命周期
init() 方法中參數 ServletConfig 對象使用通過ServletConfig 獲得 ServletContext對象 使用
service方法 含有兩個參數對象 ServletRequest ServletResponse 在實際開發Servlet過程中 不需要覆蓋service ---- HttpServlet 根據請求方式自動調用doGet 或者 doPost doGet和doPost參數 HttpServletRequest 和 HttpServletResponse
今天學習重點:HttpServletRequest HttpServletResponse
客戶端每次請求 都會創建request對象和response對象 ------ 被傳遞service / doGet /doPost
HttpServletRequest封裝 客戶端相關信息,服務器Servlet程序可以通過request對象 操作客戶端信息HttpServletResponse 封裝服務器 向客戶端發送響應數據信息,Servlet程序 通過response對象向客戶端發送響應
response常用 APIsetStatus 設置響應行 當中 狀態碼setHeader 設置響應頭信息getOutputStream 獲得字節流 ---- 輸出響應體內容getWriter 獲得字符流 ---- 輸出響應體內容
* HttpServletResponse 繼承 ServletResponse 接口 ,ServletResponse 并沒有提供與HTTP協議相關API ,HttpServletResponse 添加了與協議相關 API* JavaEE API 中并沒有提供 HttpServletResponse 實現類 ---- 實現類由tomcat服務器提供的
常用狀態碼 : 200 302 304 404 500 200 請求處理成功302 客戶端重定向304 客戶端訪問資源沒有被修改,客戶端訪問本地緩存404 訪問資源不存在500 服務器內部出錯
案例一:通過302 + Location 頭信息實現頁面重定向效果 response.setStatus(302);response.setHeader("Location", "/day06/welcome.html"); // 相對路徑 和 絕對路徑* / 由客戶端定向服務器,代表客戶端 / , 必須添加工程虛擬目錄
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 ServletContext sc = getServletContext(); 4 int time=(Integer)sc.getAttribute("times"); 5 time++; 6 sc.setAttribute("times", time); 7 System.out.xml中設置的訪問虛擬路徑10 response.setHeader("Location", "/day03/count");11 }設置客戶端請求重定向,必須添加工程虛擬目錄
頭信息存在多個值Accept-Encoding: gzip, deflate --- key:value1,value2 response.addHeader 用于設置響應頭有多個值 ------ 不常用 重點:setHeader
在Response API 中提供sendRedirect ---- 完成302+Location重定向效果 例如: response.sendRedirect("/day06/welcome.html");
案例二: 登陸重定向
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 String name = request.getParameter("username"); 4 String passWord = request.getParameter("password"); 5 if (name.equals("admin")&&password.equals("admin")) { 6 // response.setStatus(302); 7 // response.setHeader("Location", "/day04/response/Welcome.html"); 8 response.sendRedirect("/day04/response/Welcome.html"); 9 }else{10 // response.setStatus(302);11 // response.setHeader("Location", "/day04/loggin.html");12 //sendRedirect()它綜合了setStatus(302)+setHeader的效果13 response.sendRedirect("/day04/loggin.html");14 }15 }使用response.sendRedirect實現登錄重定向
案例三: 自動刷新網頁 * 登陸成功,5秒后自動跳轉XX頁面 原理:通過refresh 頭信息 格式 ----- refresh: 時間;url=跳轉路徑例如: refresh:3;url=http://www.itcast.cn -------- 3秒后自動跳轉http://www.itcast.cn 網站
* HTML 頁面中存在一類非常特殊標簽 <meta> ,<meta> 起到設置頭信息作用 <meta content="3;url=/day06/response/demo3/result.html" http-equiv="refresh"> ---- 完成自動跳轉
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <form action="/day04/loggin" method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit" value="登錄"> </form></body></html>loggin.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <meta content="3;url=/day04/loggin.html" http-equiv="refresh"> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6 <title>Insert title here</title> 7 </head> 8 <body> 9 Welcome to loggin ~! 3秒后自動跳轉到登錄頁面....10 </body>11 </html>Welcome.html
1 package com.shellway.response; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class ResponseForLoggin extends HttpServlet {11 12 public void doGet(HttpServletRequest request, HttpServletResponse response)13 throws ServletException, IOException {14 String name = request.getParameter("username");15 String password = request.getParameter("password");16 response.setContentType("text/html;charset=utf-8");17 if (name.equals("admin")&&password.equals("admin")) {18 // response.setStatus(302);19 // response.setHeader("Location", "/day04/response/Welcome.html");20 response.sendRedirect("/day04/response/Welcome.html");21 }else{22 // response.setStatus(302);23 // response.setHeader("Location", "/day04/loggin.html");24 // sendRedirect()它綜合了setStatus(302)+setHeader的效果25 response.getWriter().println("您輸入的帳號和密碼有誤,3秒后將自動跳轉到登錄頁面...");26 response.setHeader("refresh", "3;url=/day04/loggin.html");27 // response.sendRedirect("/day04/response/Error.html");28 }29 }30 31 public void doPost(HttpServletRequest request, HttpServletResponse response)32 throws ServletException, IOException {33 doGet(request, response);34 }35 }ResponseForLoggin
案例四:通過response頭信息設置 瀏覽器禁止緩存原理:和禁用緩存相關頭信息 三個 Cache-Control:no-cacheExpires:Thu, 01 Dec 1994 16:00:00 GMT ----- setDateHeader("expires",-1);Pragma : no-cache
IE 工具---Internet選項 ---常規 --- 設置 --- 查看文件對于Servlet生成HTML頁面,經常需要改變,禁止Servlet動態程序緩存 * 設置Expires時,通常 setDateHeader 為過期時間設置一個毫秒值,生成HTTP響應時,會自動轉換日期字符串表示
1 public class ResponseServlet1 extends HttpServlet { 2 3 public void doGet(HttpServletRequest request, HttpServletResponse response) 4 throws ServletException, IOException { 5 response.setHeader("Cache-Control", "no-cache"); 6 response.setHeader("Pragma", "no-cache"); 7 //response.setHeader("expires", "Thu, 01 Dec 1994 16:00:00 GMT");一般用setDateHeader 8 //通過setDateHeader為expires設置毫秒值,從1970年1月1日 00:00:00毫秒開始 9 response.setDateHeader("expires", -1);//-1就是1970年1月1日前一天最后一秒,表示過期了10 response.getWriter().println("Hello,XXX");11 }12 13 public void doPost(HttpServletRequest request, HttpServletResponse response)14 throws ServletException, IOException {15 doGet(request, response);16 }17 }禁用緩存:ResponseServlet1
---------------------------------------------------------------通過response 生成 客戶端響應體,通過字節流和字符流兩種輸出方式 * 哪些情況用字節流? 哪些情況用字符流 ? 文件拷貝 ---- 字節流 分析文件內容 --- 字符流 (中文操作 字符流)
案例五:輸出中文信息對中文信息進行編碼 response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");
setCharacterEncodig 和 setContentType 區別 ?
結論:開發中只需要使用setContentType 就可以了
注意:1、getOutputStream和getWriter 不能同時使用2、必須在getOutputStream和getWriter 之前 設置響應 編碼 3、getOutputStream和getWriter 輸出內容 是 HTTP響應體 4、getOutputStream和getWriter 存在緩沖區的 ,在service方法結束時,自動關閉流,flush緩沖區內容
案例六 文件下載第一種:通過超鏈接 完成文件下載 * 如果瀏覽器可以識別該文件格式,直接打開,只有鏈接文件瀏覽器不識別文件格式,才會實現下載
第二種:通過Servlet程序實現下載 原理:通過Servlet讀取目標程序,將資源返回客戶端通過程序下載文件 設置兩個頭信息 Content-Type Content-Disposition
response.setContentType(getServletContext().getMimeType(filename)); ---- 設置文件類型 response.setHeader("Content-Disposition", "attachment;filename="+ filename); ---- 設置文件以附件形式下載(對于瀏覽器識別格式文件)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <h1>通過超鏈接下載</h1> <a href="/day04/resourses/2.rar">rar壓縮文件下載</a> <a href="/day04/resourses/1.jpg">圖片下載</a> <h1>通過程序下載</h1> <a href="/day04/download?filename=2.rar">rar壓縮文件下載</a> <a href="/day04/download?filename=1.jpg">圖片下載</a></body></html>download.html
1 package com.shellway.response; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.ServletOutputStream; 9 import javax.servlet.http.HttpServlet;10 import javax.servlet.http.HttpServletRequest;11 import javax.servlet.http.HttpServletResponse;12 13 public class ResponseDownload extends HttpServlet {14 15 public void doGet(HttpServletRequest request, HttpServletResponse response)16 throws ServletException, IOException {17 String filename =request.getParameter("filename");18 //下面這兩句比較固定,第一句根據所給的文件名分析得到文件格式19 response.setContentType(getServletContext().getMimeType(filename));20 //獲得文件格式后,通過消息頭設置文件以附件(attachment)的形式下載21 response.setHeader("Content-Disposition", "attachment;filename="+filename);22 23 String filepath = getServletContext().getRealPath("/resourses/"+filename);24 ServletOutputStream out = response.getOutputStream();25 FileInputStream fileInputStream = new FileInputStream(filepath);26 int len=0;27 while ((len = fileInputStream.read())!=-1) {28 out.write(len);29 }30 fileInputStream.close();31 out.close();32 }33 34 public void doPost(HttpServletRequest request, HttpServletResponse response)35 throws ServletException, IOException {36 37 doGet(request, response);38 39 }40 }ResponseDownload
案例七 驗證碼輸出案例 Java圖形API 生成驗證碼圖片 ----- 了解 為什么需要驗證碼 ?防止有人通過程序惡意攻擊網站 驗證碼為什么是圖片 ?為什么雪花或者干擾線? 常用驗證碼 : 字母和數字
驗證碼旋轉效果 rotate(double theta, double x, double y) ----- 參數 theta 旋轉弧度 2PI 弧度 = 360 角度
-30 ---- 30 角度
驗證碼看不清楚,點擊切換驗證碼 ---- 編寫Javascript程序 方法一:設置驗證碼圖片不緩存方法二:每次訪問使url 不同 ----- url?new Date().getTime() 當前時間
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>Insert title here</title> 6 <script type="text/javascript"> 7 // 重新加載驗證碼圖片 8 // 方法二:如果圖片緩存,注意document后面沒有括號 9 function change(){10 document.getElementById("myimage").src="/day04/response2?"+new Date().getTime();11 }12 </script>13 14 </head>15 <body>16 用戶名: <input type="text" name="username"/><br/>17 密 碼: <input type="password" name="password"/><br/>18 驗證碼: <input type="text" name="check"/> 19 <img src="/day04/response2" onclick="change()" id="myimage" style="cursor: pointer;"/>20 <input type="submit" value="注冊">21 </body>22 </html>register.html
1 package com.shellway.response; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.Graphics2D; 7 import java.awt.image.BufferedImage; 8 import java.io.IOException; 9 import java.util.Random;10 11 import javax.imageio.ImageIO;12 import javax.servlet.ServletException;13 import javax.servlet.http.HttpServlet;14 import javax.servlet.http.HttpServletRequest;15 import javax.servlet.http.HttpServletResponse;16 17 public class ResponseServlet2 extends HttpServlet {18 19 public void doGet(HttpServletRequest request, HttpServletResponse response)20 throws ServletException, IOException {21 // response.setHeader("Cache-Control", "no-cache");22 // response.setDateHeader("Expires", -1);23 // response.setHeader("Pragma", "no-cache");24 25 int width = 120;26 int height = 30;27 // 1、創建一張 內存中緩沖圖片28 BufferedImage bufferedImage = new BufferedImage(width, height,29 BufferedImage.TYPE_INT_RGB);30 31 // 2、背景色32 Graphics graphics = bufferedImage.getGraphics(); // 通過 graphics對象 繪制圖片33 // 設置顏色34 graphics.setColor(Color.YELLOW);35 graphics.fillRect(0, 0, width, height);36 37 // 3、邊框38 graphics.setColor(Color.BLUE);39 graphics.drawRect(0, 0, width - 1, height - 1);40 41 // 4、寫驗證碼內容42 Graphics2D graphics2d = (Graphics2D) bufferedImage.getGraphics();43 graphics2d.setColor(Color.RED);44 // 設置字體45 graphics2d.setFont(new Font("宋體", Font.BOLD, 18));46 // String content =47 // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";48 String content = "/u7684/u4e00/u4e86/u662f/u6211/u4e0d/u5728/u4eba/u4eec/u6709/u6765/u4ed6/u8fd9/u4e0a/u7740/u4e2a/u5730/u5230/u5927/u91cc/u8bf4/u5c31/u53bb/u5b50/u5f97/u4e5f/u548c/u90a3/u8981/u4e0b/u770b/u5929/u65f6/u8fc7/u51fa/u5c0f/u4e48/u8d77/u4f60/u90fd/u628a/u597d/u8fd8/u591a/u6ca1/u4e3a/u53c8/u53ef/u5bb6/u5b66/u53ea/u4ee5/u4e3b/u4f1a/u6837/u5e74/u60f3/u751f/u540c/u8001/u4e2d/u5341/u4ece/u81ea/u9762/u524d/u5934/u9053/u5b83/u540e/u7136/u8d70/u5f88/u50cf/u89c1/u4e24/u7528/u5979/u56fd/u52a8/u8fdb/u6210/u56de/u4ec0/u8fb9/u4f5c/u5bf9/u5f00/u800c/u5df1/u4e9b/u73b0/u5c71/u6c11/u5019/u7ecf/u53d1/u5de5/u5411/u4e8b/u547d/u7ed9/u957f/u6c34/u51e0/u4e49/u4e09/u58f0/u4e8e/u9ad8/u624b/u77e5/u7406/u773c/u5fd7/u70b9/u5fc3/u6218/u4e8c/u95ee/u4f46/u8eab/u65b9/u5b9e/u5403/u505a/u53eb/u5f53/u4f4f/u542c/u9769/u6253/u5462/u771f/u5168/u624d/u56db/u5df2/u6240/u654c/u4e4b/u6700/u5149/u4ea7/u60c5/u8def/u5206/u603b/u6761/u767d/u8bdd/u4e1c/u5e2d/u6b21/u4eb2/u5982/u88ab/u82b1/u53e3/u653e/u513f/u5e38/u6c14/u4e94/u7b2c/u4f7f/u5199/u519b/u5427/u6587/u8fd0/u518d/u679c/u600e/u5b9a/u8bb8/u5feb/u660e/u884c/u56e0/u522b/u98de/u5916/u6811/u7269/u6d3b/u90e8/u95e8/u65e0/u5f80/u8239/u671b/u65b0/u5e26/u961f/u5148/u529b/u5b8c/u5374/u7ad9/u4ee3/u5458/u673a/u66f4/u4e5d/u60a8/u6bcf/u98ce/u7ea7/u8ddf/u7b11/u554a/u5b69/u4e07/u5c11/u76f4/u610f/u591c/u6bd4/u9636/u8fde/u8f66/u91cd/u4fbf/u6597/u9a6c/u54ea/u5316/u592a/u6307/u53d8/u793e/u4f3c/u58eb/u8005/u5e72/u77f3/u6ee1/u65e5/u51b3/u767e/u539f/u62ff/u7fa4/u7a76/u5404/u516d/u672c/u601d/u89e3/u7acb/u6cb3/u6751/u516b/u96be/u65e9/u8bba/u5417/u6839/u5171/u8ba9/u76f8/u7814/u4eca/u5176/u4e66/u5750/u63a5/u5e94/u5173/u4fe1/u89c9/u6b65/u53cd/u5904/u8bb0/u5c06/u5343/u627e/u4e89/u9886/u6216/u5e08/u7ed3/u5757/u8dd1/u8c01/u8349/u8d8a/u5b57/u52a0/u811a/u7d27/u7231/u7b49/u4e60/u9635/u6015/u6708/u9752/u534a/u706b/u6cd5/u9898/u5efa/u8d76/u4f4d/u5531/u6d77/u4e03/u5973/u4efb/u4ef6/u611f/u51c6/u5f20/u56e2/u5c4b/u79bb/u8272/u8138/u7247/u79d1/u5012/u775b/u5229/u4e16/u521a/u4e14/u7531/u9001/u5207/u661f/u5bfc/u665a/u8868/u591f/u6574/u8ba4/u54cd/u96ea/u6d41/u672a/u573a/u8be5/u5e76/u5e95/u6df1/u523b/u5e73/u4f1f/u5fd9/u63d0/u786e/u8fd1/u4eae/u8f7b/u8bb2/u519c/u53e4/u9ed1/u544a/u754c/u62c9/u540d/u5440/u571f/u6e05/u9633/u7167/u529e/u53f2/u6539/u5386/u8f6c/u753b/u9020/u5634/u6b64/u6cbb/u5317/u5fc5/u670d/u96e8/u7a7f/u5185/u8bc6/u9a8c/u4f20/u4e1a/u83dc/u722c/u7761/u5174/u5f62/u91cf/u54b1/u89c2/u82e6/u4f53/u4f17/u901a/u51b2/u5408/u7834/u53cb/u5ea6/u672f/u996d/u516c/u65c1/u623f/u6781/u5357/u67aa/u8bfb/u6c99/u5c81/u7ebf/u91ce/u575a/u7a7a/u6536/u7b97/u81f3/u653f/u57ce/u52b3/u843d/u94b1/u7279/u56f4/u5f1f/u80dc/u6559/u70ed/u5c55/u5305/u6b4c/u7c7b/u6e10/u5f3a/u6570/u4e61/u547c/u6027/u97f3/u7b54/u54e5/u9645/u65e7/u795e/u5ea7/u7ae0/u5e2e/u5566/u53d7/u7cfb/u4ee4/u8df3/u975e/u4f55/u725b/u53d6/u5165/u5cb8/u6562/u6389/u5ffd/u79cd/u88c5/u9876/u6025/u6797/u505c/u606f/u53e5/u533a/u8863/u822c/u62a5/u53f6/u538b/u6162/u53d4/u80cc/u7ec6";49 50 // 內容四個字 --- 隨機從content中抽取四個字51 Random random = new Random();52 int x = 10;53 int y = 20;54 for (int i = 0; i < 4; i++) { // 循環四次55 // 為字 生成旋轉角度 -30 ---- 3056 double jiaodu = random.nextInt(60) - 30;57 // 將旋轉角度 換算弧度58 double theta = jiaodu / 180 * Math.PI;59 60 int index = random.nextInt(content.length());61 char letter = content.charAt(index); // letter 驗證碼內容62 graphics2d.rotate(theta, x, y);63 graphics2d.drawString(letter + "", x, y);64 // 將角度還原65 graphics2d.rotate(-theta, x, y);66 x += 30;67 }68 69 // 5 繪制隨機干擾線70 int x1;71 int x2;72 int y1;73 int y2;74 graphics.setColor(Color.LIGHT_GRAY);75 for (int i = 0; i < 10; i++) {76 x1 = random.nextInt(width);77 x2 = random.nextInt(width);78 y1 = random.nextInt(height);79 y2 = random.nextInt(height);80 // 根據兩點 繪制直線81 graphics.drawLine(x1, y1, x2, y2);82 }83 84 // 內存中資源 釋放85 graphics.dispose();86 87 // 將圖片輸出到 瀏覽器 ImageIO88 // 將內存的圖片 通過 瀏覽器輸出流 寫成 jpg格式圖片89 ImageIO.write(bufferedImage, "jpg", response.getOutputStream());90 91 }92 93 public void doPost(HttpServletRequest request, HttpServletResponse response)94 throws ServletException, IOException {95 96 doGet(request, response);97 98 }99 }生成驗證碼:ResponseServlet2
-----------------------------------------------------------------HttpServletRequest 分為四個部分HttpServletRequest 想比 ServletRequest 添加與協議相關 API1、獲取客戶機信息URI和URL區別url:http://localhost/day06/request1 --- 完整uri:/day06/request1 ---- 部分
URI 包含 URL的 ,URL 一定完成路徑,URI可以相對路徑 http://localhost/day06/request1 是一個URL 同時也是 URI./hello /day06/request1 ---- 都是URI 不是URL
獲得ip : request.getRemoteAddr();
獲得當前訪問資源路徑 : request.getRequestURI().substring(request.getContextPath().length());
2、獲取請求頭信息getHeader 獲得頭信息的值,轉換一個字符串getHeaders 獲得頭信息值 ,獲得EnumerationgetHeaderNames 獲得所有頭信息名稱 返回 Enumeration
* 掌握getHeader使用,遍歷Enumeration 獲得所有頭信息
編寫防盜鏈程序,存在合法referer不是盜鏈,否則控制目標資源無法訪問 !* 通過URL 繞過盜鏈判斷
3、獲取請求參數什么是請求參數? 用戶通過請求提交服務器一些數據 ----- <a href="url?xxx=xxx" >、<form method="get"> 、 <form method="post">/day06/request4?name=zhangsan&city=beijing ---- 包括兩個參數的 name 和 city
常用API四個getParametergetParameterValuesgetParameterNamesgetParameterMap
非空校驗if (username != null && username.trim().length() > 0) {} ----- 短路
亂碼問題post ---- request.setCharacterEncoding("客戶端編碼集");
get亂碼手動解決username = URLEncoder.encode(username, "ISO-8859-1");// 用ISO編碼username = URLDecoder.decode(username, "utf-8"); // 用utf-8解碼簡化上面寫法 : username = new String(username.getBytes("ISO-8859-1"), "utf-8");
get亂碼 配置tomcat默認解碼字符集在tomcat/conf/server.xml Connector中 添加一個屬性 URIEncoding="utf-8"
結論:開發時,盡量不要修改tomcat默認解碼集 ,提交請求請盡量使用post ,如果非要使用get ,手動編碼
問題:http://localhost/day06/servlet?username=zhangsan+lisi在服務器端 通過 request.getParameter("username") 結果是 ??? ----- zhangsan lisi
4、利用請求域傳遞對象HttpServletRequest 和 ServletContext 類似 都是數據域對象 , 以Map方式保持數據區分:存活時間不同 ServletContext對象 服務器啟動對象創建,服務器停止對象銷毀ServletRequest對象 當產生一次請求時 創建,當響應結束后,對象銷毀
通過request轉發請求,request保存數據進行Servlet之間傳遞 ---- 應用?Servlet進行數據處理 --- 生成結果 --- 轉發結果給jsp顯示
注意事項1、在使用forward之前 不能將響應內容傳輸到客戶端情況一 response輸出流執行flush 情況二 同一個Servlet不能連續使用forward 和 redirect2、在執行forward 和 redirect時,清除之前寫入響應流數據 3、ServletContext進行轉發 路徑必須/開始,request進行轉發路徑可以使用相對路徑
轉發和重定向區別1、轉發一次請求、一次響應 重定向 兩次請求 兩次響應2、轉發只能跳轉站內程序,重定向定向任何站點 3、轉發 URL地址不變 ,重定向URL地址改變 4、轉發 對客戶端不可見,重定向對客戶端可見 5、轉發共享同一個Request中數據,重定向兩次請求,不同Request對象,不能共享Request數據
* request.setAttribute 必須和 request.getRequestDispatcher().forward 一起使用
RequestDispatcher 的 include 方法 用來做頁面布局 ------ <%@include%> <jsp:include> 將頁面公共部分抽取出來,通過include 引用到頁面中 ---- 更加方便維護
總結:1、Response 四個必須 API setStatus setHeader getOutputStream getWriter setStatus 狀態碼setHeader 頭信息getOutputStream getWriter 響應體
2、重定向 302 + Location ---- 簡寫 sendRedirect 案例 用戶登錄重定向
3、refresh自動刷新網頁 <meta> 標簽使用
4、禁用瀏覽器緩存 三個頭字段
5、響應中文亂碼 ---- 都使用setContentType
6、文件下載 超鏈接和Servlet程序 Servlet程序 設置兩個頭字段 Content-Type Content-Disposition
7、驗證碼程序 (寫完整存檔)* 驗證碼點擊切換 兩種方法
8、request請求行相關API getRequestURI getContextPath getRemoteAddr getMethod 思考:獲得訪問資源路徑
9、request頭信息獲得(不重要) ---- 掌握防盜鏈案例
10、獲得請求參數 亂碼解決 get 、post (超級重要)
11、轉發共享request數據 、include進行頁面布局 ---- 了解即可
新聞熱點
疑難解答