package gz.itcast.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() {
super();
// TODO Auto-generated constructor stub
}
public Product(String id, String proName, String proType, double price) {
super();
this.id = id;
this.proName = proName;
this.proType = proType;
this.price = price;
}
@Override
public String toString() {
return "Product [id=" + id + ", proName=" + proName + ", proType="
+ proType + ", price=" + price + "]";
}
}
package gz.itcast.dao;
import gz.itcast.entity.Product;
import java.util.ArrayList;
import java.util.List;
public class ProductDao {
//存放所有的商品数据 模拟“数据库”
private static List<Product> date =new ArrayList<Product>();
//初始化商品数据
static{
//只执行一次
for(int i=1;i<=10;i++){
date.add(new Product(""+i,"笔记本"+i,"LN00"+i,34.0+i));
}
}
//提供查询所有商品的方法
public List<Product> findAll(){
return date;
}
//提供根据编号查询商品的方法
public Product findById(String id){
for(Product p:date){
if(p.getId().equals(id)){
return p;
}
}
return null;
}
}
package gz.itcast.servlet;
import gz.itcast.dao.ProductDao;
import gz.itcast.entity.Product;
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;
//查询所有商品的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();
//把商品显示到浏览器里面
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>";
// /day11_hist/DetailServlet?id=1 访问DetailSErvlet的servlet程序,同时传递 名为id,值为1 的参数
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/>";
//取出prodHist的cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("prodHist")){
String prodHist = cookie.getValue(); // 3,2,1
String[] ids = prodHist.split(",");
//遍历浏览过的商品id
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 gz.itcast.servlet;
import gz.itcast.dao.ProductDao;
import gz.itcast.entity.Product;
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;
public class DetailServlet extends HttpServlet {
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*30*24*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
*/
private 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;
}
}
}
//System.out.println(prodHist);
// null或没有prodHist
if(cookies==null || prodHist==null){
//直接返回传入的id
return id;
}
//String -> String[] -> Collection :为了方便判断重复id
String[] ids = prodHist.split(",");
Collection colls = Arrays.asList(ids); //<3,21>
// LinkedList 方便地操作(增删改元素)集合
// Collection -> LinkedList
LinkedList list = new LinkedList(colls);
if(list.size()<3){
//id重复
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 object : list) {
sb.append(object+",");
}
//去掉最后的逗号
String result = sb.toString();
result = result.substring(0, result.length()-1);
return result;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}