您的位置:首页 > 编程语言 > Java开发

JavaWeb_02_cookie_显示商品浏览记录

2013-11-22 14:13 393 查看
代表首页的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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  servlet javaweb cookie