cookie的应用——浏览记录
实体类
package entity;
public class Product {
private String id;
private String proName;
private String proType;
private double price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public String getProType() {
return proType;
}
public void setProType(String proType) {
this.proType = proType;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Product(String id, String proName, String proType, double price) {
super();
this.id = id;
this.proName = proName;
this.proType = proType;
this.price = price;
}
public Product() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Product [id=" + id + ", price=" + price + ", proName="
+ proName + ", proType=" + proType + "]";
}
}
商品列表servlet
package servlet; 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 dao.ProductDao;
import entity.Product;
/*
* 查询所有商品的servlet
*/
public class ListServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html; charset=utf-8"); ProductDao dao = new ProductDao();
List<Product> list = dao.findAll(); //2.把商品显示到浏览器
PrintWriter writer = response.getWriter();
String html = ""; html += "<html>";
html += "<head>";
html += "<title>显示商品列表</title>";
html += "</head>";
html += "<body>";
html += "<table border='1' align='center' width='600px'>";
html += "<tr>";
html += "<th>编号</th><th>商品名称</th><th>商品型号</th><th>商品价格</th>";
html += "</tr>";
//遍历商品
if (list != null) {
for(Product p : list) {
html += "<tr>";
html += "<td>"+p.getId()+"</td>" +
"<td><a href='"+request.getContextPath()+"/DetailServlet?id="+p.getId()+"'>"
+p.getProName()+"</a></td><td>"+p.getProType()+"</td><td>"+p.getPrice()+"</td>";
html += "<tr>";
}
}
html += "</table>"; /**
* 显示浏览过的商品
*/
html += "最近浏览过的商品:<br/>";
Cookie[] cookies = request.getCookies();// 获取cookie对象
if (cookies != null) {
for(Cookie cookie : cookies) {
if (cookie.getName().equals("prodHist")) {
String prodHist = cookie.getValue();
String[] ids = prodHist.split(",");
for (String id : ids) {
//查询数据库,查询对应的商品
Product p = dao.findById(id);
//显示到浏览器
html += "" + p.getId() + " " + p.getProName() + " " + p.getPrice() + "<br/>";
}
}
}
}
html += "</body>";
html += "</html>"; writer.write(html);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }
商品详情
package servlet; 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 dao.ProductDao;
import entity.Product;
/**
* 显示商品详细
* @author Administrator
*
*/
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"); //1.获取编号
String id = request.getParameter("id"); //2.到数据库中查询对应编号的商品
ProductDao dao = new ProductDao();
Product product = dao.findById(id); //3.显示到浏览器
PrintWriter writer = response.getWriter();
String html = ""; html += "<html>";
html += "<head>";
html += "<title>显示商品详细</title>";
html += "</head>";
html += "<body>";
html += "<table border='1' align='center' width='300px'>";
if(product!=null){
html += "<tr><th>编号:</th><td>"+product.getId()+"</td></tr>";
html += "<tr><th>商品名称:</th><td>"+product.getProName()+"</td></tr>";
html += "<tr><th>商品型号:</th><td>"+product.getProType()+"</td></tr>";
html += "<tr><th>商品价格:</th><td>"+product.getPrice()+"</td></tr>";
} html += "</table>";
html += "<center><a href='"+request.getContextPath()+"/ListServlet'>[返回列表]</a></center>";
html += "</body>";
html += "</html>"; writer.write(html); /**
* 创建cookie,并发送
*/
//1.创建cookie
Cookie cookie = new Cookie("prodHist", createValue(request, id));
cookie.setMaxAge(1*60*60);//一个月
//2.发送cookie
response.addCookie(cookie);
} /*
* 生成cookie的值
* 分析:
* 当前cookie值 传入商品id 最终cookie值
* null或没有prodHist 1 1 (算法: 直接返回传入的id )
* 1 2 2,1 (没有重复且小于3个。算法:直接把传入的id放最前面 )
* 2,1 1 1,2(有重复且小于3个。算法:去除重复id,把传入的id放最前面 )
* 3,2,1 2 2,3,1(有重复且3个。算法:去除重复id,把传入的id放最前面)
* 3,2,1 4 4,3,2(没有重复且3个。算法:去最后的id,把传入的id放最前面)
* @return
*/
public String createValue(HttpServletRequest request, String id) {
Cookie[] cookies = request.getCookies();
String prodhist = null; if (cookies != null) {
for(Cookie cookie : cookies) {
if(cookie.getName().equals("prodhist")) {
prodhist = cookie.getValue();
break;
}
}
} // null或没有prodHist
if (cookies == null || prodhist == null) {
// 直接返回传入的id
return id;
} // 3,21 2
//String -> String[] -> Collection :为了方便判断重复id
String[] ids = prodhist.split(",");
Collection<String> colls = Arrays.asList(ids); // LinkedList 方便地操作(增删改元素)集合
// Collection -> LinkedList
LinkedList<String> list = new LinkedList<String>(colls); //不超过3个
if(list.size() < 3) {
if(list.contains(id)) {
//去除重复id,把传入的id放最前面
list.remove(id);
list.addFirst(id);
} else {
//直接把传入的id放最前面
list.addFirst(id);
}
} else {
//等于3个
//id重复
if(list.contains(id)){
//去除重复id,把传入的id放最前面
list.remove(id);
list.addFirst(id);
}else{
//去最后的id,把传入的id放最前面
list.removeLast();
list.addFirst(id);
}
} // LinedList -> String
StringBuffer sb = new StringBuffer();
for (Object obj : list) {
sb.append(obj + ",");
}
//去掉最后的逗号
String result = sb.toString();
result = result.substring(0, result.length()-1); return result;
} }
dao
package dao; import java.util.ArrayList;
import java.util.List; import entity.Product; public class ProductDao { //模拟"数据库",存放所有商品数据
private static List<Product> data = new ArrayList<Product>(); /**
* 初始化商品数据
*/
static {
//只执行一次
for(int i=1; i<=10; i++) {
data.add(new Product("" + i, "笔记本" + i , "LN00" + i,34.0 + i ));
}
} /**
* 提供查询所有商品的方法
*/
public List<Product> findAll() {
return data;
} /**
* 提供根据编号查询商品的方法
*/
public Product findById(String id) {
for (Product p : data) {
if(p.getId().equals(id)) {
return p;
}
}
return null;
}
}
cookie的应用——浏览记录的更多相关文章
- Cookie实现商品浏览记录--方式二:JS实现
使用Cookie实现商品浏览记录:方式二:JS方法实现cookie的获取以及写入.当某一个产品被点击时,触发JS方法.利用JS方法判断一下,此产品是否在浏览记录中.如果不存在,则将产品ID加入到coo ...
- 使用cookie实现打印浏览记录的功能
可以用cookie知识来实现打印浏览记录.这里面用到的思路是将浏览记录以字符串的方式保存到cookie中,当浏览记录增加时,再将其转化为数组. $uri=$_SERVER['REQUEST_URI'] ...
- 使用Cookie保存商品浏览记录
数据流程:页面上是商品列表,点击<a href="productServlet">商品名</a> ==>跳转到自定义的servlet中进行处理,先得到 ...
- destoon系统开发-最新利用浏览器的cookie 做历史浏览记录
注意: 代码 放在要显示的为 (一般放在详情页),注意本教程不入库,直接利用浏览器的 cookie 缓存判断 <!--历史浏览记录 S--> <div class=&quo ...
- Cookie实现商品浏览记录--方式一:Java实现
方式一:Java代码方式实现:此种方式实现思路较为顺畅.难点在于,如何实现将最近浏览的产品显示在最前面:实现方式是借助LinkedList提供的remove()方法,先将此id从列表中移除,然后再借助 ...
- javaWeb 使用cookie显示商品浏览记录
package de.bvb.cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.Date ...
- Cookie中图片的浏览记录与cookie读取servle时路径的设置(文字描述)
public class ShowServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSer ...
- jquery.cookie.js结合asp.net实现最近浏览记录
一.html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- 简单的Cookie记录浏览记录案例
books.jsp 界面 代码 <%@ page contentType="text/html;charset=UTF-8" language="java" ...
随机推荐
- html实现类似excel的复杂表格,及导出到excel
1. excellentexport.js https://github.com/jmaister/excellentexport/tree/2.0.3 2.fiddle example https ...
- Spring Boot中微信全局token的缓存实现
为什么要缓存token? 这里的token指的是微信JSAPI中基础支持的ACCESS_TOKEN,并非网页授权ACCESS_TOKEN.网页授权Token每天的调用次数没有限制,不需要缓存. 接口 ...
- Vue中删除重复上传的文件
上传控件: <el-upload class="upload-demo" :on-change="filesChange"> filesChang ...
- 华为OJ1964-求解立方根(牛顿迭代法)
一.题目描述 描述: 计算一个数字的立方根,不使用库函数. 函数原型double getCubeRoot(double input) 输入: 待求解参数 double类型 输出: 输出参数的立方根,保 ...
- Eclipse离线安装Emmet插件
Eclipse离线安装Emmet插件 近期发现了一个写前端代码很好的一个东西,一个叫做Emmet的工具,这个工具使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,前身就是大 ...
- 洛谷P1328==codevs3716 生活大爆炸版石头剪刀布[NOIP 2014 day1 T1]
P1328 生活大爆炸版石头剪刀布 1.8K通过 2.6K提交 题目提供者2014白永忻 标签模拟NOIp提高组2014 难度普及- 提交该题 讨论 题解 记录 最新讨论 Who can help m ...
- python partial
1 很好记忆 partial的第一个参数是函数,后面都是该函数的参数. 2 特殊的地方 partial第一个参数是函数名,但是第二个参数是另外一个函数名. 比如partial(filter, func ...
- XMU 1040 Schedule 【拓扑排序】
1040: Schedule Time Limit: 500 MS Memory Limit: 64 MBSubmit: 12 Solved: 2[Submit][Status][Web Boar ...
- ADT20 混淆编译
注意:一定要 android代码混淆,整了两天怎么也弄不去来,百度翻遍了也都是怎么配置cfg文件,怎么混淆成功的喜悦,我就气死了,怎么都不成功.真是气死了,不过功夫不负有心人,终究还是弄出来了. 不能 ...
- [NOI 2014] 起床困难综合征
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3668 [算法] 从高位向低位贪心即可 时间复杂度 : O(30N) [代码] #in ...