servlet篇(附)【cookie的应用:历史浏览记录】

通过两个案例简要介绍会话技术–Cookie和Session的应用

Cookie:历史浏览记录

此案例好比某宝上商品的浏览记录:当你访问过某件商品后,服务端会保存你的浏览记录,你也可以查看你自己的浏览记录。

简要实现功能,假设背景为网上书城的显示主页面,当我们查看某本书的详细记录退回主页后,可以看到服务器已经记录了我们最新的浏览记录。

1)书的实体类:

public class Book {
	//book类
	private String id;
	private String name;
	private String author;
	
	public Book() {
	}

	public Book(String id, String name, String author) {
		this.id = id;
		this.name = name;
		this.author = author;
	}

	//get 和 set 方法
	...
}

2)通过一个 LinkedHashMap 集合模拟数据库,执行存取操作:

public class Books {
	//模拟数据库显示浏览的书籍
	private static LinkedHashMap<String,Book> linkedHashMap = new LinkedHashMap();
	
	//增加书籍
	static {
		linkedHashMap.put("1", new Book("1","java","zs"));
		linkedHashMap.put("2", new Book("2","spring","ls"));
		linkedHashMap.put("3", new Book("3","vue","ww"));
		linkedHashMap.put("4", new Book("4","mysql","zl"));
		linkedHashMap.put("5", new Book("5","spring boot","dq"));
		linkedHashMap.put("6", new Book("6","微服务","gb"));
	}
	
	//获取所有书籍
	public static LinkedHashMap getAll() {
		return linkedHashMap;
	}

}

3)servlet 显示书城主页面,显示书籍列表,可以选择其中的任意书籍查看其详细信息;同时,主页面也显示历史浏览记录(通过Cookie获取):

@WebServlet("/ShowBooks")
public class ShowBooks extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
    public ShowBooks() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=UTF-8");
		response.setCharacterEncoding("utf-8");
		
		PrintWriter out = response.getWriter();
		out.write("显示所有书籍:"+"<br>");
		
		//获取所有书籍列表
		LinkedHashMap<String,Book> linkedHashMap = Books.getAll();
		Set<Map.Entry<String,Book>> entry = linkedHashMap.entrySet();
		
		//显示所有书籍,以超链接的形式,并将本书的id传给书籍详细信息页面,便于获取该书
		for(Map.Entry<String, Book> sb:entry) {
			Book book = sb.getValue();
			out.write("<a href = 'Info?id="+book.getId()+"'>   "+book.getName()+"</a><br>");
		}
		
		//历史浏览记录部分
		out.write("历史浏览记录:"+"<br>");
		
		//获取浏览器传过来的所有cookie
		Cookie[] cookies = request.getCookies();
		for(int i=0;cookies!=null&&i<cookies.length;i++) {
			//找到记录历史浏览记录的cookie	
			if("history".equals(cookies[i].getName())) {
				//获取的history是 1-2-3 类型的字符串
				String hs = cookies[i].getValue();
				//拆解成为一个一个的id
				String[] ids = hs.split("-");
				//遍历显示每条浏览记录
				for(String id:ids) {
					Book book = linkedHashMap.get(id);
					out.write(book.getName()+"<br>");
				}
			}
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

注意:这里使用书的 id 值组建字符串记录历史浏览记录,类似于 1-2-3,设历史浏览记录最长为3条记录。

4)servlet显示书籍详情页,同时构造保存浏览记录的cookie:

@WebServlet("/Info")
public class Info extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Info() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		//获取将要访问书籍的id(之前通过超链接传递过来)
		String id = request.getParameter("id");
		System.out.println(id);
		
		//获取该id对应的书籍
		Book book = (Book) Books.getAll().get(id);
		
		//显示书籍的详细信息
		response.setContentType("text/html;charset=UTF-8");
		response.setCharacterEncoding("utf-8");
		
		PrintWriter out = response.getWriter();
		out.write("书籍详细信息:"+"<br>");
		out.write("书籍编号:  "+book.getId()+"<br>");
		out.write("书籍名称:  "+book.getName()+"<br>");
		out.write("书籍作者:  "+book.getAuthor()+"<br>");
		
		//构造历史浏览记录的cookie
		String history = makeHistory(request,id);
		Cookie cookie = new Cookie("history",history);
		cookie.setMaxAge(10*60);  //cookie的有效期为10分钟
		//将cookie从服务端发送给浏览器
		response.addCookie(cookie);
	}
	
	private String makeHistory(HttpServletRequest request,String id) {
		String history = null;
		//获取所有自浏览器发送的cookie,查找存放历史浏览记录的cookie
		Cookie[] cookies = request.getCookies();
		for(int i=0;cookies!=null&&i<cookies.length;i++) {
			//获取存储浏览历史的cookie
			if("history".equals(cookies[i].getName())) {
				history = cookies[i].getValue();
			}
		}
		
		if(history==null) {
			//若该cookie的内容为空,则将当前访问的书籍id加入该cookie即可
			history = id;
		}else {
			//若该cookie的内容不为空,则拆分该cookie内容,获得当前存在该cookie的书籍id
			String[] strs = history.split("-");
			List list = Arrays.asList(strs);
			//使用LinkedList集合便于修改
			LinkedList<String> linkedList = new LinkedList<>();
			linkedList.addAll(list);
			
			if(linkedList.contains(id)) {
				//如果该cookie中已记录了当前访问的书籍,则将前id记录到最前面
				linkedList.remove(id);
				linkedList.addFirst(id);
			}else {
				//如果该cookie没有记录当前访问书籍
				if(linkedList.size()>=3) {
					//最多保存3条浏览记录,如果该cookie的长度等于3,删除最后那个浏览记录(即最早之前访问的书籍)
					linkedList.removeLast();
					//将当前访问的书籍id放在最前面
					linkedList.addFirst(id);
				}else {
					//如果cookie的长度还没达到3,还可以直接存储书籍记录
					linkedList.addFirst(id);
				}
			}
			
			//组合成字符串
			StringBuffer sb = new StringBuffer();
			for(String str:linkedList) {
				//以"-"间隔每个书籍id
				sb.append(str+"-");
			}
			//去除最后一个多余的"-"
			history = sb.deleteCharAt(sb.length()-1).toString();
		}
		return history;
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

5)结果展示:

未有访问记录时:
在这里插入图片描述
初次访问某书:
在这里插入图片描述
访问后返回主页(要刷新):
在这里插入图片描述
多次访问后:设置了最多记录3条浏览记录
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章