JavaWeb入門_模仿天貓整站Tmall_JavaEE實踐項目_學習心得

来源:https://www.cnblogs.com/czwbig/archive/2018/11/13/9950134.html
-Advertisement-
Play Games

技術棧 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 對象返回。
CategoryDAO.list


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() 方法會被調用:

  1. 假設訪問路徑是 /admin_category_x
  2. 過濾器 BackServletFilter 進行攔截,判斷訪問的地址是否以/admin_開頭
  3. 如果是,那麼做如下操作
    3.1 取出兩個下劃線之間的值 category
    3.2 取出最後一個下劃線之後的值 x
    3.3 然後根據這個值,服務端跳轉到 categoryServlet,並且把 x 這個值傳遞過去
  4. categoryServlet 繼承了 BaseBackServlet,其 service 方法會被調用。 在 service 中,藉助反射技術,根據傳遞過來的值 x,調用對應 categoryServlet 中的方法 x()
  5. 這樣就實現了當訪問的路徑是 admin_category_list 的時候,就會調用 categoryServlet.x() 方法這樣一個效果

換句話說:
如果訪問的路徑是 admin_category_add,就會調用 categoryServlet.add() 方法
如果訪問的路徑是 admin_category_delete,就會調用 categoryServlet.delete() 方法

BackServletFilter

Github-BackServletFilter 完整代碼

BaseBackServlet

Github-BaseBackServlet 完整代碼
BaseBackServlet 繼承了 HttpServlet 並重寫了 service 方法,其核心代碼如下:

BaseBackServlet .service()

另外還定義了增刪查改等基礎抽象方法,初始化了所有 DAO 對象
上圖已經註釋的很清楚了,項目全部代碼都放在 github 上了,歡迎查看。

CategoryServlet

Github-CategoryServlet 完整代碼

  1. 首先 CategoryServlet 繼承了 BaseBackServlet,而 BaseBackServlet 又繼承了 HttpServlet
  2. 服務端跳轉過來之後,會訪問 CategoryServlet 會訪問 service() 方法
  3. 父類 BaseBackServlet中重寫了 service() 方法,所以流程就進入到了 service() 中
    3.1 在 service() 方法中根據反射訪問對應的方法
    3.2 根據對應方法的返回值,進行服務端跳轉、客戶端跳轉、或者直接輸出字元串。
  4. 取到從 BackServletFilter 中 request.setAttribute() 傳遞過來的值 list
  5. 根據這個值 list,藉助反射機制調用 CategoryServlet 類中的 list() 方法,這樣就達到了CategoryServlet.list()方法被調用的效果

CategoryServlet.list()

而後,list 方法使用 categoryDAO.list 查詢出 category 對象集合,並跳轉到 listCategory.jsp 顯示

listCategory.jsp 部分

localhost/admin_category_list 訪問效果

完整版的 listCategory.jsp 還包含4個公共文件,分別是 頭部,導航,行業,頁腳。
分類管理還有增加,編輯,修改,刪除,分頁,另外後臺其他管理頁面,前臺頁面。具體的需要瀏覽代碼,篇幅原因就不展開了。

頁面展示

前臺首頁

產品頁

本篇博客所講不足整個項目的 1/10 ,有興趣的朋友請移步 github 項目的地址

參考

天貓整站學習教程 裡面除了本項目,還有 Java 基礎,前端,Tomcat 及其他中間件等教程, 可以註冊一個賬戶,能保存學習記錄。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個常見的場景,獲取:標簽背景圖片鏈接: 如字元串:var bgImg = "url(\"https://img30.360buyimg.com/sku/jfs/t26203/262/100869187/204098/1d1479e9/5b84b80bNf39db45f.jpg\")"; 腳本: 劃 ...
  • 1 'use strict' 2 3 function 找出最長公子串 (...strings) { 4 let arraiesOfSubStrings = [] 5 arrayOfStrings.reduce((accumulator, currentValue) => { 6 arraiesOf... ...
  • 大家在做http請求的時候可能會遇到跨域問題,這裡為大家提供解決方案,親自實驗有效。 一般是報上述錯誤。 首先在C盤新建一個文件夾,命名按照下麵的來。 打開谷歌瀏覽器的設置 在“目標” 的exe後面添加下麵這段內容,不要忘記打空格。並且下麵這段內容不要放在包含“exe”的雙引號裡面,放在外面 --d ...
  • 分頁介面的實現,在偏業務的服務端開發中應該很常見,PC時代的各種表格,移動時代的各種 流、 。 出於對流量的控制,或者用戶的體驗,大批量的數據都不會直接返回給客戶端,而是通過分頁介面,多次請求返回數據。 而最常用的分頁介面定義大概是這樣的: 介面傳入請求的頁碼、以及每頁要請求的條數,我個人猜想這可能 ...
  • InfoQ 上有推薦過這本書的。結合我們自己項目的經驗來看,這本書還是相當有可操作性,對於採用scrum不是很久的同學,特別是從傳統軟體開發模式轉過來的同學,相當有幫助 Scrum敏捷軟體開發》是敏捷聯盟及Scrum聯盟創始人之一、敏捷估算及計劃的鼻祖Mike Cohn三大經典著作中影響最為深厚的扛 ...
  • Spring 是什麼? Spring 是一個開源的輕量級 Java SE( Java 標準版本)/Java EE( Java 企業版本)開發應用框架,其目的是用於簡化企業級應用程式開發。在傳統應用程式開發中,一個完整的應用是由一組相互協作的對象組成的。所以開發一個應用除了要開發業務邏輯之外,最多的是 ...
  • 撩課Java+系統架構 視頻 點擊開始學習 31.靜態變數和實例變數的區別? 靜態變數也叫類變數, 這種變數前加了static修飾符。 可以直接用類名調用, 也可以用對象調用, 而且所有對象的同一個類變數 都是共用同一塊記憶體空間。 實例變數也叫對象變數, 這種變數沒有加static修飾符。 只能通過... ...
  • #!/usr/bin/env python # -*- coding: utf-8 -*- name = input("Name:") age = input("Age:") job = input("Job:") hobbie = input("Hobbie:") info = ''' -----... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...