JavaWeb(二)cookie與session的應用
阿新 • • 發佈:2017-10-08
i++ ren ecc 根據 dom dbo thead .cn ram
前言
前面講了一堆虛的東西,所以這篇我們來介紹一下cookie和session的應用。
一、使用cookie記住用戶名
1.1、思路介紹
1.2、實現代碼
1)LoginServlet
package com.zyh.cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;LoginServletpublic class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String userName= ""; String checked = ""; //得到客戶端保存的cookie數據 Cookie[] cookies = request.getCookies(); //因為第一次的時候沒有cookie,所以不謝cookies!=null的話,空指針異常的。 for (int i = 0; cookies!=null&&i < cookies.length; i++) { if("userName".equals(cookies[i].getName())){ userName= cookies[i].getValue(); checked = "checked=‘checked‘"; } } out.print("<form action=‘"+request.getContextPath()+"/doLoginServlet‘ type=‘post‘>"); out.print("用戶名:<input type=‘text‘ name=‘userName‘ value=‘"+userName+"‘ /><br/>"); out.print("密碼:<input type=‘password‘ name=‘pwd‘ /><br/>"); out.print("記住用戶名:<input type=‘checkbox‘ name=‘remember‘ "+checked+" /><br/>"); out.print("<input type=‘submit‘ value=‘提交‘ /><br/>"); out.print("</form>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
2)DoLoginServlet
package com.zyh.cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DoLoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //獲取表單數據 String userName = request.getParameter("userName"); String pwd = request.getParameter("pwd"); String remember = request.getParameter("remember"); Cookie cookie = new Cookie("userName", userName); //處理業務邏輯 if("faker".equals(userName)&&"123".equals(pwd)){ if(remember!=null){//註意:如果text、password不填為空,而checkbox不填則為null值 cookie.setPath("/"); cookie.setMaxAge(Integer.MAX_VALUE); //設置cookie有效保存時間 }else{ cookie.setMaxAge(0); //刪除cookie } response.addCookie(cookie); //將cookie寫會客戶端 out.print("登錄成功"); }else{ out.print("登錄失敗"); //設置2秒鐘重新登錄 response.setHeader("refresh", "2;url="+request.getContextPath()+"/loginServlet"); } //分發轉向 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }DoLoginServlet
1.3、測試
1)訪問:http://localhost:8080/Web_cookieandsession/loginServlet
輸入faker、123,並且記住用戶名
2)結果
3)因為我的cookie的有效時間設置的是永久,假如我們是過了幾天再次去訪問
二、使用cookie顯示上次瀏覽商品
2.1、思路分析
實現過程
2.2、實現代碼
1)創建一個Book實體類
package com.zyh.domain; public class Book { private String id; private String name; private String price; private String author; public Book(String id, String name, String price, String author) { super(); this.id = id; this.name = name; this.price = price; this.author = author; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", price=" + price + ", author=" + author + "]"; } }Book
2)創建一個工具類用於保存所有圖書:DBUtil
package com.zyh.util; import java.util.HashMap; import java.util.Map; import com.zyh.domain.Book; public class DBUtil { private static Map<String,Book> books = new HashMap<String, Book>(); static{ books.put("1,",new Book("1","揭秘Spring","30","張總工")); books.put("2,",new Book("2","HTTP權威指南","70","劉成龍")); books.put("3,",new Book("3","java核心基礎","20","馬成功")); books.put("4,",new Book("4","linux私房菜","66","鳥叔")); books.put("5,",new Book("5","javaweb入門","30","傑克")); } //得到所有書 public static Map<String,Book> getBooks(){ return books; } /** * 根據id查找指定的書 * @param id * @return */ public static Book findBookById(String id){ return books.get(id); } }DBUtil
3)ShowAllBooksServlet
package com.zyh.history; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zyh.domain.Book; import com.zyh.util.DBUtil; public class ShowAllBooksServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("本網站的書有:<br />"); Map<String, Book> books = DBUtil.getBooks(); for (Map.Entry<String, Book> book : books.entrySet()) { out.write("<a href=‘"+request.getContextPath()+"/showBookDetail?id="+book.getKey()+"‘ target=‘_blank‘>"+book.getValue().getName()+"</a><br />"); } out.println("<hr/>您最近瀏覽過的書有:<br />"); Cookie[] cookies = request.getCookies(); for(int i=0;cookies!=null&&i<cookies.length;i++){ if("historyBookId".equals(cookies[i].getName())){ String value = cookies[i].getValue(); //2-1-3 String[] ids = value.split("-"); for(int j = 0;j<ids.length;j++){ Book book = DBUtil.findBookById(ids[j]); //根據id得到指定的書 out.print(book.getName()+"<br />"); } } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }ShowAllBooksServlet
4)ShowBookDetail
package com.zyh.history; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.LinkedList; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zyh.domain.Book; import com.zyh.util.DBUtil; public class ShowBookDetail extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //顯示圖書詳細信息 //獲取id String id = request.getParameter("id"); Book book = DBUtil.findBookById(id); //out.write(book.toString()); out.print(book); //把當前瀏覽過的書的id寫回到客戶端 String historyBookId = organizedId(id,request); Cookie ck = new Cookie("historyBookId",historyBookId); ck.setPath("/"); ck.setMaxAge(Integer.MAX_VALUE); response.addCookie(ck); } private String organizedId(String id, HttpServletRequest request) { //獲取客戶端的cookie Cookie[] cookies = request.getCookies(); if(cookies==null){ return id; } //查找有沒有一個name叫historyBookId的cookie Cookie historyBook = null; for (int i = 0; i < cookies.length; i++) { if("historyBookId".equals(cookies[i].getName())){ historyBook = cookies[i]; } } //如果沒有一個historyBookId的cookie,則返回id if(historyBook==null){ return id; } String value = historyBook.getValue(); //1-2-3 String[] values = value.split("-"); LinkedList<String> list = new LinkedList<String>(Arrays.asList(values)); if(list.size()<3){//1 2 if(list.contains(id)){ list.remove(id); //如果包含當前id的值,則刪除這個id } }else{//說明有三本書的id了 list.removeLast(); //把最後一個id刪除 } list.addFirst(id); //最新的書添加到最前面 StringBuffer sb = new StringBuffer(); for(int i=0;i<list.size();i++){ if(i>0){ sb.append("-"); } sb.append(list.get(i)); } // System.out.println(sb); //1-2-3 return sb.toString(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }ShowBookDetail
2.3、測試
1)訪問:http://localhost:8080/Web_cookieandsession/showAllBooksServlet
2)點擊java核心基礎
查看書的詳細信息:
刷新第一個網頁:
這裏最多就能顯示最近瀏覽過的3本書
三、session實現簡單的購物車功能
3.1、思路分析
3.2、實現代碼
1)需要前面寫的Book的實體類,和存儲書的工具類DBUtil
2)ShowAllBooksSession
package com.zyh.sessioncart; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zyh.domain.Book; import com.zyh.util.DBUtil; public class ShowAllBooksSession extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("本網站有以下好書:<br />"); Map<String, Book> books = DBUtil.getBooks(); for(Map.Entry<String, Book> book :books.entrySet()){ out.print("<a href=‘"+request.getContextPath()+"/addCart?id="+book.getKey()+"‘>"+book.getValue().getName()+"</a><br />"); } out.print("<a href=‘"+request.getContextPath()+"/showCart‘>查看購物車</a>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }ShowAllBooksSession
3)AddCart
package com.zyh.sessioncart; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.zyh.domain.Book; import com.zyh.util.DBUtil; public class AddCart extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //根據id得到書 String id = request.getParameter("id"); Book book = DBUtil.findBookById(id); //得到session對象 HttpSession session = request.getSession(); //從session當中取出list(購物車) List<Book> list = (List<Book>) session.getAttribute("cart"); if(list==null){ list = new ArrayList<Book>(); } list.add(book); session.setAttribute("cart", list); //把list放回到session域當中 out.print("購買成功!2秒鐘跳回"); response.setHeader("refresh", "2;url="+request.getContextPath()+"/showAllBooksSession"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }AddCart
4)ShowCart
package com.zyh.sessioncart; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.zyh.domain.Book; public class ShowCart extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("購物車有以下商品:<br />"); //得到session對象 HttpSession session = request.getSession(); List<Book> books = (List<Book>) session.getAttribute("cart"); if(books==null){ out.print("你什麽都沒有買"); //這樣設置的話,上面還沒有看到就直接跳轉了 // response.sendRedirect(request.getContextPath()+"/showAllBooksSession"); response.setHeader("refresh", "2;url="+request.getContextPath()+"/showAllBooksSession"); return; //如果沒有買執行下面的會出現空指針 } for(Book book:books){ out.write(book.getName()+"<br />"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }ShowCart
3.3、測試
1)訪問:http://localhost:8080/Web_cookieandsession/showAllBooksSession
2)點擊java核心基礎,2秒自動跳轉回去
3)查看購物車
JavaWeb(二)cookie與session的應用