- 接收id,找到用户想要看哪一本书,输出该书的详细信息
String id = request.getParameter("id"); //由于book的id和商品的id是一致的。获取到用户点击的书 Book book = (Book) DB.getAll().get(id); //输出书的详细信息 printWriter.write("书的编号是:" + book.getId()+"<br/>"); printWriter.write("书的名称是:" + book.getName()+"<br/>"); printWriter.write("书的作者是:" + book.getAuthor()+"<br/>");
点击想要的书籍。
得到书籍的详细信息
- 既然用户点击了书籍,那么服务器就应该颁发Cookie给浏览器,记住用户点击了该书籍
- 现在问题来了,Cookie的值应该是什么呢?试想一下,待会还要把浏览过的书籍显示出来,所以用书籍的id是最好不过的。想到了用书籍的id作为Cookie的值,我们还要定义一些规则!
- 我们可能有非常多的书籍,不可能把用户浏览过的书籍都显示出来。所以我们定义只能显示3本浏览过的书籍
- 书籍的id都是数字,如果不做任何修改,存到Cookie里边可能就是231,345,123此类的数字,这样取出某一个id的时候就十分费劲并且后面还要判断该书是否存在Cookie里边了,所以我们要把存储到Cookie的书籍id分割起来。所以我们定义”_“作为分隔符
- 按上面的应用,我们的逻辑应该是:先遍历下Cookie,看下有没有我们想要的Cookie。如果找到想要的Cookie,那就取出Cookie的值
String bookHistory = null; Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { if (cookies[i].getName().equals("bookHistory")) { bookHistory = cookies[i].getValue(); } }
- 取出了Cookie的值也分几种情况
- Cookie的值为null【直接把传入进来的id当做是Cookie的值】
- Cookie的值长度有3个了【把排在最后的id去掉,把传进来的id排在最前边】
- Cookie的值已经包含有传递进来的id了【把已经包含的id先去掉,再把id排在最前面】
- Cookie的值就只有1个或2个,直接把id排在最前边
if (bookHistory == null) { return id; } //如果Cookie的值不是null的,那么就分解Cookie的得到之前的id。 String[] strings = bookHistory.split("\\_"); //为了增删容易并且还要判断id是否存在于该字符串内-----我们使用LinkedList集合装载分解出来的id List list = Arrays.asList(strings); LinkedList<String> linkedList = new LinkedList<>(); linkedList.addAll(list); if (linkedList.contains(id)) { linkedList.remove(id); linkedList.addFirst(id); }else { if (linkedList.size() >= 3) { linkedList.removeLast(); linkedList.addFirst(id); } else { linkedList.addFirst(id); } }
这么折腾完了,我们的Cookie值就在LinkedList集合里边了。接下来,我们要做的就是把集合中的值取出来,拼接成一个字符串
StringBuffer stringBuffer = new StringBuffer(); //遍历LinkedList集合,添加个下划线“_” for (String s : linkedList) { stringBuffer.append(s + "_"); } //最后一个元素后面就不需要下划线了 return stringBuffer.deleteCharAt(stringBuffer.length() - 1).toString();
好的,我们现在已经完成了Cookie值了。接下来设置Cookie的生命周期,回送给浏览器即可
String bookHistory = makeHistory(request, id); Cookie cookie = new Cookie("bookHistory", bookHistory); cookie.setMaxAge(30000); response.addCookie(cookie);
既然我们已经把Cookie回送给浏览器了。那么接下来我们就在首页上获取Cookie的值,显示用户浏览过什么商品就行了!
printWriter.write("您曾经浏览过的商品:"); printWriter.write("<br/>"); //显示用户浏览过的商品 Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { if (cookies[i].getName().equals("bookHistory")) { //获取到的bookHistory是2_3_1之类的 String bookHistory = cookies[i].getValue(); //拆解成每一个id值 String[] ids = bookHistory.split("\\_"); //得到每一个id值 for (String id : ids) { //通过id找到每一本书 Book book = linkedHashMap.get(id); printWriter.write(book.getName()); printWriter.write("<br/>"); } break; } }
好的,我们来试验一下吧!!,第一次访问首页,并没有浏览过的商品
当我点击javaweb书籍再访问首页的时候
再点击ajax然后访问首页
再点击javaweb然后访问首页
点击oracle然后访问首页
- 好的,经过测试,该程序应该没有什么问题了!
如果文章有错的地方欢迎指正,大家互相交流。