JavaWeb之商品查看后历史记录代码实现全过程解析。

    历史记录思路图:

        

   假设已经访问了商品 :1-2-3

   那么历史记录就是1-2-3,如果访问了商品8,那么历史记录就是:8-1-2-3,如果再次访问3那么历史记录就是:3-8-1-2。

    当历史记录中存在了商品3,再次访问商品3,将会删除之前的历史记录3,而把当前访问的商品3归为最新访问记录。

    实现过程如下:

点击商品,在商品详情页面中的cookie中生成pid,如果返回再次访问其他商品那么Cookie中的信息就是pid=商品id-商品id,以-作为分隔符,这里可以以逗号作为分隔符。

      

核心代码实现:

      

//获得客户端携带cookie---获得名字是pids的cookie
Cookie[] cookies = request.getCookies();
String pids = pid;
if(cookies!=null) {
for (Cookie cookie : cookies) {
if("pids".equals(cookie.getName())) {
pids=cookie.getValue();
//以-进行分割
String[] split = pids.split("-");
List<String> asList = Arrays.asList(split);
LinkedList<String> list =new LinkedList<String>(asList);
//判断集合中是否存在pid
if(list.contains(pid)) {
//包含当前查看的商品pid
list.remove(pid);
list.addFirst(pid);
}else {
//不包含当前查看商品的pid 直接将该pid放到头上
list.addFirst(pid);
}
//使用StringBuffer存储字符
StringBuffer sb =new StringBuffer(); //遍历集合并且让集合中的内容每次都<7就是每次历史记录最多显示7条数据
for(int i=0;i<list.size()&&i<7;i++) {
sb.append(list.get(i));
sb.append("-");
}
//截除掉最后面的一个-
pids =sb.substring(0,sb.length()-1);
}
}
}
//封装到Cookie中
Cookie cookie_pid = new Cookie("pids", pids);
response.addCookie(cookie_pid);
request.getRequestDispatcher("/product_info.jsp").forward(request, response);

    完成了这个功能之后,下面就是在历史记录中显示商品信息了。

        浏览商品记录模块:

            

首先思路如下:

    从Cookie中寻找pid的值,然后把pid代入数据库查询,然后添加到集合中,然后将历史记录的集合放到域中,最后再用jstl循环调用商品的图片:

    首先Cookie中寻找pid的值,然后把pid代入数据库查询,然后添加到集合中,然后将历史记录的集合放到域中实现代码如下:

        Web层:

    List<Product> historyProductList =new ArrayList<Product>();
Cookie[] cookies = request.getCookies();
if(cookies!=null) {
for (Cookie cookie : cookies) {
if("pids".equals(cookie.getName())) {
String pids=cookie.getValue();
String[] split = pids.split("-");
for (String pid : split) {
Product pro = service.findProductByPid(pid);
historyProductList.add(pro);
}
}
}
}
request.setAttribute("historyProductList", historyProductList);
request.getRequestDispatcher("/product_list.jsp").forward(request, response);

      查看service对象中的findProductByPid方法:

      service层:    

public Product findProductByPid(String pid) {
// TODO Auto-generated method stub
ProductDao dao =new ProductDao();
Product product=null;
try {
product = dao.findProductByPid(pid);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return product;
}

    

    Dao层:

      

public Product findProductByPid(String pid) throws SQLException {
// TODO Auto-generated method stub
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from product where pid=?";
Product product = runner.query(sql, new BeanHandler<Product>(Product.class),pid);
return product;
}

     然后前端view层jstl调用域中的集合信息:

        先引用jstl:

            

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

然后通过jstl显示信息:

          

<c:forEach items="${historyProductList}" var="historyPro">
<li
style="width: 150px; height: 216; float: left; margin: 0 8px 0 0; padding: 0 18px 15px; text-align: center;"><img
src="${pageContext.request.contextPath}/${historyPro.pimage}" width="130px" height="130px" />
</li>
</c:forEach>

最后的代码运行效果图:

    

JavaWeb之商品查看后历史记录代码实现的更多相关文章

  1. JavaWeb -- Cookie应用实例 -- 购物历史记录

    1. 页面一:主页面                                         页面二: 详细显示页面   Demo2 负责页面一, 显示商品清单和历史记录 Demo3负责页面二 ...

  2. 我的Git教程 之 解决 git clone后无代码

    解决 git clone 后无代码 前言:这个教程只适用于像我一样大致理解Git的原理,但是不太记得住Git命令的同学使用.所以具体原理只会提一下,具体可以参见Pro Git. 在另一篇 简明的教程  ...

  3. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  4. java虚拟机jvm启动后java代码层面发生了什么?

    java虚拟机jvm启动后java代码层面发生了什么? 0000 我想验证的事情 java代码在被编译后可以被jdk提供的java命令进行加载和运行, 在我们的程序被运行起来的时候,都发生了什么事情, ...

  5. wpf后置代码中的Grid布局以及图片路径的设置

    之前用Grid练习连连看布局时,遇到了几个困惑.此次就把当时的一些收获写出来,供以后翻看. 图片路径可能比较常用,所以就写在第一个了. 在xaml中,设置图片非常简单,只要把图片拷贝到资源目录(这里假 ...

  6. git 找回 git reset --hard HEAD 后的代码

    下面方法只针对当你本地代码做了 git add 或则 git commit 后又手贱的重置本地代码到上一个版本,导致本地代码丢失的情况. 如果你没有 git add 命令,而直接 git reset ...

  7. 调试查看CLR运行代码

    SOS (Son of Strike)调试扩展可以让我们在调试过程中查看CLR运行代码.SOS.dll随.NET一起安装,对于.NET 4.0来说,SOS.dll的所在位置是:C:\Windows\M ...

  8. script指定src后内部代码无效

    /********** 无效 ***************/ <script type="text/javascript" src=""> fun ...

  9. 只要你用atom修改后保存代码文件的时候,你在chrome上的页面就会自动刷新。

    学习html和css的时候Ctrl+s 以后预览网页需要手动刷新 现在不用了 给chrome安装安装LivePage这个插件. 只要你用atom修改后保存代码文件的时候,你在chrome上的页面就会自 ...

随机推荐

  1. 领域驱动设计(DDD:Domain-Driven Design)

    领域驱动设计(DDD:Domain-Driven Design) Eric Evans的"Domain-Driven Design领域驱动设计"简称DDD,Evans DDD是一套 ...

  2. ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门

    一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...

  3. Windows应急响应常识

    Windows 应急响应 常见事件ID 1102 清理审计日志 4624 账号登陆成功 4625 账号登陆失败 4672 授予特殊权限 4720 创建用户 4726 删除用户 4728 将成员添加到启 ...

  4. 重置Visual Studio 2017的配置

    1,从命令行进入VS 2017安装目录下面的Common7\IDE文件夹. 例如,Windows 10系统中 VS 2017 企业版的默认安装目录如下: C:\Program Files (x86)\ ...

  5. Bootstrap -- 文本,背景,其他样式

    Bootstrap -- 文本,背景,其他样式 1. 文本样式:展示了不同的文本颜色 使用文本样式: <!DOCTYPE html> <html> <head> & ...

  6. iOS Accessibility指南

    开发者经常会为用户开发一些令人充满惊喜的App.但是,开发者真的为每一个潜在的用户都做适配了么?是否每个人都可以真正使用你的APP呢? 设计APP.产品或者任何类型的服务,都要考虑到所有用户,包括视力 ...

  7. Python开发【第三篇】基本数据类型

    整型 int __author__ = 'Tang' # 将字符串转换为数字 a = " b = int(a) # 前面是0的数转换,默认base按照十进制 a = " b = i ...

  8. bootstrapt 使用遇到问题

    1.布局的时候什么时候用xs,sm,md,lg? small grid (≥ 768px) = .col-sm-*, medium grid (≥ 992px) = .col-md-*, large ...

  9. 运行ConnectionDemo时遇到的问题及解决方案

    20175227张雪莹 2018-2019-2 <Java程序设计> 运行ConnectionDemo时遇到的问题及解决方案 老师博客上提供确认数据库连接的代码 import static ...

  10. 洛谷 P1908 逆序对

    \[传送门qwq\] 题目描述 猫猫\(TOM\)和小老鼠\(JERRY\)最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计. 最近,\(TOM\)老猫查阅 ...