一、案例- 显示用户上次访问的时间

  当用户第一次访问该页面的时候提示:你好,你是第一次访问本页面,当前时间为:2016-11-3 22:10:30

  第n次访问该页面时:欢迎回来,你上次访问的时间是:2016-11-3 22:10:30,当前时间是:2016-11-3 22:10:30

示例代码:

package com.gqx.cookie;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Test 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");
//获取当前时间
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time =format.format(new Date());
Cookie cookie =new Cookie("lastTime", time);
cookie.setPath("/CookieSession");
cookie.setMaxAge(1*30*24*60*60);
response.addCookie(cookie); Cookie[] cookies=request.getCookies();
if (cookies!=null) {
response.getWriter().write("<html><body><p>欢迎回来,你上次访问的时间是:"+cookies[0].getValue()+" "+"当前时间是:"+time+"</p></body></html>");
cookie.setValue(time);
cookie.setMaxAge(1*30*24*60*60);
response.addCookie(cookie);
}else {
response.getWriter().write("<html><body><p>你是首次访问本网站,当前时间是:"+time+"</p></body></html>");
}
} }

  


二:案例-查看用户浏览器过的商品

要实现浏览记录,同时将最近浏览的商品浏览最近时间排好顺序,同时只要求显示三条记录

思路:由于要求不易实现,逻辑不易理清,我们先建一个web项目,然后建立好分包目录

首先我们建立实体对象,即产品对象,对其进行封装

package com.gqx.entity;

public class Product {
private String id;
private String name;
private float price;
private String proType;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getProType() {
return proType;
}
public void setProType(String proType) {
this.proType = proType;
} public Product() {
super();
// TODO Auto-generated constructor stub
}
public Product(String id, String name, float price, String proType) {
super();
this.id = id;
this.name = name;
this.price = price;
this.proType = proType;
}
@Override
public String toString() {
return "Product [id=" + id + ", name=" + name + ", price=" + price
+ ", proType=" + proType + "]";
} }

然后定义好一个数据访问对象的操作方法的类,里面有我们需要对对象操作的全部方法

package com.gqx.productDao;

import java.util.ArrayList;
import java.util.List; import com.gqx.entity.Product; /**
*该类存放对product的相关操作,如查询、(CRDU)
* @author Administrator
*
*/
public class ProductDao {
//模拟数据库存放所有商品
private static List<Product> products=new ArrayList<Product>();
//初始化所有产品,用静态代码块完成,只执行一次
static{
for (int i = 1; i < 11; i++) {
products.add(new Product("00"+i, "笔记本"+i, 4500+i*100, "厂商"+i));
}
} //提供查询所有商品的方法
public List<Product> findAll(){
return this.products;
} //根据id去查询某产品
public Product getProduct(String id){
for (Product product:products) {
if (product.getId().equals(id)) {
return product;
}
}
return null;
} }

最后就是我们要访问的servlet了,本案例的重点也在此处

package com.gqxservlet;

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 com.gqx.entity.Product;
import com.gqx.productDao.ProductDao; public class ListServlet extends HttpServlet { /**
* 首页:查询所有商品的servlet
*/
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
//查询“数据库”,读出所有的商品。
ProductDao dao=new ProductDao(); //对操作对象的实例化
List<Product> products=dao.findAll(); PrintWriter out = response.getWriter(); //把所有的产品显示到浏览器中
String html="";
html+="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"><HTML><HEAD><TITLE>所有商品列表</TITLE></HEAD><BODY>";
html+="<table width='600px' border='1' align='center'>";
html+="<tr><th>编号</th><th>商品名称</th><th>商品类型</th></tr>";
//遍历所有的商品
for(Product product:products){
String path=request.getContextPath()+"/DetailServlet?id="+product.getId();
html+="<tr><td>"+product.getId()+"</td><td>"+product.getName()+"</td><td><a href='"+path+"'>详细信息</a></td></tr>";
}
html+=" </table>"; //处理上一次访问的cookie,得到上一次啊访问的数据
String str="</br>";
Cookie[] cookies=request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("proHist")) {
str+="你上次浏览的商品是:</br>";
String proHist=cookie.getValue();
String[] ids=proHist.split(",");
for (String string : ids) {
//查询“数据库”,查询对于的商品
Product p=dao.getProduct(string);
//显示在浏览器上
str+=p.getId()+"  "+p.getName()+"  "+p.getPrice()+"</br>";
}
}
}
}else {
str+="<p>你是第一次访问本网站</p>";
} html=html+str;
html+="</BODY></HTML>";
out.write(html);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

 然后我们来定义内容页,该页记录着cookie,同时对cookie进行更改,然后将其发送给服务器。

package com.gqxservlet;

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 com.gqx.entity.Product;
import com.gqx.productDao.ProductDao; 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");
ProductDao products=new ProductDao();
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>商品详细信息</TITLE></HEAD>");
out.println(" <BODY>");
String id=request.getParameter("id");
Product product=products.getProduct(id);
//打印出具体的商品信息
String html="";
html+="<table width='300px' border='1' align='center'>";
html+="<tr><th>"+product.getId()+"产品的信息</th></tr>";
html+="<tr><td>商品编号:</td><td>"+product.getId()+"</td><tr><td>商品名称:</td><td>"+product.getName()+"</td></tr><tr><td>商品类型</td><td>"+product.getProType()+"</td></tr><tr><td>商品价格:</td><td>"+product.getPrice()+"</td></tr>";
html+="<center><a href='"+request.getContextPath()+"/ListServlet'>返回上一级</a></center>";
out.print(html);
out.println(" </table>"); //设置cookie值
Cookie cookie =new Cookie("proHist", createValue(request,id));
cookie.setMaxAge(30*24*60*60);
response.addCookie(cookie);
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
} /**
* 显示以前访问的商品,如何保存其cookie值
* @param request
* @return
* 当前cookie 传入 id 最终的cookie
* 无 1 1
* 1 2 2,1
* 2,1 1 1,2
* 1,2 3 3,1,2
*/ private String createValue(HttpServletRequest request,String id) {
// TODO Auto-generated method stub
Cookie[] cookies=request.getCookies();
String proHist=null; if (cookies!=null) {
//如果浏览器端有cookie,则从其中取回cookie值
for (Cookie cookie : cookies) {
//查找名为proHist的cookie
if (cookie.getName().equals("proHist")) {
proHist=cookie.getValue();
}
}
} //如果cookie为空或者proHist为空,则返回当前id
if (cookies==null || proHist==null) {
return id;
} /**
* 剩下的则是对字符串中的cookie值(形如[1,2,3])进行操作,但对仅仅对字符串操作太过于麻烦
* 这个时候我们可以换一种思维,将其转化为集合的形式 在jdk中有一个方法直接将字符串数组转化为list的形式
* static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表。
* 同时Collection又是List的子接口
*/
String string[]=proHist.split(",");
Collection<String> collection = Arrays.asList(string); /**
* 这个时候我们又发现了一个问题,即便是集合,但是对集合的频繁操作太过于麻烦,而且集合缺少一些方便删除添加的操作
* 我们知道对列表的频繁操作,最方便的是linkedlist链接,我们又发现在jdk中有如下的方法,可以方便我们查找
* LinkedList(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列
*/ LinkedList list=new LinkedList(collection); if (list.size()<3) {
//首先判断该cookie值是否超过三个
if (list.contains(id)) {
//当cookie值中重复 (id=1 cookie=2,1)
list.remove(id);
list.addFirst(id);
}else {
list.addFirst(id);
}
}else {
//其次判断该cookie值若超过三个
if (list.contains(id)) {
//当cookie值中重复 (id=1 cookie=2,1,3)
list.remove(id);
list.addFirst(id);
}else {
//不重复,去掉最后一个,将id加到第一个去
list.removeLast();
list.addFirst(id);
}
} //将集合转化为字符串
String valueString="";
for (Object object : list) {
valueString+=object+",";
} //去掉多余的逗号
valueString=valueString.substring(0, valueString.length()-1);
return valueString;
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

  以上将字符做的操作十分的值得借鉴,其中linkedList是一个功能很强大的链表对象,而Collection又是一个不错的方法去将字符串数组转化为集合。

                String string[]=proHist.split(",");
Collection<String> collection = Arrays.asList(string);

  

Cookie案例分析的更多相关文章

  1. 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析

    使用 AppScan 进行扫描 针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan).执行(Do).检查(check).分析(Ana ...

  2. ENode框架Conference案例分析系列之 - 文章索引

    ENode框架Conference案例分析系列之 - 业务简介 ENode框架Conference案例分析系列之 - 上下文划分和领域建模 ENode框架Conference案例分析系列之 - 架构设 ...

  3. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

  4. CSS3-3D制作案例分析实战

    一.前言 上一节,介绍了基础的CSS3 3D动画原理实现,也举了一个小小的例子来演示,但是有朋友跟我私信说想看看一些关于CSS3 3D的实例,所以在这里为了满足一下大家的需求,同时也为了以后能够更好的 ...

  5. 实时控制软件设计第一周作业-汽车ABS软件系统案例分析

    汽车ABS软件系统案例分析 ABS 通过控制作用于车轮制动分泵上的制动管路压力,使汽车在紧急刹车时车轮不会抱死,这样就能使汽车在紧急制动时仍能保持较好的方向稳定性. ABS系统一般是在普通制动系统基础 ...

  6. 个人作业-Week2 案例分析

    微软必应词典客户端的案例分析 第一部分 调研,评测 1)bug: 运行平台:iOS 10.0.2 必应词典版本:4.2.2 1. bug标题:词库加载错误 bug详细描述:学习界面中的经典词库出国考试 ...

  7. 【MySQL】排序原理与案例分析

    前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...

  8. 个人作业-Week2:案例分析

    截止时间:2016年9月25日24:00. 很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课? 都不对, 软件工程有 ...

  9. ORA-04031错误导致宕机案例分析

    今天遇到一起ORACLE数据库宕机案例,下面是对这起数据库宕机案例的原因进行分析.解读.分析过程中顺便记录一下这个案例的前因后果,攒点经验值,培养一下分析.解决问题的能力. 案例环境:   操作系统 ...

随机推荐

  1. Python Tips and Traps(一)

    1.如果想得到一个列表的index和内容,可以通过enumerate快速实现 drinks = ['coffee','tea', 'milk', 'water'] for index, drink i ...

  2. HDU 4493 Tutor 水题的收获。。

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=4493 题意我都不好意思说,就是求12个数的平均数... 但是之所以发博客,显然有值得发的... 这个题最 ...

  3. matlab学习笔记(一)单元数组

    matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x)  :取最大的整数 ceil(3.18)=4,ceil( ...

  4. LibLinear(SVM包)的MATLAB安装

    LibLinear(SVM包)的MATLAB安装 1 LIBSVM介绍 LIBSVM是众所周知的支持向量机分类工具包(一些支持向量机(SVM)的开源代码库的链接及其简介),运用方便简单,其中的核函数( ...

  5. QLGame 2D Engine编写环境搭建

    QLGame 2D Engine编写 (win7环境搭建) 广州麒麟网络工作室,计划制作一款2d game engine,基于opengl(es)平台,暂时支持android,以后考虑支持linux, ...

  6. 怎么清除SVN密码,以及重置eclipse中svn插件密码

    如何清除SVN密码,以及重置eclipse中svn插件密码? 清除SVN客户端密码方法: 邮件选择TortoiseSVN中的settings选项---Saved Data---右边会发现有个Authe ...

  7. 常用mysql命令(经常更新)

    insert into hr_t_clubschedule(clubid) select clubid from hr_t_clubschedule where id=45;//获取指定数据,并插入数 ...

  8. qt 原子操作 QAtomicInt(++和--都不是原子操作:都包含三条机器指令)

    ++和--都不是原子操作:都包含三条机器指令 http://sroply.blog.163.com/blog/static/17092651920106117251539/

  9. ☀【单位】REM

    CSS3的REM设置字体大小 支持的浏览器还是蛮多的,比如:Mozilla Firefox 3.6+.Apple Safari 5+.Google Chrome.IE9+和Opera11+.只是可怜的 ...

  10. Muduo源码库研究(笔记汇总)

    声明: 本人学习Muduo源码, 有些代码会对其进行精简, 加上本人的一些理解, 所以与作者的代码可能有些不同. 如有理解错误的地方欢指出. Muduo基础库-时间戳类 http://www.cnbl ...