商城(java基礎、jsp、servlet、數據庫)


一、后台

1、前台和后台的關系:

 

 后台是由工作人員操作的,通過后台系統對數據庫實行增刪改查等操作,通過前台系統訪問數據庫,將數據庫中的信息通過前台顯示。

2、功能實現:

(1)顯示全部商品信息:

 

 home.jsp由其他jsp組成,其中的left.jsp能夠訪問Servlet,並從Servlet獲取數據,而在其訪問Servlet時,Servlet需要調用Service層的方法,Service層的方法調用dao層的方法,dao層則可以直接通過sql語句訪問數據庫。並將查詢到的數據返回到Service層,Service層的數據又返回給web層,web層的數據被封裝到request域中,通過request請求轉發,request域中的數據通過jsp中的EL技術將數據取出,由jsp頁面顯示出來。

(2)讀取分類信息的實現:

 

 在進入list.jsp提供的頁面后,點擊“添加”按鈕,會訪問到web層的AdminAddCommodityServlet,向AdminAddCommodityServlet請求數據,最終,在AdminAddCommodityServlet中將數據封裝到Request域,並通過請求轉發訪問add.jsp,將request域中的數據通過EL取出來,通過JSP頁面進行顯示。

(3)增加商品信息:

 

 在點擊List.jsp的添加按鈕后,jsp訪問AddProduceServlet,AddProduceServlet通過Service層和dao層將數據寫入到數據庫,然后從AddProduceServlet重定向到AdminCommodityServlet,獲數據庫中的信息,並將信息通過list.jsp顯示出來。

 4、刪除功能:

List.jsp可以根據點擊的刪除標記的位置確定要刪除的商品的pid,AdminDelCommodityServlet獲取到jsp中的此pid,作為參數依次傳遞給Service層,dao層,最終將數據庫中有此pid的商品刪除。

 5、商品信息的回顯(商品信息修改的一部分)

 

 要想修改某一商品的信息,必須先要獲取到該商品未修改時的信息。為了實現修改商品所屬分類的功能,必須先要從數據庫中獲取商品所有的分類,並從edit頁面中顯示出來。為了實現修改其他信息的功能,需要查詢商品所有的屬性,並通過edit.jsp顯示出來。web層的AdminEditServlet里面需要從Service層中獲取調用兩個方法,分別獲取到商品的屬性信息和商品的所有類別信息,並封裝到request域,通過請求轉發將request域中的數據流向edit.jsp,通過EL技術將request域中的數據顯示出來。

6、修改商品信息:

 

 

 

 

 通過List.jsp訪問AdminEditServlet查詢商品的相關信息,並重定向到edit.jsp,在此jsp中,取出request域中的數據進行顯示,在edit.jsp中可以對商品的信息進行修改,通過Service層和dao層將數據寫到數據庫,再重UpdateServlet重定向到AdminCommodityServlet,此Servlet通過Service層和dao層取出數據庫中的全部商品信息,封裝到request域中,並通過List.jsp顯示所有的商品信息。

7、條件查詢

 

 表單中填寫要查詢的商品信息后(有些選項可以為空),將其提交給Servlet,在Servlet內部首先將其封裝到VO中,然后封裝到map集合中,依次提交到Service層和Dao層,最終從數據庫中查詢數據。

將查詢到的數據封裝到商品的javaBean中,通過request對象請求轉發到 list.jsp。當然,在servlet中還要調用到查詢商品分類的方法,該方法實現表單中分類從數據庫的動態獲取。

8、商品的分頁

 

 在訪問Servlet時,獲取到以上數據后將這些數據封裝到request域中,其中Dao層的作用主要是用上述的兩個數作為參數,求出每一頁的商品的信息。

 

二、前台(包括部分后台:admin/home.jsp)

1、注冊、表單校驗

(1)注冊&郵件激活:

 注冊的實質是封裝表單數據,將數據作為參數傳遞到dao層后,借助於sql語句將數據寫入數據庫,並根據dao層的方法返回的數據判斷是否成功向數據庫寫入數據,如果成功,借助於MailUtils向用戶注冊的時候填寫的郵箱發送激活郵件。

點擊激活郵件實際上是跳轉到一個servlet,dao層執行的是update語句,將用戶的狀態進行更改。

(2)注冊表單校驗:

 

 為了保證用戶名的唯一性,需要先對用戶的用戶名進行校驗,如果此用戶名已存在則給出提示信息,如果還沒有被使用則當前用戶可以正常使用該用戶名。當然,表單校驗還包括對用戶名密碼是否為空,是否符合規則等進行校驗。這些都屬於前台校驗,可以減少用戶提交數據的次數,減小服務器的壓力。

 (3)登錄

從頁面獲取用戶的用戶名和密碼,然后根據用戶名和密碼,從數據庫查詢是否存在此用戶,存在的話,返回用戶的信息並封裝到session內部,在首頁可以從session中獲取用戶名進行登錄用戶的顯示

(4)自動登錄

判斷是否選擇了自動登錄,選擇的話就將該用戶的用戶名和密碼存儲到cookie中,在cookie過期之前可以自動登錄(遍歷cookie獲取用戶名和密碼),是通過過濾器來實現的。

 

2、最新和熱門商品的展示

 

 最新和熱門商品的區別僅僅在於查詢的商品的字段不同,一個根據時間字段,一個根據商品是否熱門的字段。為了能夠直接翻個我拿到index.jsp,需要先定義一個default.jsp,然后重定向到servlet,如果直接訪問index.jsp的話是不經過servlet的,頁面也不能從數據庫中動態獲取到數據。

 

3、獲取商品分類信息

 

 通過三層架構獲取到商品的分類信息后返回到servlet中,servlet將數據封裝為json格式,以便jsp在發起ajax請求后能夠獲取到格式為json的數據。在jsp中書寫函數只要jsp加載完畢就會發起ajax請求獲取商品的分類數據,這樣的話不管head.jsp在哪一個頁面中,都能夠通過函數發起請求后獲取到數據,否則,在頁面跳轉后每次都要書寫專門的servlet獲取數據。

 

4、存儲商品分類信息

(1)導包

(2)先從緩存中查詢,如果緩存中有相應的數據,就不再從數據庫中查詢,因為從緩存中獲取數據速度更快,但是如果緩存中沒有,就需要從數據庫中獲取,然后將查詢的數據放入緩存

 

5、商品分頁

 

(1)第1次在頭部點擊商品分類的時候,需要將商品的ID傳遞到web層,當前頁並沒有傳遞到web層,當前頁為空的話,在web層默認為1,也就是說第1次點擊商品分類的時候,進入相應的商品分類頁面后,是從第1頁開始顯示的

web層的處理:

從前端頁面獲取到商品分類的ID,當前頁默認為1,每一頁顯示的數量為定值,將這三個參數傳遞到service層

service層:

從dao層獲取商品的總數量,通過總數量和每一頁能夠顯示的商品數量,計算出商品展示的總頁數

通過商品ID、每一個頁面的起始索引、每一個頁面顯示的數量,獲取這一個頁面顯示的商品的信息,也需要dao層的一個方法來實現

將當前頁面、每一個頁面顯示的數量,總條數,總頁數和當前頁面顯示的商品信息,進行封裝,返回給web層

(2)當點擊分頁條的時候,如果是第1頁、當前頁或者是最后一頁,則保持不變,不會向服務器發起新的請求

當點擊前一頁的時候,當前頁減一;同理,點擊下一頁的時候,當前頁加一,需要向服務器發起新的請求

 

6、顯示商品詳細信息

 

 在商品頁面,點擊商品圖片或商品名稱之后,就請求服務器查詢該商品的詳細信息,要向web層傳遞商品ID,通過ID查詢到商品的詳細信息后,在web層將商品的數據封裝到request域,然后請求轉發到頁面,將商品的信息展示在商品的詳情頁面。

 

7、瀏覽記錄

 

 在點擊商品的圖片或者名稱的時候,需要訪問servlet,在里面創建cookie,並將商品的ID存放到cookie里面。如果cookie中已經存在了該商品的ID,那么就將該商品從集合中移除,並將該商品添加至集合的頭部。如果cookie中不存在商品的iD,直接將該商品的ID放到集合的首部。

在商品的詳情頁面,點擊返回首頁的時候,會訪問相應的servlet,會攜帶參數pid和商品所在的頁面,保證返回的頁面和初始的頁面是同一個。在該servlet內部,將cookie轉化為數組之后,對數組進行遍歷,通過商品的ID,獲取每一個商品的詳細信息,將查詢到的商品信息存放到list集合中,最后,請求轉發到商品展示頁面

 

8、servlet的抽取

將servlet按照模塊分類,一個模塊(servlet)中有多個功能(方法),這里和springmvc的控制器有相似的功能

抽取之后同一個servlet內部有多個方法,在調用的時候根據方法的名字來區別同一個servlet中的不同功能

 

9、購物車

(1)對象之間的關系:

 

 購物車的一條信息稱為cartitem,在這一條信息里面封裝的有product對象,多個cartitem對象構成了cart對象

定義一個HashMap存儲購物項,哈希表的鍵為商品的ID,值是該商品的購買信息

(2)向購物車添加商品

從表單獲取購買的該商品的ID(通過ID獲取該商品的全部信息)和該商品購買的數量,並根據單價和購買商品的數量計算出此次購買的商品小計,將以上信息封裝為CartItem對象

從session中獲取購物車,如果沒有獲取到就新建一個Cart對象,否則,從購物車中獲取商品的購物項並判斷新的提交的商品的ID是否在session中已經存在,如果已經存在,就都商品的購買數量和小計重新計算以后封裝為Cartitem對象。如果購物車不為空,但是不存在該商品,就將其放入到HashMap集合中,並對小計進行修改

計算購物車的總金額,封裝到cart里面,存儲在session中

(3)移除一種商品

根據session的鍵獲取購物車的session,並從購物車中獲取相應ID的商品,修改總價后從集合中刪除該商品的信息

(4)清空購物車

移除鍵為cart的session

(5)總結

雖然重定向能夠攜帶數據,但是並不是攜帶不攜帶數據都能夠使用它,因為,請求轉發后地址欄的信息沒有改變,如果重復提交會造成數據的錯誤,因此,此時可以采用重定向的方式

 

10、訂單

(1)提交訂單

訂單、訂單項、商品之間的關系:

商品添加訂單項的ID、商品的數量、小計、訂單項屬於哪一個訂單后就成為了訂單項,多個(也可以是一個)訂單項添加用戶信息、地址等信息后就成為了一個訂單。

web層:

訂單提交后數據庫就會存在訂單的信息,需要在web層對訂單進行封裝,如果沒有登錄的話是不能提交訂單的,會重定向到登錄界面提示用戶進行登錄

訂單項的信息可以從購物車項中獲取,最終,將訂單項添加到訂單的訂單項集合中即可

service層:

因為訂單項和訂單是兩個不同的表,因此,需要分開來講數據寫入到不同的表中(需要兩個方法處理),傳遞的參數都可以是order,因為,從order中可以獲得orderItem。在service要進行事務處理,保證兩個操作的一致性

dao層:

通過sql語句將訂單信息寫入到數據庫

(2)網上支付

 

 在這里主要是要學會調用第三方的支付接口,並在支付成功的時候更改訂單的狀態

 (3)我的訂單

 

先查詢該用戶的所有訂單的集合(根據用戶的uid查詢該用戶的所有訂單信息),再對每一個訂單下的訂單項進行遍歷(根據訂單號查詢)

因為查詢的數據涉及到多張表,需要采用 MapListHandler()對查詢到的數據進行封裝(本質是將map封裝到list集合中),接收的時候可以用List<Map<String, Object>>,然后遍歷數據,將數據再次封裝到orderitem中

對訂單進行展示的時候,要用到foreach的嵌套,外層展示的是每一個訂單,內層負責展示每一個訂單的訂單項。

 

11、權限控制

用戶在沒有登錄的情況下是無法查看訂單的,因為沒有用戶的信息是無法獲取到該用戶的訂單的,因此,需要用到權限控制。這里是通過虛擬路徑對訪問的頁面進行權限的控制。需要配置過濾器,在過濾器內部判斷session中是否有用戶的信息,有的話已經登錄就放行,沒有的話就重定向到登錄界面。

 

12、注銷

注銷的實質是清除自動登錄的時候創建的cookie和登錄成功后存儲用戶信息的session

 

13、文件上傳

需要導入兩個與文件上傳相關的包。

遍歷request的每一個文件項,並對每一個文件項對是否是一個普通的表單項進行判斷。

 

14、ajax獲取商品分類

在add頁面加載完畢的時候獲取到商品的分類數據,通過service層和dao層獲取到商品的分類數據,在web層將商品的分類數據轉換為json格式,前端通過ajax獲取到json字符串,並獲取到商品的分類數據。最后通過拼接html文件將商品的分類信息顯示在前端頁面。

 

15、添加商品

商品的信息既包括文字信息又包括圖片信息,獲取表單提交的文字信息的同時又要獲取圖片,將圖片的路徑和商品的其他信息封裝成為一個商品對象,同時,要通過文件的上傳功能將圖片上傳到服務器,而其他商品的數據是存儲在數據庫中的。

 

16、訂單詳情

點擊查看想請的按鈕后,會掉用函數,在該函數內部發起ajax請求,web層返回訂單詳情的json字符串,jsp頁面遍歷json格式的字符串,取出里面的數據並進行html代碼的拼接,最后進行頁面的顯示。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM