JavaWeb_02_cookie_显示商品浏览记录

代表首页的Servlet

package cn.itcast;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Map;

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 CookieDemo3 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    /*方法说明:
     * CookieDemo3代表首页的Servlet:
     * 1,输出网站的所有商品
     * 2,输出用户访问过的商品(只显示名字)
     * CookieDemo4代表商品详细信息的Servlet
     * 1,根据用户带过来的id号显示详细信息(显示book的四个成员)
     * 2,构造Cookie回写浏览器(难点)
     */
    //前三句防乱码+获取流
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out=response.getWriter();
    out.write("首页所有商品如下:
"); //重点来了 Map map=Db.getAll(); for (Map.Entry entry : map.entrySet()) { Book book=entry.getValue(); String id=book.getId(); String name=book.getName(); out.print(""+name+"
"); } //下面是CookieDemo3功能的第2部分输出用户访问过的商品(只显示名字) out.write("最近浏览过的商品:
"); Cookie[] cookies=request.getCookies(); for (int i = 0; cookies!=null && i < cookies.length; i++) { if ("bookCookie".equals(cookies[i].getName())) { String cookieVal=cookies[i].getValue(); //因为构造的时候是用逗号连接 String[] ids=cookieVal.split("\\,"); //根据id显示看过的书名 for (String id : ids) { Book book=(Book) Db.getAll().get(id); out.print(book.getName()+"
"); } } } } } //写个Db类模拟数据库:容器双列(有检索要求) class Db{ //购物有序,内部维护一个map集合 private static Map map=new LinkedHashMap(); //开始就有些书 static{ map.put("1", new Book("1","javascript","老张","一本好书")); map.put("2", new Book("2","javase","老毕","一本好书")); map.put("3", new Book("3","javaweb","老方","一本好书")); map.put("4", new Book("4","android","老黎","一本好书")); } //提供一个取得所有Map方法 public static Map getAll(){ return map; } } //写个Book类封装数据 class Book{ private String id; private String name; private String author; private String description; //生成无参构造函数,带参构造函数,Getters and Setters public Book(String id, String name, String author, String description) { super(); this.id = id; this.name = name; this.author = author; this.description = description; } public Book() { super(); } 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 String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }



代表商品详细信息的Servlet


package cn.itcast;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;
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;

public class CookieDemo4 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    /*方法说明:
     * CookieDemo3代表首页的Servlet:
     * 1,输出网站的所有商品
     * 2,输出用户访问过的商品(只显示名字)
     * CookieDemo4代表商品详细信息的Servlet
     * 1,根据用户带过来的id号显示详细信息(显示book的四个成员)
     * 2,构造Cookie回写浏览器(难点)
     */
    //前三句防乱码+获取流
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out=response.getWriter();
    //根据用户通过链接带过来的参数id,显示book所有成员
    String id=request.getParameter("id");
    Book book=(Book) Db.getAll().get(id);
    out.print(book.getId()+" ");
    out.print(book.getName()+" ");
    out.print(book.getAuthor()+" ");
    out.print(book.getDescription()+"
"); //下面是CookieDemo4的功能2,构造Cookie回写浏览器(难点) //用个generateCookie(id,request)方法封装 String cookieVal=generateCookie(id,request); Cookie cookie=new Cookie("bookCookie",cookieVal); //设置有效期(必须)和全站路径(先不考虑用户禁用cookie) cookie.setMaxAge(1*3600*24*30);//单位是秒,有效期为一个月 cookie.setPath("/day04"); response.addCookie(cookie); } private String generateCookie(String id, HttpServletRequest request) { /*方法说明: *构造Cookie回写浏览器(难点) *情况分析:(共4种) *第1种,用户过来时没带Cookie(首次来访) *第2种,包含当前id(前面浏览过) *第3种,列表显示长度已满 *第4种,其他。 */ String cookieVal=null; Cookie[] cookies=request.getCookies(); //得到名为bookCookie的值cookieVal(形如2,5,1) for (int i = 0; cookies!=null && i < cookies.length; i++) { if ("bookCookie".equals(cookies[i].getName())) { cookieVal=cookies[i].getValue(); } } //第1种,用户过来时没带Cookie(首次来访) if (cookieVal==null) { return id; } //下面3句,将形如“2,5,1”字符串cookieVal转成单链表,方便增删改查 String[] str_arr=cookieVal.split("\\,"); List li=Arrays.asList(str_arr); LinkedList list=new LinkedList(li); //第2种,包含当前id(前面浏览过)2,5,1 //第3种,列表显示长度已满 if (list.contains(id)) { list.remove(id); } else { if (list.size()>=3) { list.removeLast(); } } list.addFirst(id); //用StringBuffer连接成串并返回 StringBuffer sb=new StringBuffer(); for (String s : list) { sb.append(s+","); } //去掉最后的逗号 sb=sb.deleteCharAt(sb.length()-1); return sb.toString(); } }


你可能感兴趣的:(JavaWeb,servlet,javaweb,cookie)