Cookie案例分析
一、案例- 显示用户上次访问的时间
当用户第一次访问该页面的时候提示:你好,你是第一次访问本页面,当前时间为:2016-11-3 22:10:30
第n次访问该页面时:欢迎回来,你上次访问的时间是:2016-11-3 22:10:30,当前时间是:2016-11-3 22:10:30
示例代码:
package com.gqx.cookie; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; 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 Test extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //获取当前时间 SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String time =format.format(new Date()); Cookie cookie =new Cookie("lastTime", time); cookie.setPath("/CookieSession"); cookie.setMaxAge(1*30*24*60*60); response.addCookie(cookie); Cookie[] cookies=request.getCookies(); if (cookies!=null) { response.getWriter().write("<html><body><p>欢迎回来,你上次访问的时间是:"+cookies[0].getValue()+" "+"当前时间是:"+time+"</p></body></html>"); cookie.setValue(time); cookie.setMaxAge(1*30*24*60*60); response.addCookie(cookie); }else { response.getWriter().write("<html><body><p>你是首次访问本网站,当前时间是:"+time+"</p></body></html>"); } } }
二:案例-查看用户浏览器过的商品
要实现浏览记录,同时将最近浏览的商品浏览最近时间排好顺序,同时只要求显示三条记录
思路:由于要求不易实现,逻辑不易理清,我们先建一个web项目,然后建立好分包目录
首先我们建立实体对象,即产品对象,对其进行封装
package com.gqx.entity; public class Product { private String id; private String name; private float price; private String proType; 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 Float getPrice() { return price; } public void setPrice(Float price) { this.price = price; } public String getProType() { return proType; } public void setProType(String proType) { this.proType = proType; } public Product() { super(); // TODO Auto-generated constructor stub } public Product(String id, String name, float price, String proType) { super(); this.id = id; this.name = name; this.price = price; this.proType = proType; } @Override public String toString() { return "Product [id=" + id + ", name=" + name + ", price=" + price + ", proType=" + proType + "]"; } }
然后定义好一个数据访问对象的操作方法的类,里面有我们需要对对象操作的全部方法
package com.gqx.productDao; import java.util.ArrayList; import java.util.List; import com.gqx.entity.Product; /** *该类存放对product的相关操作,如查询、(CRDU) * @author Administrator * */ public class ProductDao { //模拟数据库存放所有商品 private static List<Product> products=new ArrayList<Product>(); //初始化所有产品,用静态代码块完成,只执行一次 static{ for (int i = 1; i < 11; i++) { products.add(new Product("00"+i, "笔记本"+i, 4500+i*100, "厂商"+i)); } } //提供查询所有商品的方法 public List<Product> findAll(){ return this.products; } //根据id去查询某产品 public Product getProduct(String id){ for (Product product:products) { if (product.getId().equals(id)) { return product; } } return null; } }
最后就是我们要访问的servlet了,本案例的重点也在此处
package com.gqxservlet; import java.io.IOException; import java.io.PrintWriter; import java.util.List; 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.gqx.entity.Product; import com.gqx.productDao.ProductDao; public class ListServlet extends HttpServlet { /** * 首页:查询所有商品的servlet */ private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //查询“数据库”,读出所有的商品。 ProductDao dao=new ProductDao(); //对操作对象的实例化 List<Product> products=dao.findAll(); PrintWriter out = response.getWriter(); //把所有的产品显示到浏览器中 String html=""; html+="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"><HTML><HEAD><TITLE>所有商品列表</TITLE></HEAD><BODY>"; html+="<table width='600px' border='1' align='center'>"; html+="<tr><th>编号</th><th>商品名称</th><th>商品类型</th></tr>"; //遍历所有的商品 for(Product product:products){ String path=request.getContextPath()+"/DetailServlet?id="+product.getId(); html+="<tr><td>"+product.getId()+"</td><td>"+product.getName()+"</td><td><a href='"+path+"'>详细信息</a></td></tr>"; } html+=" </table>"; //处理上一次访问的cookie,得到上一次啊访问的数据 String str="</br>"; Cookie[] cookies=request.getCookies(); if (cookies!=null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("proHist")) { str+="你上次浏览的商品是:</br>"; String proHist=cookie.getValue(); String[] ids=proHist.split(","); for (String string : ids) { //查询“数据库”,查询对于的商品 Product p=dao.getProduct(string); //显示在浏览器上 str+=p.getId()+" "+p.getName()+" "+p.getPrice()+"</br>"; } } } }else { str+="<p>你是第一次访问本网站</p>"; } html=html+str; html+="</BODY></HTML>"; out.write(html); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
然后我们来定义内容页,该页记录着cookie,同时对cookie进行更改,然后将其发送给服务器。
package com.gqxservlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.Collection; 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.gqx.entity.Product; import com.gqx.productDao.ProductDao; public class DetailServlet extends HttpServlet { /** * 商品详细信息页面 */ private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); ProductDao products=new ProductDao(); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>商品详细信息</TITLE></HEAD>"); out.println(" <BODY>"); String id=request.getParameter("id"); Product product=products.getProduct(id); //打印出具体的商品信息 String html=""; html+="<table width='300px' border='1' align='center'>"; html+="<tr><th>"+product.getId()+"产品的信息</th></tr>"; html+="<tr><td>商品编号:</td><td>"+product.getId()+"</td><tr><td>商品名称:</td><td>"+product.getName()+"</td></tr><tr><td>商品类型</td><td>"+product.getProType()+"</td></tr><tr><td>商品价格:</td><td>"+product.getPrice()+"</td></tr>"; html+="<center><a href='"+request.getContextPath()+"/ListServlet'>返回上一级</a></center>"; out.print(html); out.println(" </table>"); //设置cookie值 Cookie cookie =new Cookie("proHist", createValue(request,id)); cookie.setMaxAge(30*24*60*60); response.addCookie(cookie); out.println("</BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * 显示以前访问的商品,如何保存其cookie值 * @param request * @return * 当前cookie 传入 id 最终的cookie * 无 1 1 * 1 2 2,1 * 2,1 1 1,2 * 1,2 3 3,1,2 */ private String createValue(HttpServletRequest request,String id) { // TODO Auto-generated method stub Cookie[] cookies=request.getCookies(); String proHist=null; if (cookies!=null) { //如果浏览器端有cookie,则从其中取回cookie值 for (Cookie cookie : cookies) { //查找名为proHist的cookie if (cookie.getName().equals("proHist")) { proHist=cookie.getValue(); } } } //如果cookie为空或者proHist为空,则返回当前id if (cookies==null || proHist==null) { return id; } /** * 剩下的则是对字符串中的cookie值(形如[1,2,3])进行操作,但对仅仅对字符串操作太过于麻烦 * 这个时候我们可以换一种思维,将其转化为集合的形式 在jdk中有一个方法直接将字符串数组转化为list的形式 * static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表。 * 同时Collection又是List的子接口 */ String string[]=proHist.split(","); Collection<String> collection = Arrays.asList(string); /** * 这个时候我们又发现了一个问题,即便是集合,但是对集合的频繁操作太过于麻烦,而且集合缺少一些方便删除添加的操作 * 我们知道对列表的频繁操作,最方便的是linkedlist链接,我们又发现在jdk中有如下的方法,可以方便我们查找 * LinkedList(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列 */ LinkedList list=new LinkedList(collection); if (list.size()<3) { //首先判断该cookie值是否超过三个 if (list.contains(id)) { //当cookie值中重复 (id=1 cookie=2,1) list.remove(id); list.addFirst(id); }else { list.addFirst(id); } }else { //其次判断该cookie值若超过三个 if (list.contains(id)) { //当cookie值中重复 (id=1 cookie=2,1,3) list.remove(id); list.addFirst(id); }else { //不重复,去掉最后一个,将id加到第一个去 list.removeLast(); list.addFirst(id); } } //将集合转化为字符串 String valueString=""; for (Object object : list) { valueString+=object+","; } //去掉多余的逗号 valueString=valueString.substring(0, valueString.length()-1); return valueString; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
以上将字符做的操作十分的值得借鉴,其中linkedList是一个功能很强大的链表对象,而Collection又是一个不错的方法去将字符串数组转化为集合。
String string[]=proHist.split(","); Collection<String> collection = Arrays.asList(string);
很希望自己是一棵树,守静、向光、安然,敏感的神经末梢,触着流云和微风,窃窃的欢喜。脚下踩着最卑贱的泥,很踏实。还有,每一天都在隐秘成长。