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條瀏覽記錄
在這裏插入圖片描述

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