使用cookie技术实现,缓存最近浏览过详细信息的三本书的书名列表,并进行相应显示
2017-08-01 14:54
471 查看
(1)显示书名列表,及最近阅读的最多三本书的书名
(2)显示书籍的详细信息,并将阅览的书名信息存到cookie中
出现的问题:
一开始的时候,在原来有cookie的情况下,修改原来cookie内容的时候,使用的是new的方法,然后在显示时,一直只显示初始cookie的key值对应的内容。
经过查询资料, Cookie不仅仅有名字和值两个属性,还有域(domain),过期时间(expires),路径(path)等属性。其中,不同的域、不同的路径下可以存在同样名字的cookie。可以推测,相同路径和域下不能存在两个相同key值的cookie,所以,new两次,系统在获取的时候,第二次new的会出现错乱,而导致不能获取正确的cookie内容。
解决方法:采用cookie值修改的方式。
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值修改的方式。
相关文章推荐
- Android采用ListView实现数据列表显示2-使用SimpleAdapter进行数据绑定
- JavaWeb的Cookie技术显示历史商品( 信息 )浏览记录(学习方立勋老师的教程)
- 使用XmlDocument将dropdownlist中显示的书名的其它信息读入到相应的文本框中
- 商品浏览系统之商品详细信息显示页面实现
- 问题五-实现详细信息页面(点击列表,预览窗口显示具体信息)
- 使用jquery.cookie.js实现记住用户信息(下面以web的记住登录名和密码为例进行说明)
- 使用XmlDocument将dropdownlist中显示的书名的其它信息读入到相应的文本框中。添加 :删除按钮,修改并保存按钮 和 添加按钮。完成这些按钮所对应的功能(XmlDocument)
- java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息
- 如何使用redis缓存来实现用户最近浏览的商品列表
- Web---Cookie技术(显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放))
- 如何使用redis缓存来实现用户最近浏览的商品列表
- 5使用XmlDocument将dropdownlist中显示的书名的其它信息读入到相应的文本框中。
- 使用cookie技术实现大型网站购物网站的商品浏览记录
- SilverLight商业应用程序开发---学习笔记(9)从摘要信息跳转到详细信息 导航到细节视图 在弹出窗体打开细节视图 使用DataGrid控件的行细节显示特性显示细节内容 主/从视图的实现
- 无线/移动通信的发展终极目标是,实现个人通信PCN是人类通信的最高目标,它指使用各种可能的网络技术,实现任何人在任何时间、任何地点与任何人进行任何何种类的信息交换。
- Web---Cookie技术(显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放))
- 用Cookie实现购物车中只显示最近浏览的五件商品
- Android采用ListView实现数据列表显示1-使用SimpleCursorAdapter进行数据绑定
- Android使用RecyclerView和Picasso实现大规模浏览网络图片(附带缓存技术)
- 使用XmlDocument将dropdownlist中显示的书名的其它信息读入到相应的文本框中