技術棧 Servlet + Jsp + Tomcat , 是Java Web入門非常好的練手項目 ...
Tmall_JavaEE
技術棧 Servlet + Jsp + Tomcat , 是Java Web入門非常好的練手項目
項目簡介
關聯項目
github - 天貓 JavaEE 項目
github - 天貓 SSH 項目
github - 天貓 SSM 項目
本項目為Java EE入門練手項目,沒有使用 SSH , SSM 框架,而是使用 JavaEE 整套技術來作為解決方案,實現模仿天貓網站的各種業務場景。 之所以不使用框架,就是為了藉助這個項目夯實 JavaEE 基礎,並且在項目中藉助反射等技術。
項目用到的技術如下:
Java:Java SE基礎
前端:HTML
,CSS
,JavaScript
,jQuery
J2EE:Tomcat
,Servlet
,JSP
,Filter
資料庫:MySQL
表結構
建表sql 已經放在 Github 項目的 /sql 文件夾下
表名 | 中文含義 | 介紹 |
---|---|---|
Category | 分類表 | 存放分類信息,如女裝,平板電視,沙發等 |
Property | 屬性表 | 存放屬性信息,如顏色,重量,品牌,廠商,型號等 |
Product | 產品表 | 存放產品信息,如LED40EC平板電視機,海爾EC6005熱水器 |
PropertyValue | 屬性值表 | 存放屬性值信息,如重量是900g,顏色是粉紅色 |
ProductImage | 產品圖片表 | 存放產品圖片信息,如產品頁顯示的5個圖片 |
Review | 評論表 | 存放評論信息,如買回來的蠟燭很好用,麽麽噠 |
User | 用戶表 | 存放用戶信息,如斬手狗,千手小粉紅 |
Order | 訂單表 | 存放訂單信息,包括郵寄地址,電話號碼等信息 |
OrderItem | 訂單項表 | 存放訂單項信息,包括購買產品種類,數量等 |
一 | 多 |
---|---|
Category-分類 | Product-產品 |
Category-分類 | Property-屬性 |
Property-屬性 | PropertyValue-屬性值 |
Product-產品 | PropertyValue-屬性值 |
Product-產品 | ProductImage-產品圖片 |
Product-產品 | Review-評價 |
User-用戶 | Order-訂單 |
Product-產品 | OrderItem-訂單項 |
User-用戶 | OrderItem-訂單項 |
Order-訂單 | OrderItem-訂單項 |
User-用戶 | User-評價 |
以上直接看可能暫時無法完全理解,結合後面具體到項目的業務流程就明白了。
實體類設計
所謂的實體類,就是對於資料庫中的表的互相映射的類。
這是一種 ORM 的設計思想,即一個對象,對應資料庫里的一條記錄
舉個例子,對於 評價 / review
的 實體類 和 表結構 設計如下:
已省略對應的 getter/setter 方法
DAO 類設計
DAO 是 Data Access Object 的縮寫,專門用於進行資料庫訪問的操作。
首先看一下資料庫工具類
DBUtil
這個類的作用是初始化驅動,並且提供一個 getConnection 用於獲取連接,統一管理連接參數,方便後續操作。
CategoryDAO
利用 DBUtil 獲取 Connectoion ,再獲取對應的 Statement,利用 JDBC 從資料庫取出數據,並構造成 bean 對象返回。
Service 類
作為J2EE web 應用,一般會按照如圖所示的設計流程進行
Servlet -> Service(業務類) -> DAO -> database
在本模仿天貓整站 JavaEE 版本中,不使用 Service 這一層。 原因是在 DAO 進行了比較詳細的設計,已經提供了很好的支持業務的方法。如果在 DAO 上包裹一層 Service 業務類,不過是在直接調用 DAO 設計好的方法罷了。另外一個使用框架的項目會用到 Service 層。
Filter 配合 Servlet
後臺在系統設計的時候,並不是簡單的每個功能對應一個 Servlet ,而是使用了反射的技術,結合過濾器Filter 進行了封裝,使得開發配置以及維護成本降低了很多。
一個路徑對應一個 Servlet 的弊端
這裡以分類進行舉例:
分類管理需要:增加,刪除,編輯,修改,查詢 5 個功能,按照傳統的在 web.xml 中配置 Servlet 的思路,那麼就需要 5 個 Servlet 類,而後臺需要做分類,產品,屬性,產品圖,用戶,訂單 6 中管理,就一共需要30 個 Servlet,還要配置 web.xml 就會變得很亂。
解決的方法是把所有分類操作放在同一個 Servlet ,對應不同的方法。
讓我們來分析,如何做到訪問 admin_category_list 的時候,CategoryServlet 的 list() 方法會被調用:
- 假設訪問路徑是 /admin_category_x
- 過濾器 BackServletFilter 進行攔截,判斷訪問的地址是否以/admin_開頭
- 如果是,那麼做如下操作
3.1 取出兩個下劃線之間的值 category
3.2 取出最後一個下劃線之後的值 x
3.3 然後根據這個值,服務端跳轉到 categoryServlet,並且把 x 這個值傳遞過去
- categoryServlet 繼承了 BaseBackServlet,其 service 方法會被調用。 在 service 中,藉助反射技術,根據傳遞過來的值 x,調用對應 categoryServlet 中的方法 x()
- 這樣就實現了當訪問的路徑是 admin_category_list 的時候,就會調用 categoryServlet.x() 方法這樣一個效果
換句話說:
如果訪問的路徑是 admin_category_add,就會調用 categoryServlet.add() 方法
如果訪問的路徑是 admin_category_delete,就會調用 categoryServlet.delete() 方法
BackServletFilter
BaseBackServlet
Github-BaseBackServlet 完整代碼
BaseBackServlet 繼承了 HttpServlet 並重寫了 service 方法,其核心代碼如下:
另外還定義了增刪查改等基礎抽象方法,初始化了所有 DAO 對象
上圖已經註釋的很清楚了,項目全部代碼都放在 github 上了,歡迎查看。
CategoryServlet
- 首先 CategoryServlet 繼承了 BaseBackServlet,而 BaseBackServlet 又繼承了 HttpServlet
- 服務端跳轉過來之後,會訪問 CategoryServlet 會訪問 service() 方法
- 父類 BaseBackServlet中重寫了 service() 方法,所以流程就進入到了 service() 中
3.1 在 service() 方法中根據反射訪問對應的方法
3.2 根據對應方法的返回值,進行服務端跳轉、客戶端跳轉、或者直接輸出字元串。
- 取到從 BackServletFilter 中 request.setAttribute() 傳遞過來的值 list
- 根據這個值 list,藉助反射機制調用 CategoryServlet 類中的 list() 方法,這樣就達到了CategoryServlet.list()方法被調用的效果
而後,list 方法使用 categoryDAO.list 查詢出 category 對象集合,並跳轉到 listCategory.jsp 顯示
完整版的 listCategory.jsp 還包含4個公共文件,分別是 頭部,導航,行業,頁腳。
分類管理還有增加,編輯,修改,刪除,分頁,另外後臺其他管理頁面,前臺頁面。具體的需要瀏覽代碼,篇幅原因就不展開了。
頁面展示
本篇博客所講不足整個項目的 1/10 ,有興趣的朋友請移步 github 項目的地址 。
參考
天貓整站學習教程 裡面除了本項目,還有 Java 基礎,前端,Tomcat 及其他中間件等教程, 可以註冊一個賬戶,能保存學習記錄。