代表首页的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("首页所有商品如下:<br />");
    //重点来了
    Map<String,Book> map=Db.getAll();
    for (Map.Entry<String, Book> entry : map.entrySet()) {
      Book book=entry.getValue();
      String id=book.getId();
      String name=book.getName();
      out.print("<a href='/day04/servlet/CookieDemo4?id="+id+"' target='_blank'"+">"+name+"</a><br/>");
    }
    //下面是CookieDemo3功能的第2部分输出用户访问过的商品(只显示名字)
    out.write("最近浏览过的商品:<br />");
    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()+"<br />");
        }
      } 
    }
  }
}
//写个Db类模拟数据库:容器双列(有检索要求)
class Db{
  //购物有序,内部维护一个map集合
  private static Map<String,Book> 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()+"<br />");
    //下面是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<String> list=new LinkedList<String>(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();
  }
}


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐