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

  当用户第一次访问该页面的时候提示:你好,你是第一次访问本页面,当前时间为: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. 第一个CUDA程序

    开始学CUDA 先写一个简单的 #include<iostream>__global__ void add( int a, int b, int *c ) { *c = a + b;}in ...

  2. Windows使用Apache2配置Git服务器

    Windows使用Apache2配置Git服务器 本文地址:http://www.cnblogs.com/cnscoo/p/3373095.html Git下载: 网站:https://code.go ...

  3. vs15

    vs15 preview5 离线安装包 vs15 preview5 离线安装包   1.介绍 vs15是微软打造的新一代IDE,全新的安装方式.官网介绍如下(https://blogs.msdn.mi ...

  4. 【产品体验】喵街&飞凡

    最近O2O很火啊,我也来找几个O2O产品体验下~~~ 阿里今年5月30号上线了一款线下逛街App——喵街,号称消费者的逛街神器.阿里去年已经与银泰合作一年,探索互联网和传统实体零售合作之路,这次则免费 ...

  5. IE8下String的Trim()方法失效的解决方法

    String的Trim()方法失效,在ie8下是有这样的情况的,解决方法也很简单使用$.trim(str)即可,需要的朋友可以了解下 用jquery的trim()方法,$.trim(str)就可以了.

  6. Linux用户环境变量

    Linux用户环境变量 环境变量就是系统或软件设置的一些参数,用户环境变量就是用户登录系统后,都有自已专用的运行环境.在Windows系统中用户环境变量保存在用户家目录,Linux也是同样的.本文主要 ...

  7. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  8. Eclipse怎样导入github上的项目

    国外有些比较好的源代码网站,经常需要从这些网站上导入项目到eclipse中,我最近就发现github.com这个网站上有很多开源项目.这里就以从github网站上导入项目到eclipse中为例来详细的 ...

  9. [转贴]从零开始学C++之STL(一):STL六大组件简介

    一.STL简介 (一).泛型程序设计 泛型编程(generic programming) 将程序写得尽可能通用 将算法从数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 (二 ...

  10. ListView getView中放置多个item和getItemViewType的用法

    ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果我们 ...