使用cookie技术实现历史浏览记录并控制显示的个数

使用cookie技术实现历史浏览记录并控制显示的个数

使用cookie技术实现历史浏览记录,
并且只显示3个历史浏览记录,每次访问的记录都放到最前main。
需要了解cookie的知识点:
cookie保存在客户端;
服务端创建好cookie
(Cookie cookie = new Cookie(String cookieName,String cookieValue),
使用response.add(Cookie)返回给客户端;下一次访问的时候浏览器会携带这个cookie和请求参数一起发送给服务端。服务端接收cookie使用request.getCookies();返回的是Cookie [] .使用的时候需要判断这个cookie是否为null。

cookie的有效期:cookie.setMaxAge(0) ,response.addCookie(cookie);告诉浏览器cookie失效。
开始上代码:
第一步:准备数据:

import java.util.HashMap;
import java.util.Map;

import com.itmayiedu.bean.Book;
/**

  • 模拟数据库中的数据
  • @author Administrator

*/
public class DBUtils {

private static Map<Integer, Book> books = new HashMap();

static{
	books.put(1, new Book(1,"java入门学习","tom"));
	books.put(2, new Book(2, "c#", "jack"));
	books.put(3, new Book(3, "python", "marray"));
	books.put(4, new Book(4,"大数据","kevin"));
	books.put(5, new Book(5, "javascipt入门", "lilie"));
	
}

public static Map<Integer, Book> getBookAll(){
	return DBUtils.books;
}

//根据id 获取书籍信息 key 就是数的id。
public static Book getBookById(Integer id){
	return books.get(id);
}

}

第二步:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itmayiedu.bean.Book;
import com.itmayiedu.util.DBUtils;

/**

  • 在浏览器中显示我们需要访问的数据
  • @author Administrator

*/

@WebServlet(“/showBookAll”)
public class ShowBookAll extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 response.setContentType("text/html;charset=utf-8");
 //显示所有的书籍
 PrintWriter writer = response.getWriter();
 writer.println("图书列表:");
 
 Map<Integer, Book> bookMap = DBUtils.getBookAll();
 Set<Entry<Integer,Book>> entrySet = bookMap.entrySet();
 for (Entry<Integer, Book> entry : entrySet) {
	Book book = entry.getValue();
	 
	 writer.print("<br/><a href='http://localhost:8080"+request.getContextPath()+"/bookView?id="+book.getId()+"'>"+book.getName()+"</a>");
	 
}
 
 writer.println("<br/>访问的历史记录<br/>");
 //获取cookie
 Cookie[] cs = request.getCookies();
 if(cs !=null){
	 for (Cookie c : cs) {
		if("historyIDs".equals(c.getName())){
			String historyIDs = c.getValue();
			String[] split = historyIDs.split("-");
			for (String id : split) {
				Book book = DBUtils.getBookById(Integer.parseInt(id));
				writer.println("<br><a href='http://localhost:8080"+request.getContextPath()+"/bookView?id="+book.getId()+"'>"+book.getName()+"</a>");
			
			}
		}
	}
 }
 
 
}

 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	 doGet(request, response);
}

}

第三步:
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itmayiedu.bean.Book;
import com.itmayiedu.util.DBUtils;

/**

  • 详情信息处理
  • @author Administrator

*/

@WebServlet(“/bookView”)
public class BookViewServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType(“text/html;charset=utf-8”);
// 获取id
String idStr = request.getParameter(“id”);
System.out.println(“现在访问的id:” + idStr);
Book book = DBUtils.getBookById(Integer.parseInt(idStr));

	response.getWriter().println("详细信息:" + book.toString());

	LinkedList<String> list = new LinkedList<>();

	StringBuffer sb = new StringBuffer();

	// TODO 记录浏览信息,把id保存在cookie中,显示在页面
	// 把访问的id放入到cookie中
	Cookie[] cs = request.getCookies();
	if (cs != null) {
		// 说明原来已经有cookie其中保存了id
		// historyIDs = 1-2-3-4

		// 1-2-3-4-1 1-2-3-4-4 1-2-3-4 3
		for (Cookie c : cs) {
			if ("historyIDs".equals(c.getName())) {
				String idValues = c.getValue();
				System.out.println("以前访问的histroyIDs:" + idValues);

				// 页面只显示3个
				String[] ids = idValues.split("-");
				System.out.println("分割后的数组:" + Arrays.toString(ids));

				for (String id : ids) {
					list.add(id);
				}

				System.out.println("原来的集合元素:" + list);

				// 控制只添加三个id
				if (!list.contains(idStr)) {
					// 不包含重复元素

					if (list.size() == 3) {
						// 里面的元素等于3
						list.removeFirst();
					}
				} else {
					// 包含了重复的元素
					list.remove(idStr);

				}
				list.addFirst(idStr);

				System.out.println("添加新的id之后的集合元素:" + list);

				for (String id : list) {
					sb.append(id + "-");
				}

				idValues = sb.substring(0, sb.length() - 1);
				System.out.println("拼接后的histroyIDs:" + idValues);
				c.setValue(idValues);
				response.addCookie(c);

				/*
				 * //如果第一次访问和后来有范问同一个就直接结束方法 if
				 * (idValues.equals(idStr)){return;}
				 * 
				 * if(idValues.startsWith(idStr)){ idValues =
				 * idValues.replaceAll(idStr+"-", ""); }else{ idValues =
				 * idValues.replaceAll("-"+idStr, ""); }
				 * 
				 * 
				 * 
				 * 
				 * idValues += "-" + idStr;
				 * 
				 * System.out.println("现在histroyIDs:" + idValues); //
				 * 设置cookie的值 c.setValue(idValues); response.addCookie(c);
				 */

			}

		}
	} else {
		// 说明没有创建cookie
		Cookie cookie = new Cookie("historyIDs", idStr);
		cookie.setMaxAge(60 * 1);
		response.addCookie(cookie);
	}

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	doGet(request, response);
}

}

备注:
可以使用字符串形式来拼接historyIds;字符串形式没有控制显示访问历史记录,我是使用LinkedList集合来控制,每次访问新都插入在第一个位置,所有选择了LinkedList集合,它可以控制插入位置和插入在首行和末尾,也可以删除指定位置和首末位置的元素。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100800.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vb如何测试连接mysql_VB怎么连接访问Access数据库?[通俗易懂]

    VB是我们常常会见到的一款可视化程序设计语言,它的功能十分强大,因此有很多人会使用它,但是有时候我们需要用到VB来连接Access数据库,但是却无从下手,那么VB怎么连接访问Access数据库呢?不懂的朋友请看以下内容。方法/步骤:1、Access,建立数据库,数据库命名为Database1.mdb。(注意:这里的后缀是mdb,如果Access是2007版本的,保存的时候要另存为2003版本的才行…

    2022年4月8日
    44
  • 排名前三的python 开源 IDE

    Python无处不在,似乎它支持从主要网站到桌面实用程序到企业软件的所有功能。Python已经被用来编写流行的软件项目,如dnf/yum,OpenStack,OpenShot,Blender,Calibre,甚至是原始的BitTorrent客户端。它也恰好是我最喜欢的编程语言之一。就个人而言,Python多年来一直是我从大学课程到小脚本的一切课程,帮助我自动执行重复的任务。它是少数…

    2022年4月8日
    53
  • 2021python激活码【在线注册码/序列号/破解码】[通俗易懂]

    2021python激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    54
  • 计算机键盘突然不能用了,如果联想笔记本电脑键盘突然无法使用怎么办?[通俗易懂]

    计算机键盘突然不能用了,如果联想笔记本电脑键盘突然无法使用怎么办?[通俗易懂]如果联想笔记本电脑键盘突然无法使用,该怎么办?早上电脑使用得很好.下午打开计算机后,键盘突然变得不可用,并且对输入没有任何响应.经过反复折腾,问题终于解决了.需要它的朋友可以参考它.今天,编辑器遇到了这样的情况:我早上很好地使用了计算机.下午打开计算机后,键盘突然变得不可用,并且对输入没有任何响应.经过反复折腾,问题终于解决了.现在,我将与您分享.详细的解决过程.软件名称:360…

    2022年9月20日
    2
  • connectionstring写法「建议收藏」

    connectionstring写法「建议收藏」&lt;connectionstrings&gt;&lt;br&gt;&lt;addname="ConnectionStringName"connectionstring="DataSource=服务器名;InitialCatalog=数据库名;UserID=用户;Password=密码"&gt;&lt;/add&gt;providerName="System.Data.SqlClie

    2022年7月12日
    15
  • HashMap遍历的四种常用方式「建议收藏」

    HashMap遍历的四种常用方式「建议收藏」古人云:温故而知新。最近闲来无事就去翻阅了一下之前的一些基础java知识点。本想着随便看看,然而就发现有了意外收获。比如本文所讲HashMap遍历的四种常用方式。大伙们一起学习一起进步,记得点赞关注以示鼓励哈!!!准备工作首选我们先准备一个HashMap。publicclassTest1{publicstaticvoidmain(String[]args){Map<String,String>map=newHashMap<St

    2022年9月9日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号