1、轉發和重定向 HttpServletResponse response 轉發: RequestDispatcher dispatcher = request.getRequestDispatcher("/secondServlet"); request.setAttribute("pwd","123");//這里設置的值在secondServlet中可以獲取到
dispatcher.forward(request, response);//調用forward方法時會調用secondServlet中的doGet方法
//等到forward方法執行完畢后才會執行下面的代碼 System.out.println("secondServlet執行完了"); 重定向: String url = "http://www.baidu.com"; response.sendRedirect(url); * 對比 * 何時使用 * 重定向:可以指定當前web項目的URL,也可以指定其他web資源 * 轉發:只能指定當前的web項目URL * 確定使用 * 重定向:在第一次請求中設置值,在重定向后不能獲取。兩次請求,tomcat創建了兩個request * 完成跳轉功能,選重定向 * 轉發:設置的值可以在其他servlet或資源中使用。 * 多個servlet需要傳遞數據時,用轉發。 * 總結: * 請求次數 * 重定向:請求2次,tomcat創建了兩個request對象 * 轉發:請求1次,tomcat創建了2個request對象 * 將第一個request中的內容,拷貝給第二個request。值相同 * 瀏覽器地址欄是否修改 * 重定向:修改,看到跳轉后頁面的內容 * 轉發:沒有修改,看到的轉發后最后一個servlet響應的內容 * request設置的值,是否共享 * 重定向:數據不共享 * 轉發:數據共享 2、會話:當訪問web資源之后,通過連接繼續請求當前站點的資源,然后關閉瀏覽器的整個過程。 * 會話技術:cookie、session * cookie: * request.getCookies();獲得當前web項目的所有的cookie信息
Cookie[] cookies = request.getCookies(); if(cookies!=null){ for(Cookie c : cookies){ System.out.println(c.getName()+":"+c.getValue()); } } Cookie cookie = new Cookie("aa","aavalue"); cookie.setMaxAge(60*60*24);//單位是秒
cookie.setPath("/demo/"); response.addCookie(cookie); * 通過setPath可以設置cookie的訪問路徑 * 在cookie中存放中文 * 編碼:String returnData = URLEncoder.encode(data, "UTF-8"); * 解碼:String value = URLDecoder.decode(c.getValue(), "UTF-8"); * cookie的value可以設置多少個字符:4kb * session:服務器在服務器端創建一個內存區域,用來存放當前用戶的所有信息,通過cookie關聯。 * 前提:必須使用cookie * session: * tomcat創建 * 銷毀:30分鍾 //獲得session對象 HttpSession session = request.getSession(); //保存值 session.setAttribute("number", "abcd"); //獲得保存的值number String number = (String)session.getAttribute("number"); //移除值number session.removeAttribute("number"); * URL重寫 * 一般情況選擇encodeURL * 兩個方法區別在於,如果參數為空字符串,返回結果不同。 public String encodeURL(String url) { String absolute = toAbsolute(url); if (isEncodeable(absolute)) { // W3c spec clearly said if (url.equalsIgnoreCase("")){ //**** url = absolute; } return (toEncoded(url, request.getSessionInternal().getIdInternal())); } else { return (url); } } public String encodeRedirectURL(String url) { if (isEncodeable(toAbsolute(url))) { return (toEncoded(url, request.getSessionInternal().getIdInternal())); } else { return (url); } } * 注意:參數url必須有效,否則返回沒有改變的URL * 當使用"/"開頭,相對於web站點 * response.encodeURL("/day07/urlSessionServlet2")//如果需要sessionid,則在地址中追加 * /day07/urlSessionServlet2;jsessionid=F85DB5EFDDB9A6B170AF2B4959EFC4FC
* 獲得Web的絕對路徑 String absolute = toAbsolute(url); * http://localhost:8080/day07/ * 總結: * 需要考慮用戶的Cookie是否禁用了 * 將所有的鏈接全部進行URL重寫(過濾器) 3.驗證碼實例 GetImageServlet.java package com.yxl.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class GetImageServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲得一張圖片 // 創建圖片 -- 在內存中 int width = 80; int height = 40; BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); // 創建圖層,獲得畫板 Graphics g = image.getGraphics(); // 確定畫筆顏色 g.setColor(Color.BLACK); // 填充一個矩形 g.fillRect(0, 0, width, height); // 只需要一個邊框 // 設置顏色 g.setColor(Color.WHITE); // 填充一個矩形 g.fillRect(1, 1, width - 2, height - 2); // 填充字符 String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 設置字體 g.setFont(new Font("宋體", Font.BOLD, 30)); // 緩存隨機生成的字符 StringBuffer buf = new StringBuffer(); // 隨機獲得4個字符 Random random = new Random(); for (int i = 0; i < 4; i++) {
// 設置隨機顏色 g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); // 獲得一個隨機字符 int index = random.nextInt(62); // 截取字符串 String str = data.substring(index, index + 1); // [)
// 需要將隨機的字符,寫到圖片中 g.drawString(str, 20 * i, 30); // 緩存 buf.append(str); } // 將獲得隨機字符串,保存到session // * 獲得session HttpSession session = request.getSession(); // * 保存值 session.setAttribute("number", buf.toString()); // 干擾線 for (int i = 0; i < 10; i++) {
// 設置隨機顏色 g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); // 隨機畫直線 g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } /** * <extension>jpg</extension> <mime-type>image/jpeg</mime-type> */ // 通知瀏覽器發送的數據時一張圖片 response.setContentType("image/jpeg"); // 將圖片發送給瀏覽器 ImageIO.write(image, "jpg", response.getOutputStream()); } } LoginServlet.java package com.yxl.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 獲得用戶提交的數據 imageNumber String imageNumber = request.getParameter("imageNumber"); // 需要判斷 從session獲得保存的驗證碼的信息 // * 獲得session HttpSession session = request.getSession(); // * 獲得保存的值number String number = (String) session.getAttribute("number"); PrintWriter out = response.getWriter(); // 匹配 用戶提交的數據與程序保存的數據 if (number != null) { // 程序保存 if (number.equalsIgnoreCase(imageNumber)) { // 輸入正確 out.print("驗證通過"); } else { // 驗證碼錯誤 out.print("驗證碼錯誤"); } // 無論情況,程序存儲的數據,只能使用一次 session.removeAttribute("number"); } else { out.print("驗證碼失效"); } } } 在WebRoot新建login.html頁面 <!DOCTYPE html> <html> <head> <title>1.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body> <form action="/20141123/loginServlet" method="post"> <input type="text" name="imageNumber" /> <img src="/20141123/getImageServlet"/> <br/> <input type="submit"/> </form> </body> </html> 4.URLConnection使用(下載網頁) package com.yxl.demo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.Scanner; public class UrlConnectionDemo { public static void main(String[] args) throws IOException { // URL類對web資源的定位 URL url = new URL("http://localhost:8080/20141123/login.html"); // 獲得連接 ,做准備 URLConnection conn = url.openConnection(); // 必須確定當前請求,是否可以讀寫 conn.setDoInput(true); // 確定是否可以讀,默認是true
conn.setDoOutput(true);// 確定是否可以寫,默認是false
// 准備發送的數據 -- request填充 OutputStream out = conn.getOutputStream(); // out.write("user=abcd1234".getBytes()); //此方法將內容寫到http請求體中
// 連接 // conn.connect(); // 建立鏈接之后,獲得web資源 InputStream is = conn.getInputStream(); // 會自動鏈接,只有調用方法,整個請求才生效
// byte[] buf = new byte[1024]; // int len = -1; // while( (len = is.read(buf)) > -1 ){ // String str = new String(buf,0,len); // System.out.println(str); // } Scanner scanner = new Scanner(is); while (scanner.hasNext()) { System.out.println("url -->" + scanner.nextLine()); } is.close(); } }