.會話管理之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包
在對xml檔案解析的基礎上建立對資料庫增刪改查的方法: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); } } }
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)