使用cookie技术实现,缓存最近浏览过详细信息的三本书的书名列表,并进行相应显示

本文主要是介绍使用cookie技术实现,缓存最近浏览过详细信息的三本书的书名列表,并进行相应显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(1)显示书名列表,及最近阅读的最多三本书的书名

public class ShowGoods extends HttpServlet {/*** */private static final long serialVersionUID = 978235855242977508L;@Overrideprotected 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>");}}}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stubsuper.doPost(req, resp);}}

(2)显示书籍的详细信息,并将阅览的书名信息存到cookie中

public class ShowGoodsDetails extends HttpServlet {/*** */private static final long serialVersionUID = -46163301904321918L;@Overrideprotected 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);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stubsuper.doPost(req, resp);}}

出现的问题:

一开始的时候,在原来有cookie的情况下,修改原来cookie内容的时候,使用的是new的方法,然后在显示时,一直只显示初始cookie的key值对应的内容。

       经过查询资料,  Cookie不仅仅有名字和值两个属性,还有域(domain),过期时间(expires),路径(path)等属性。其中,不同的域、不同的路径下可以存在同样名字的cookie。可以推测,相同路径和域下不能存在两个相同key值的cookie,所以,new两次,系统在获取的时候,第二次new的会出现错乱,而导致不能获取正确的cookie内容。

解决方法:采用 cookie 值修改的方式。

这篇关于使用cookie技术实现,缓存最近浏览过详细信息的三本书的书名列表,并进行相应显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081163

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

乐鑫 Matter 技术体验日|快速落地 Matter 产品,引领智能家居生态新发展

随着 Matter 协议的推广和普及,智能家居行业正迎来新的发展机遇,众多厂商纷纷投身于 Matter 产品的研发与验证。然而,开发者普遍面临技术门槛高、认证流程繁琐、生产管理复杂等诸多挑战。  乐鑫信息科技 (688018.SH) 凭借深厚的研发实力与行业洞察力,推出了全面的 Matter 解决方案,包含基于乐鑫 SoC 的 Matter 硬件平台、基于开源 ESP-Matter SDK 的一

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)

转自:http://t.51jdy.cn/thread-259-1-1.html 持久层 是一个项目 后台 最重要的部分。他直接 决定了 数据读写的性能,业务编写的复杂度,数据结构(对象结构)等问题。 因此 架构师在考虑 使用那个持久层框架的时候 要考虑清楚。 选择的 标准: 1,项目的场景。 2,团队的技能掌握情况。 3,开发周期(开发效率)。 传统的 业务系统,通常业

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主