1. 程式人生 > >【JavaWeb】圖書管理系統【總結】

【JavaWeb】圖書管理系統【總結】

感想

該專案是目前為止,我寫過程式碼量最多的專案了…..雖然清楚是沒有含金量的【跟著視訊來寫的】,但感覺自己也在進步中……

寫的過程中,出了不少的問題…..非常多的Servlet,JSP看得眼花…..

現在,想把該專案好好梳理一下要點,於是有了這篇博文….

E-R圖

該專案涉及到了5個表:user、orders、orderItem、category、book

這裡寫圖片描述

難點

E-R圖設計中最難的地方就是做到訂單模組那裡…..

難點一

首先,要明白為什麼在訂單模組中設計Orders和OrderItem表兩張表,而不是一張表Orders就搞掂了…當然了,這也可參考購物車案例的設計【Cart、CartItem】

  • 因為訂單模組分了兩個部分,一部分是顯示普通的訂單資訊【定單人、價錢、訂單時間、訂單狀態】
  • 而在後臺中,我們還要在顯示訂單普通訊息時,給予檢視詳細資訊的功能【也就是訂單的具體內容:具體的商品價錢、數量】

難點二:

訂單模組我是最後才開始寫的,訂單模組和使用者模組、圖書模組都有相連,這就複雜了不少….

  • 一個使用者可以擁有多個訂單
  • 一個訂單對應多個訂單項
  • 一本圖書對應多個訂單項

難點三:

  • 在一對多和多對一的情況下,我們在考慮需不需要使用一方來維護另一方的時候。在原則上,我們都是使用多的一方來維護一的一方。
  • 那為什麼有的時候,上面這句話就不成立了呢??是這樣子的:當我們一的方在頁面展示的時候,多的一方資料需要同時展示。
    此時,我們就需要在一的一方使用集合來維護多的一方了。比如:我們檢視訂單的時候,就肯定需要同時把所有的訂單項都查詢出來的。當檢視購物車的時候,就肯定需要同時把購物項查詢出來的
  • 而我們的分類與書籍就沒有同時這個概念。在頁面上,我們是點選分類,才需要把書籍查詢出來。因此,我們是使用多的一方來維護一的一方。
  • 如果使用了一的一方來維護多的一方的話,那麼一般都沒必要在多的一方來使用變數來維護一的一方了[參照訂單與訂單項]

    Ps: 如果這部分有錯的地方請指出,謝謝!

專案中遇到的要點

  1. 在Tomcat中建立資料夾不能是manager,不然會出現403 Access Denied錯誤
  2. frameset標籤是可以巢狀的,分列用“cols”,分行用“rows”
    ,在src後指定target,後面request跳轉顯示的頁面都是在target指定的頁面上
  3. 實現分頁主要在Page類上編寫程式碼,在DAO層中要獲取總記錄數、分頁資料。start和end引數是通過currentPage和linesize來計算出來的。
  4. 獲取分類後的分頁資料,需要在DAO層中獲取分類後的總記錄數,以分類作為WHERE條件得到分頁資料
  5. 提交表單中有上傳檔案的話,我們可以使用FileUpload元件。普通欄位我們使用BeanUtils的setProperty()來封裝資料到Bean物件上,檔案我們就寫到服務端的指定目錄下
  6. 在分幀頁面上,如果首頁就要顯示資料了,我們可以在frame標籤的src上指定的是Servlet,Servlet再跳轉回JSP,這樣JSP頁面就有資料了!
  7. 如果想要div不全是浮動,我們可以在後邊跟一個清除浮動的div。<div style="clear: both"></div>
  8. 想要頁面上的按鈕能夠完成對應的功能,需要用到JavaScript程式碼,通過DOM程式設計得到對應的資料,使用window.location.href,讓它跳轉到對應的Servlet上實現功能
  9. Cart和CartIem的設計上,CartItem的總價是數量*價錢,Cart的總價是全部CartItem的價錢之和。
  10. Cart應該提供把商品加到購物車的功能,判斷該商品的購物項是否存在,不存在著建立並儲存在裡邊。存在則購物項的數量+1
  11. BussinessService提供購買功能,引數是Cart和Book。
  12. 使用者想要購買商品時,判斷使用者是否登陸了,還要判斷購物車是否存在【購物車使用Session來儲存】,不存在則建立。
  13. Mysql中不能將表命名為“order”,這樣會出錯
  14. 訂單的基本資訊可以在Cart和User中獲取,訂單項的基本資訊可以在CartItem中獲取。因此,在BussinessService中需要Cart【通過Cart就可以找到CartItem了】和User引數。
  15. 在生成訂單的Dao中,需要把訂單的基本資訊,訂單項的基本資訊封裝到資料庫中
  16. 通過id查詢訂單的時候,先找出訂單的基本資訊訂單表和使用者表聯結,就可以查找出訂單的使用者。通過id也就可以查找出訂單中所有的訂單項了。最後把查找出來的資料全部封裝到訂單物件上。
  17. 想要讓未發貨的訂單變成已發貨,其實就是更新訂單的狀態。得到未發貨的全部訂單和已發貨的全部訂單,其實就是檢索出不同狀態的全部訂單
  18. Dao層中,我們需要的引數往往是單一的,要麼是具體的物件,要麼就是id…然而在Service層中,我們要的引數是與該實體類相連的
    • 例子1:在生成訂單的時候,Dao層僅僅需要Order物件引數。在Service層中,Order需要把User、Cart的資料封裝到Order物件中,於是就需要了這兩個引數
    • 例子2:Cart提供了把商品新增到購物車的功能,引數只需要具體商品的id。而在Service中,它需要使用者的購物車物件和具體商品的id。

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y