1. 程式人生 > >.會話管理之Cookie案例二:顯示已瀏覽商品

.會話管理之Cookie案例二:顯示已瀏覽商品

專案開發步驟:資料庫——>創鍵實體物件entity——>建立資料訪問dao——>建立servlet

第一步:建立資料庫:這裡使用的xml檔案建立資料庫,內容如下:

<?xml version="1.0" encoding="utf-8"?>
<product-list>
	<product id="1">
		<name>聯想筆記本</name>	
		<type>LN001</type>
		<price>5000</price>
	</product>
	<product id="2">
		<name>長城筆記本</name>	
		<type>CN001</type>
		<price>3000</price>
	</product>
	<product id="3">
		<name>惠普筆記本</name>	
		<type>HP001</type>
		<price>2000</price>
	</product>
	<product id="4">
		<name>戴爾筆記本</name>	
		<type>DL001</type>
		<price>6000</price>
	</product>
	<product id="5">
		<name>神州筆記本</name>	
		<type>SZ001</type>
		<price>900</price>
	</product>
</product-list>

第二步:建立實體物件:
public class Product {
	private String id;
	private String name;
	private String type;
	private String price;
	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 getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	
}
第三步:建立資料訪問類,包含對資料的增刪改查

首先建立對xml檔案解析的類,匯入相關jar包

public class XMLUtil {
	/**
	 * 讀取xml檔案,返回document物件
	 */
	public static Document getDocument(){
		try {
			Document doc = new SAXReader().read(new File("e:/product.xml"));
			return doc;
		} catch (DocumentException e) {
			e.printStackTrace();
			//把轉換為執行時異常丟擲即可!
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 傳如docuemnt物件,寫出到xml檔案中
	 */
	public static void write2xml(Document doc){
		try {
			OutputStream out = new FileOutputStream("e:/product.xml");
			OutputFormat format = OutputFormat.createPrettyPrint();
			XMLWriter writer = new XMLWriter(out,format);
			writer.write(doc);
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
			//把轉換為執行時異常丟擲即可!
			throw new RuntimeException(e);
		}
	}
}
在對xml檔案解析的基礎上建立對資料庫增刪改查的方法:
public class ProductDao {
//查詢所有商品
	public List<Product> findAll() {
		//讀取xml檔案
		Document doc = XMLUtil.getDocument();
		//讀取所有的Product標籤
		List<Element> elements = doc.getRootElement().elements("product");
		List<Product> list = new ArrayList<Product>();
		//遍歷所有的Product標籤
		for(Element ele:elements){
			//建立Product物件,並	將product內容封裝到物件中
			Product p = new Product();
			p.setId(ele.attributeValue("id"));
			p.setName(ele.elementText("name"));
			p.setType(ele.elementText("type"));
			p.setPrice(ele.elementText("price"));
			//將封裝好的物件新增到集合中
			list.add(p);
		}
		//將集合返回
		return list;
	}
	//根據id查詢商品詳細資訊
	public Product findById(String id){
		//獲取xml檔案
		Document doc = XMLUtil.getDocument();
		//查詢指定id的product標籤
		Element proelem = (Element)doc.selectSingleNode("//product[@id='"+id+"']");
		
		//建立Product物件
		Product p =null;
		// 如果找到指定id的product標籤
		if(proelem!=null){
			p = new Product();
			//通過找到的product標籤找到product的物件屬性,並將其封裝。
			p.setId(proelem.attributeValue("id"));
			p.setName(proelem.elementText("name"));
			p.setType(proelem.elementText("type"));
			p.setPrice(proelem.elementText("price"));
		}
		return p;
		
	}
	public static void main(String[] args) {
		/*
		 * 用於測試上面的方法是否正確
		 */
		ProductDao dao = new ProductDao();
		/*
		List<Product> list = dao.findAll();
		for(Product pro:list)
		{
			System.out.println(pro.getName());
		}
		*/
		Product p = dao.findById("2");
		System.out.println(p.getName());
		
	}
}

第四步:建立servlet,這裡包含兩個servlet, 一個用於商品列表展示,一個用於顯示詳細資訊和儲存cookie.

商品列表展示servlet:

public class ListProdServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			//讀取到所有商品的列表
		ProductDao prodao = new ProductDao();
		List<Product> list = prodao.findAll();
		//把商品顯示到瀏覽器
		response.setContentType("text/html;charset=utf-8");
		String html = "";
		html += "<html>";
		html += "<head><title>檢視商品列表</title></head>";
		html += "<body>";
		html += "<table border='1' align='center' width='600px'>";
		html += "<tr><th>編號</th><th>商品名稱</th><th>商品型號</th><th>價格</th><th>檢視詳情</th></tr>";
		//遍歷所有商品,有幾個商品就有幾行資料
		if(list!=null){
			for(Product pro:list){
				html+="<tr>";
				html+="<td>"+pro.getId()+"</td>";
				html+="<td>"+pro.getName()+"</td>";
				html+="<td>"+pro.getType()+"</td>";
				html+="<td>"+pro.getPrice()+"</td>";
				html+="<td><a href='"+request.getContextPath()+"/DetailProdServlet?id="+pro.getId()+"'>檢視</a></td>";
				html+="</tr>";
				
				}
		}
		html+="</table>";	
		//顯示瀏覽過的商品
		html +="<hr/>";
		html +="最近瀏覽過的商品<br/>";
		Cookie[] cookies = request.getCookies();
		if(cookies!=null){
			for (Cookie cook : cookies) {
				if(cook.getName().equals("prodHist")){
					String prodHist = cook.getValue();
					String[] ids = prodHist.split(",");
					for (String id : ids) {
						
							Product p =  prodao.findById(id);
							//將商品資訊顯示出來
							html+=""+p.getId()+" "+p.getName()+" "+p.getPrice()+"<br/>";	
					}
				break;
				}
				
			}
		}

		html += "</body>";
		html += "</html>";
		response.getWriter().write(html);
	
	}

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

}

顯示詳細資訊的servlet:

public class DetailProdServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			String id = request.getParameter("id");
			ProductDao pdao = new ProductDao();
			Product pro = pdao.findById(id);
			
			//將商品資訊展示在瀏覽器上
			response.setContentType("text/html;charset=utf-8");
			
			String html = "";
			html += "<html>";
			html += "<head><title>檢視商品詳情</title></head>";
			html += "<body>";
			html += "<table border='1' align='center' width='250px'>";
			html += "<tr><th>商品編號</th><td>"+pro.getId()+"</td></tr>";
			html += "<tr><th>商品名稱</th><td>"+pro.getName()+"</td></tr>";
			html += "<tr><th>商品型別</th><td>"+pro.getType()+"</td></tr>";
			html += "<tr><th>商品價格</th><td>"+pro.getPrice()+"</td></tr>";
			html += "</table>";
			html += "<center><a href='"+request.getContextPath()+"/ListProdServlet'>[返回商品列表]</a></center>";
			html += "</body>";
			html += "</html>";
			response.getWriter().write(html);
			
			//建立cookie儲存瀏覽過的商品編號
			Cookie c = new Cookie("prodHist", getCookieValue(request,pro.getId()));
			response.addCookie(c);

	}
	/*
	 *  *   規則: 
	 *     1)不能超過3個,最多3個
	 *     2)最後訪問的商品放在最前面
	 *     
	 * 該方法返回最終生成的瀏覽過的商品的編號列表
	 * 	現在的值           傳入的id值          最終的值          演算法
	 *     null或沒有prodHist        1                  1              直接返回傳入的id   
	 *         2,1                   1                  1,2        小於3個,且id有重複的: 刪除重複的id,把傳入的id放前面
	 *         2,1                   3                  3,2,1   小於3個,且id沒有重複的:直接把傳入的id放前面
	 *         3,2,1                 2                  2,3,1   等於3個,且id有重複的: 刪除重複的id,把傳入的id放前面
	 *         3,2,1                 4                  4,3,2   等於3個,且id沒有重複的:    刪除結尾的id,把傳入的id放前面                     
	 *       
	 */
	private String getCookieValue(HttpServletRequest request,String id) {
		 Cookie[] cookies = request.getCookies();
		 String prodHist=null;
		
		 //將cookie資訊放入一個prodHist中,
		 if(cookies!=null){
			 for(Cookie cook:cookies){
				 if(cook.getName().equals("prodHist")){
					 prodHist= cook.getValue();
					break;
				 }
			 }
		 }
		 //如果是第一次寫入,則直接返回id
		 if(cookies==null||prodHist==null){
			 return id;
		 }
		
		// 滿足兩個條件:1)方便判斷元素是否重複  2)方便增刪元素內容        使用集合: Collection   coll.contains(id): 判斷指定元素是否存在   
		 //     List: ArrayList LinkedList(連結串列),這裡使用linkedList比較適合
		 
		 //先將prodHist中儲存的字串變成陣列
		 String[] prodHists = prodHist.split(",");
		 //將String[]變成Collection集合
		Collection coll =  Arrays.asList(prodHists);
		 //將Collection集合轉換為LinkedList
		LinkedList list = new LinkedList(coll);
	
		if(list.size()<3){
			
			//如果已經有了這個id
			if(list.contains(id)){
				//刪除重複的id
				list.remove(id);
				list.addFirst(id);
			}else {
				list.addFirst(id);
				
			}	
		}else {
			
			//有重複的,刪除重複的,把傳入的id放在前面
			if(list.contains(id)){
				list.remove(id);
				list.addFirst(id);
			}else {
				//沒有重複的,刪除最後一個id,將傳入的id放前面
				list.removeLast();
				list.addFirst(id);
			}
		}
		//list集合變成String字串
		String str="";
		for (Object obj : list) {
			str+=obj+",";
		}
		//去掉最後的逗號
		
		str = str.substring(0,str.length()-1);
		return str;
		
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		doGet(request, response);
	}

}

重點是對瀏覽過的商品列表的排序,需要使用LinkedList集合,如果使用陣列,則需要多次的複製和轉移,相當麻煩。

相關推薦

.會話管理Cookie案例顯示瀏覽商品

專案開發步驟:資料庫——>創鍵實體物件entity——>建立資料訪問dao——>建立servlet 第一步:建立資料庫:這裡使用的xml檔案建立資料庫,內容如下: <?xml version="1.0" encoding="utf-8"?> &

Servlet--淺析會話管理Cookie、URL重寫、HttpSession原理

平常我們在瀏覽網頁的時候,會有一些網站要求我們進行登入,當我們成功登入之後,會發現我們所瀏覽的所有相關網頁都不再需要我們重新登入,這是為什麼呢。還有當我們在電商平臺進行購物的時候,我們雖然是在同一家電商平臺進行購物,但是我們明明是在不同的頁面進行的新增購物車的選

《利用python進行資料分析》讀書筆記案例全美嬰兒姓名

這份資料包含了從1880到2010年間的嬰兒名字頻率資料,其資料形式是多個txt檔案,且用逗號分隔,可以用pandas.read_csv將其載入到DataFrame中,並且用pandas.concat將所有資料都組裝到一個DataFrame。  years=range

python第十四課--排序及自定義函數案例冒泡排序

實現 int python 一個 str -- 排序 冒泡排序 pri 案例二:冒泡排序 lt1=[45,12,56,-32,-3,44,75,-22,100] print(‘排序前:‘+str(lt1)) 自定義函數:實現冒泡排序(升序)原則:1).有沒有形參?有,接

Qt入門基礎篇 ( ) Qt項目建立、編譯、運行和發布過程解析

qt 5 對話 讓我 進度 qmake ctr deploy 設定 設置 轉載請註明出處:CN_Simo。 題解:   本篇內容主講Qt應用從創建到發布的整個過程,旨在幫助讀者能夠快速走進Qt的世界。   本來計劃是講解Qt源碼靜態編譯,如此的話讀者可能並不能清楚地知

爬蟲——Scrapy框架案例陽光問政平臺

web url地址 blog rem idt xpath disable ora ole 陽光熱線問政平臺 URL地址:http://wz.sun0769.com/index.php/question/questionType?type=4&page= 爬取字段:帖

Servlet案例6顯示用戶的上次訪問時間

type image cookies 記錄 pos servlet () 代碼實現 response 這裏是cookie的簡單應用 告訴用戶您的上次訪問時間是:xxxx-xx-xx xx:xx:xx 思路: 第一次訪問該網站時候,記錄當前訪問時間(new Date())

網站爬取-案例天貓爬取( 第一卷首頁數據抓取)

img .com 我想 提供商 網站 col class scoller bubuko 說到網站數據的爬取,目前為止我見過最復雜的就是天貓了,現在我想對它進行整站的爬取 我們先來看下天貓主頁的界面 天貓頁面很明顯是動態頁面 所以我們需要用selenium模塊 首先

JQuery案例實現全選、全不選和反選

lap lsp enter scrip ttr on() class cells span <!DOCTYPE html> <html> <head> <meta charset="UTF-8">

SDN控制器OVN實驗使用OVN配置路由器

概覽 基於我上一篇文章中的實驗環境,我現在將第三層網路基礎功能新增到OVN中。最終呈現出來的將是由邏輯路由器連線的一對邏輯交換機。另外,路由器將被配置為通過OVN中內建的DHCP服務來提供IP地址。 重構邏輯元件 由於設定開始變得更加複雜,我們將重新構建網路架構。新的邏輯網路拓撲如下:

Linux程序管理狀態(

二、程序的生命週期 程序是一個動態的實體,所以他是有生命的。從建立到消亡,是一個程序的整個生命週期。在這個週期中,程序可能會經歷各種不同的狀態。一般來說,所有程序都要經歷以下的3個狀態: 就緒態。指程序已經獲得所有所需的其他資源,正在申請處理處理器資源,準備開始執行。這種情況下,稱程序處於就緒態。

資料結構實驗圖論圖的深度遍歷(SDUT 2107)(簡單DFS)

題解:圖的深度遍歷就是順著一個最初的結點開始,把與它相鄰的結點都找到,也就是一直往下搜尋直到盡頭,然後在順次找其他的結點。 #include <bits/stdc++.h> using namespace std; int gra[200][200]; //儲存圖的大小 int

資料結構實驗圖論圖的深度遍歷__DFS

Problem Description 請定一個無向圖,頂點編號從0到n-1,用深度優先搜尋(DFS),遍歷並輸出。遍歷時,先遍歷節點編號小的。 Input 輸入第一行為整數n(0 < n < 100),表示資料的組數。 對於每組資料,第一行是兩個整數k,m(0 < k

2117資料結構實驗連結串列逆序建立連結串列

#include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }*p, *q, *tail; int main() { int

2117 資料結構實驗連結串列逆序建立連結串列

資料結構實驗之連結串列二:逆序建立連結串列 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 輸入整數個數N,再輸入N個整數,

iOS開發窺探UICollectionViewController() 詳解CollectionView各種回撥

UICollectionView的佈局是可以自己定義的,在這篇部落格中先在上篇部落格的基礎上進行擴充,我們先使用UICollectionViewFlowLayout,然後好好的介紹一下UICollectionView的一些回撥方法,主要包括UICollectionViewDat

SDUT- 2107 資料結構實驗圖論圖的深度遍歷

#include <stdio.h> #include <string.h> #include <stdlib.h> int a[105][105]; int vis[105]; int qu[10005], front, tail, fl

MapReduce案例好友推薦

1.需求 推薦好友的好友 圖1:     2.解決思路 3.程式碼 3.1MyFoF類程式碼 說明: 該類定義了所載入的配置,以及執行的map,reduce程式所需要載入執行的類 package com.hadoop.mr.fof; impo

sdut_2107_資料結構實驗圖論圖的深度遍歷

資料結構實驗之圖論二:圖的深度遍歷 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 請定一個無向圖,頂點編號從0到n-1,用深度優先搜尋(DFS),遍歷並輸出。遍歷時,先遍歷節點編號小的

資料結構實驗圖論基於鄰接表的廣度優先搜尋遍歷

Problem Description 給定一個無向連通圖,頂點編號從0到n-1,用廣度優先搜尋(BFS)遍歷,輸出從某個頂點出發的遍歷序列。(同一個結點的同層鄰接點,節點編號小的優先遍歷) Input 輸入第一行為整數n(0< n <100)