1. 程式人生 > >Java Web(十四) 編寫MyBookStore項目的總結

Java Web(十四) 編寫MyBookStore項目的總結

說明 退出 order eight 連接數據庫 item 沒有 們的 bsp

      這幾天一直沒有發博文,原因是在寫一個書城的小項目,作為web學習的最後沈澱,接下來就要到框架的學習了。項目最後會分享源碼鏈接。有需要的同學可以拿到自己玩一玩

                    --WH

一、項目介紹

    從網上找的一個培訓機構的小項目,名稱叫做 書城購物網站 吧,其中就是分前後臺,前臺用於顯示各種類型的書籍商品,可以用於加入購物車,可以購買付款下單,後臺就用來對書籍、書類別的增刪改,和對訂單的處理。一個不是很復雜的項目,但是在沒開始編寫之前,確實是毫無頭緒,無從下手,那是因為沒有對該項目有一個大體的認識,不知道其中的層次模塊,所以不好從哪裏開始著手去寫代碼,等會聽我慢慢道來,我會把我編寫的思路和你想法一步步告訴大家,在之前,先把效果給大家看一下吧。

    前臺首頁

          技術分享

    沒登錄之前,可以查看全部書籍商品,也就點擊全部分類即可,也可以通過分類找到對應類別的書籍(每頁顯示12個商品,有分頁功能)

           技術分享

    然後進行註冊,這裏用了AJAX對註冊的用戶名進行了校驗,為了不讓重名,並且可以發送激活碼的郵件對帳號進行激活,沒激活的用戶是登錄不了的。

              技術分享

    登錄之後,加入商品到購物車

              技術分享

、              技術分享

     對自己的訂單進行查看(提前已經有數據的),一些訂單還沒有付款就可以進行付款,付款了就等待後臺點擊發貨,發了貨就等待自己點擊確認收獲即可。 

                技術分享 

      對訂單付款,選擇其一個銀行就會跳轉到哪個銀行的頁面進行付款,作為實驗,每次只會付一分錢,付給的是一個測試帳號。也可以自己去申請,用的是易寶支付平臺                  

                技術分享

      前臺大概就是這樣了,現在來說說後臺的東西,後臺很簡單。就管理這些商品即可。

      後臺首頁

                技術分享

      其中的功能已經在左邊的列表中清清楚楚的寫著了,對分類,圖書和訂單進行管理,包括增刪改查操作。這裏就不做過多介紹了,對訂單的管理有一個小的邏輯管理,可以對已經付款的訂單進行發貨處理,那麽就等待前臺用戶點擊確認收獲,確認收獲後,就成了已經完成的訂單了。

      

二、分析項目結構模塊

      剛開始拿到這個項目的前端架子時,只能說,看起來很簡單的幾個操作,也就登錄,註冊,查看書籍信息,加入購物車,付款下單,點來點去就這樣幾個頁面,但是讓自己拿起來實現,確實是沒一點頭緒,不過寫完了,就會對這個項目有一個總體的了解,就相當於,一開始用2D畫面,現在是用上帝視角在看這個項目,一目了然的感覺。先來寫說說編寫思路。

      首先要看懂數據庫的設計,理清楚關系,然後了解項目需要分哪幾個模塊。搞懂了這幾個,基本上就有個大概的了解,就可以動手寫代碼實現了。

      2.1 數據庫設計。

          技術分享

        五張表,現在一個個來分析,

        user表,用來進行登錄註冊,對用戶進行識別和管理的。

            uid:唯一識別碼,采用UUID獲得一個32位的字符串,用於標識該用戶。

            username:登錄時的用戶名,唯一,不能重復。

            password:登錄密碼,並沒有加密,按常理應該會使用加密,這樣到數據庫中查看數據也看不到原始密碼。

            email:郵箱,用於接收激活郵件

            state:是否激活的狀態標識。1為激活,0為未激活

            cdkey:激活碼。

          為了了解其中的email,state,cdkey三個字段,就要知道發送激活碼郵件的流程,首先註冊時候,state為0,未激活狀態,註冊會創建一個激活碼,假設為123,cdkey=123,然後通過email,用戶留下來的郵箱,往該郵箱發送一個激活郵件,內容為一個 超鏈接,超鏈接中會帶兩個參數,一個參數存放這123,一個參數存放uid,標識該用戶,點擊超鏈接就會跳轉到一個處理激活的servlet中,將拿到的激活碼參數內容跟數據庫中cdkey對比,看是否一樣,一樣的話,那麽就為激活了,利用uid將用戶state改為1,如果不一樣,說明不是該用戶點擊激活碼郵件過來的,不作處理。

  

        category表,圖書分類的類別表,比如玄幻,言情等。該表比較簡單,看上面的項目介紹,就能夠知道,主頁中旁邊的類別就是從該表中拿到的數據。

             cid:唯一標識碼,同樣使用uuid,獲得32位字符串來充當該值

             cname:類別名稱。

        book表,書籍表,用於存放所有的書籍信息。

             bid:唯一標識碼

             bname:圖書名稱  

             price:圖書價格,采用的是decimal類型,保留2為小數點的。也就是價格精確到分

             author:圖書作者

             image:圖書的圖片,存放的是圖片的路徑,而不是將圖片存放在數據庫中

             cid:指向category表中的cid字段,是一個外鍵字段,作用是標識該本書籍是屬於哪個類別的。

             isdel:這個是圖書的狀態,是否下架?這個字段在我寫的項目中並沒有用到,我沒有編寫這塊的邏輯代碼。

          分析下來,就將book表跟category表聯系起來了,每本書都會有一個專屬的類別,這樣就可以通過類別來查詢對應的書籍了,想一想前臺主頁上的通過分類查找到對應書籍進行顯示,就是通過這兩張表的關系來解決的。

        orders表,訂單表

            oid:唯一標識碼

            total:價格,也就是這個訂單中可能有多個商品,多個商品的總價格就為total

            ordertime:下單的時間,類型,time

            state:訂單的狀態,有四個狀態,分別用1,2,3,4來識別,1:未付款,2:已經付款,待發貨,3:已發貨,待收貨,4:已經收貨,訂單完成,

            address:地址,送貨肯定需要一個地址。

            uid:指向user表中的uid字段,是一個外鍵字段,標識著該訂單是哪位用戶的。

         通過orders表,就將user表給聯系起來了,到時前臺要顯示每位用戶自己的訂單時,就通過orders表中的uid字段,來查詢自己所有的訂單。

       orderitem表,訂單項目表,因為一個訂單中可能有多個商品,那麽每個商品都要生成一個orderitem記錄,這樣通過一個訂單就可以查找到該訂單中有多少個商品。

            itemid:唯一標識碼

            count:一件商品購買的數量,比如買A這本書一次買了兩本,由於是兩本A書,那麽就不用生成兩個orderitem記錄了。

            subtotal:總價為多少

            bid:指向book表的bid,為一個外鍵字段,標識著該訂單項是哪本書籍

            oid:指向orders表中的oid,為一個外鍵字段,標識著該訂單項是屬於哪個訂單的。 

         該表就將三個表聯系在一起了,book表,orders表,orderitem表,user表。他們的關系應該也清楚了,一個orders表中的一條記錄為一個訂單,該訂單是屬於誰的(通過訂單中的uid字段),該訂單中有多少種商品(通過orderitem表中的oid字段),訂單中每種商品的信息(通過orderitem表中的bid字段)。其實我們說的就是一對多的對應關系,在多的一方存儲外鍵字段。自己可以分析分析,這5張表之間的關系,通過誰可以查找到誰。

                  

     2.2 分析前臺模塊

         用戶模塊

             登錄,註冊

             註冊

               AJAX異步校驗用戶名

               發送激活郵件

               激活完成

             登錄

               判斷用戶帳號密碼和是否激活,並將自身存入session中

             退出

               銷毀session

         類別模塊

             查詢所有分類。

               首頁中顯示分類信息,從category表中拿去所有類別信息

         圖書模塊

             顯示所有圖書,根據分類查詢圖書,根據圖書id查詢圖書詳細信息。

             點擊分類模塊中的類別,就能將該類別下面的圖書展示出來。點擊全部分類,則將全部圖書都顯示出來,此處就是使用category表和book表結合查詢,點擊其中一本圖書,將顯示圖書的詳細信息,並且提示有購買的按鈕,此按鈕是將其圖書加入購物車

       

         購物車模塊

             添加到購物車,從購物車中移除商品,清空購物車

             此處使用的是一個Map來充當購物車的容器,使用LinkedHashMap,優點是存取快捷,其原理為,創建一個 購物車項(cartItem)的javabean,其中有三個屬性,book對象,有購買數量acount,還有總金額allMoney,用這三個屬性來標識一個商品,購物車則用Map充當,Map<String,CartItem>。 String:裝的是bid(book的唯一識別碼),CartItem就是裝的購物車項。

             將 A 書加入購物車,

                首先將A書封裝成CartIitem對象,book屬性就是A書的所有信息,acount代表這次加入購物車的A書有幾本,allMoney代表總金額為多少, 

                封裝成CartItem後,將其加入cart(購物車,也就是map集合)

                    通過A書的唯一識別碼bid跟cart中的所有key值進行比較,判斷cart中是否已經存在A書

                      如果存在A書,則找到cart中key為bid的cartItem,在往cartItem中修改acount和allMoney。

                      如果不存在A書,則將A書存入cart中,用A書的bid充當key值,用A書封裝好的CartItem充當value,

             將cart(購物車,也就是map集合)存入session作用域中,存session作用域的話,就不能永久保存該用戶的購物車,根據session的特性,關閉瀏覽器還會默認保存30分鐘,並且如果不將cookie設置在瀏覽器保存的話,關閉瀏覽器即丟失sessionId,session則找不到,也就是購物車中的內容就丟失了,所以存到session中的特點就是我說的那樣,也可以將購物車存到數據庫中,那麽用戶不管什麽時候登錄,在哪裏登錄,都能夠找得到自己的購物車。

        訂單模塊

            生成訂單,根據用戶查詢訂單,根據訂單id查詢訂單項,在線支付功能,修改訂單狀態  

            將商品加入購物車後,可以點擊進行付款,此時會跳轉到選擇支付方式頁面,並且生成訂單,此時的訂單state為1,為未付款狀態,編寫地址後,進行付款,跳到付款頁面,付款成功後,會跳轉回我們自己的頁面,此時訂單state為2.稱為已付款代發貨狀態,在生成訂單的同時,也會生成orderitem(訂單項),也就是將每一件商品都生成訂單項。其業務操作是在service層完成的。

     2.3 分析後臺模塊

        分類管理  對category表進行操作。

            1、查詢分類,將所有分類信息查詢出來

            2、添加分類,

            3、修改分類

            4、刪除分類

        

        圖書管理

            1、查詢圖書

                  將所有圖書信息查詢出來

            2、添加圖書  

                  文件上傳(將圖片信息上傳)

            3、修改圖書

                  修改圖書圖片或其他信息

            4、圖書下架(刪除)

        

        訂單管理

            1、查詢所有狀態的訂單

            2、查詢出各個狀態的訂單(未付款,已付款待發貨,已發貨待確認收貨,已確認收獲訂單完成)

        

    

三、編寫流程

       3.1、搭建項目環境

            使用的是三層經典架構,web層、service層、dao層,如果想使用接口編程那麽就在其中在進行分接口類和實現類。

              我的包結構

                技術分享

            將所有需要使用的jar包加入。

               mysql:1個jar包

               c3p0連接池:1個jar

               dbutils框架:1個jar

               文件上傳:2個jar  io和核心jar(fileUpload)

               郵件發送:1個jar javamail

               JSP:2個jar,jstl和el表達式(因為使用JSP,可能需要使用自定義標簽或者別的標簽,所以就先將其帶入進來,以防不備之需)   

               beanUtils:2個jar beanutils和logging。(我沒用beanUtils) 

      3.2、編寫代碼

          1、開發環境搭建好之後,首先將使用dbutils框架將連接數據庫的代碼編寫好。

          2、按照上面的模塊進行編寫,首先是用戶模塊的註冊,登錄,從JSP寫到Servlet到service層到dao層。就這樣從前寫到後的順序編寫。

          3、其他就是按部就班了,當真正開始編寫時,一切就會能按照自己的思路進行下去,而不是像一開始那樣,無從下手。

      3.3、註意,

          這裏編寫servlet時使用了反射機制,目的是為了減少servlet的個數,而為了簡化servlet個數的方式有兩種。

          第一種。

              還是按照老的方式,繼承httpServlet,重寫doGet和doPost方法,在發送請求時,把需要訪問的servlet方法用參數的方式傳過去,然後在serlvet內部判斷請求參數是需要調用哪個方法,將方法體都寫在該servlet下面,在doget或者dopost方法內調用即可。

              技術分享

      第二種

          利用反射機制,反射加載對應方法。此時需要大家了解servlet的生命周期經歷的三個方法,最重要的是知道訪問servlet會進過service方法。知道了這個一切就好辦了,編寫一個通過的servlet,取名為BaseServlet。

            技術分享

        分析:將所有的方法都寫在一個新的servlet類中,該類就繼承BaseServlet。當訪問新的servlet類中,因為需要執行service方法,而子類中並沒有,就到父類BaseServlet中去尋找並執行,在在父類中會將拿到要執行的方法名,通過反射機制,去執行子類中對應的方法,所以就將需要執行的方法和service只能夠代碼分離開了,在子類中全部都是需要編寫的邏輯代碼。不用對method進行判斷從而選取對應方法進行執行,省去了很多麻煩,使代碼更加簡潔,易懂。

四、總結

      通過這個項目,使自己對三層經典架構理解的更加深刻,並且對於web中的大大小小的知識點進行了鞏固,JSP中的四大作用域,9大內置對象,el表達式的使用,發送郵件,在線支付環節等等很多知識,並且通過servlet+JSP+數據庫的模式確實比較復雜,從而知道了使用框架的好處,便於開發。

      現在獻出該項目源代碼,希望對大家有所幫助。

      

      http://pan.baidu.com/s/1i4W79BZ    67me

     

       

            

      

  

Java Web(十四) 編寫MyBookStore項目的總結