使用cookie技術實現,快取最近瀏覽過詳細資訊的三本書的書名列表,並進行相應顯示
(1)顯示書名列表,及最近閱讀的最多三本書的書名
public class ShowGoods extends HttpServlet { /** * */ private static final long serialVersionUID = 978235855242977508L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); PrintWriter writer = resp.getWriter(); writer.write("所有的書籍是:"); writer.write("</br>"); for( Entry<String, MyBook> entry: OfferMap.getBookInfo().entrySet()){ writer.write("<a href = '"+req.getContextPath()+"/ShowGoodsDetails?id="+entry.getKey()+"'>"+entry.getValue().getName()+"</a>"); writer.write("</br>"); } writer.write("最近瀏覽的三本書是:"); writer.write("</br>"); Cookie[] cookies = req.getCookies(); if(cookies != null) for(Cookie cookie : cookies){ if("lastVisitBook".equals(cookie.getName()) && cookie.getValue() != null){ String[] ids = cookie.getValue().split(","); for(String id : ids){ writer.write("<a href = '"+req.getContextPath()+"/ShowGoodsDetails?id="+id+"'>"+OfferMap.getBookInfo().get(id).getName()+"</a>"); writer.write("</br>"); } } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doPost(req, resp); } }
(2)顯示書籍的詳細資訊,並將閱覽的書名資訊存到cookie中
public class ShowGoodsDetails extends HttpServlet { /** * */ private static final long serialVersionUID = -46163301904321918L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); LinkedHashMap<String, MyBook> map = OfferMap.getBookInfo(); PrintWriter writer = resp.getWriter(); String id = req.getParameter("id"); if(id != null){ MyBook myBook = map.get(id); writer.write(myBook.getName()+"的詳細資訊是:"); writer.write("</br>"); writer.print("ID是:"+myBook.getId()+"<br/>"); writer.print("書本名是:"+myBook.getName()+"<br/>"); writer.print("書本價格是:"+myBook.getPrice()+"<br/>"); } LinkedList<String> list = new LinkedList<>(); StringBuffer sb = new StringBuffer(); Cookie[] cookies = req.getCookies(); boolean flag = false; if(cookies != null){ for(Cookie cookie : cookies){ if("lastVisitBook".equals(cookie.getName()) && cookie.getValue() != null){ String[] ids = cookie.getValue().split(","); for(String idname : ids){ list.add(idname); } //1、如果list中已經有3個,那麼刪除第一個,(存在一種情況,那就是原先已經有的三個裡,這次又重複點選了,那麼正常情況下,其位置應該需要變動) if(list.size() >= 3){ list.removeFirst(); list.addLast(id); }else { //2、如果list中不足3個,不是最後一個,那麼就放在後邊一個 list.add(id); } for(String name : list){ sb.append(name+","); } flag = true; } } if(flag){ sb = sb.deleteCharAt(sb.length()-1); Cookie[] cookiess = req.getCookies(); for(Cookie cookie : cookiess){ if("lastVisitBook".equals(cookie.getName()) && cookie.getValue() != null){ cookie.setValue(sb.toString()); } } //putCookieToResp(resp,sb.toString()); }else { putCookieToResp(resp,sb.append(id).toString()); } }else { putCookieToResp(resp,sb.append(id).toString()); } } private void putCookieToResp(HttpServletResponse resp, String string) { Cookie cookie = new Cookie("lastVisitBook", string); cookie.setMaxAge(3600*24*30); cookie.setPath("/webAndAjax"); //cookie.setDomain("localhost"); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doPost(req, resp); } }
出現的問題:
一開始的時候,在原來有cookie的情況下,修改原來cookie內容的時候,使用的是new的方法,然後在顯示時,一直只顯示初始cookie的key值對應的內容。
經過查詢資料, Cookie不僅僅有名字和值兩個屬性,還有域(domain),過期時間(expires),路徑(path)等屬性。其中,不同的域、不同的路徑下可以存在同樣名字的cookie。可以推測,相同路徑和域下不能存在兩個相同key值的cookie,所以,new兩次,系統在獲取的時候,第二次new的會出現錯亂,而導致不能獲取正確的cookie內容。
解決方法:採用cookie值修改的方式。