天天看點

JavaWeb項目詳解系列2-4(基于How2j天貓J2EE項目:前台業務邏輯)0 項目來源與閱讀建議1概念厘清:前台與前端2首頁3無需登入的前台操作4需要登入的前台操作5小結(重要)與預告

分頁

  • 0 項目來源與閱讀建議
    • 項目來源
    • 價格
    • 閱讀建議
  • 1概念厘清:前台與前端
  • 2首頁
  • 3無需登入的前台操作
    • 3.1浏覽
    • 3.2注冊
    • 3.3登入
  • 4需要登入的前台操作
    • 4.1針對OrderItem的操作
    • 4.2針對Order的操作
    • 4.3評價
  • 5小結(重要)與預告

0 項目來源與閱讀建議

項目來源

http://how2j.cn/k/tmall-j2ee/tmall-j2ee-894/894.html?p=66748

注冊的時候用這個連結,謝謝啦!

價格

92 * 0.8

閱讀建議

  1. 本教程與站長的官方教程互為補充,并不是取而代之,也做不到取而代之。站長是以老師的身份告訴你怎麼寫,我是以課代表的身份告訴你,我是怎麼學的。
  2. 本教程應當在你做完站長相對應部分的内容之後,再來看。也就是說,在看本教程之前,你應當對站長對應章節的内容有了一定的了解和基礎,不然某些詞語你可能聽不懂。
  3. 我在How2j的ID名叫HuangTY,我喜歡分享大家存在的問題,是以也希望大家能夠在評論區多多留言,共同進步。

1概念厘清:前台與前端

前端指的是JS+CSS+HTML那一套,主要負責展示和互動。當然因為本人前端接觸的很少,這隻是我的一點看法。那你問我JSP是前端還是後端呢?JSP是前端和後端雜糅在一起的産物,因為JSP本質上就是HTML+Servlet的合體嘛。在MVC開發模式中,JSP主要用于顯示資料,那麼JSP在這個模式裡的作用就是前端。

現在流行的開發模式是前後端分離,本來嘛,前端程式員幹前端的事情,後端幹後端的事情,術業有專攻。隻要你們約定好接口,這樣能大幅度的提高效率,也不至于互相扯皮。

那前台又是什麼呢?于一個網站,分為普通使用者和管理者。普通使用者登入檢視的就是前台,管理者操作的就是背景,他們之間隻有業務或者說功能不同,但沒有技術的差異。本質上都是一個網站,隻不過對不同的權限的人開放了不同的功能罷了。

如果你用過WordPress之類的東西,就會更加明白這個差別。總而言之,前端與後端開發的主要差別在于技術棧,前台與背景的差別主要在于業務與功能。

2首頁

首頁是用來展示分類及部分商品資訊的,前台需要顯示的内容有:

  1. 商品分類。
  2. 商品分類中的部分屬性展示。
  3. 圖檔輪播。
  4. 分類中的部分産品展示。

    前台功能均不涉及分頁。

這邊隻要看foreServlet中的home()方法和home檔案下的jsp即可。

那麼考慮一下,我們需要給前台傳哪些資料呢?

  1. foreServlet中的home()方法中,将Category對象:cs,傳給了categoryAndcarouse.jsp。前端有了cs就可以周遊擷取名稱并顯示,可以在超連結标簽中寫超連結。
  2. homepageCategoryProducts.jsp用于顯示首頁下半部分各個分類彙總的商品介紹及縮略圖,仍然接收Category對象cs。還記得Bean中Category類中存在list<Product>對象嗎?cs.products即可獲得目前cs下的商品,然後你就可以把它們顯示出來了。
  3. productsAsideCategorys.jsp用于當你滑鼠滑過左側分類資訊之後,會在右側顯示一些相關資訊,這些相關資訊并不是分類的屬性,而是cs的productbyRow這個list中product的subtitle。簡單而言,隻要你穿了category對象cs到前台,并且這個cs是使用過fill()方法的,那麼就可以實作上述功能。

    其它:

    carousel.jsp:前端知識,顯示靜态資源。

3無需登入的前台操作

假如你上了天貓,但是沒有賬号,那你能做什麼或者說向做什麼呢?

  1. 浏覽。包括看看分類,看看具體商品,随便點選看看有哪些東西。
  2. 注冊。萬一覺得這個網站還不錯,就要注冊一個賬号,便于以後剁手。
  3. 登入。注冊完了總得登入吧。而且當然,在你做登入這個操作的時候,你一定是還沒登陸的。嘿,這不是廢話嗎。

    那麼我們就一個一個來說

3.1浏覽

浏覽主要分為1.看商品整合頁,2.看具體商品頁

1. 商品整合頁

什麼叫商品整合頁呢?首頁就是最明顯的,是把不同的産品展示出來。還有當你搜尋某個關鍵詞的時候,出來的也是商品整合頁。或者當你電機某個分類的時候,出現的也是商品整合頁。

1.1 分類頁

業務功能:點選首頁左邊欄分類欄中的某個具體名錄,可以展示出選中分類下具體商品。

Servlet:foreServlet中的category()方法。

方法實作:選中的分類主鍵為cid,在product表中查詢所有外鍵cid與之相等的,并顯示出來。采用重寫比較器的方式實作排序。注意,這裡也展現了兩種排序方式的差別(一種:繼承Comparable,另一種實作Comparator)。繼承因為是單繼承,是以排序隻能進行單一排序,但是實作接口的方式可以實作多個比較器,進而達到利用多個比較器比較的效果,這是設計模式中的政策設計模式。

Jsp:為了實作業務功能,前端必須要告訴後端cid是什麼,這個操作是通過點選分類标簽所引發的超連結傳遞參數的。為了實作比較功能,前端必須告訴後端以什麼樣的形式排序,這是通過sortBar.jsp實作的,點選對應的排序标簽就發送對應參數到servlet中。productsByCategory.jsp中主要用來展示商品資訊,這裡不再贅述。

1.2 搜尋頁

業務功能:在搜尋欄中輸入關鍵詞,可以顯示出包含該關鍵詞的對應商品。

Servlet:foreServlet中的search()方法。在product表中利用sql語句中的like進行模糊查詢,查詢的标準是搜尋的關鍵詞中包含于産品的名稱中。

方法實作:查詢出的所有product放于List容器中,通過域對象傳參到前端。這個List<Product>需要設定評論數以及銷量,因為前端需要展示這些資料。

Jsp:search.jsp與simpleSearch.jsp都可以了解為是一個輸入空間,用于向背景送出關鍵字資訊。searchPage.jsp包含檔案productsBySearch.jsp。這個jsp中利用servlet中傳來的域對象進行資料的展示,至于怎麼展示就是前端的工作,不做介紹。

2 具體商品頁

什麼叫具體商品頁呢?我們之前查詢的結果都是一堆産品,可以了解為要麼我們是通過cid(分類主鍵)擷取商品s,要麼是通過商品關鍵字來擷取商品s。商品s表示擷取到的資料通常為一堆商品。接下來,我們往往會點進去一個商品檢視詳細内容,這個就叫做具體商品頁。

業務功能:展示具體的商品資訊。

Servlet:foreServlet中的product()方法。将相關商品的屬性,關聯的圖檔,圖檔,商品屬性等都傳遞到前端。

方法實作:擷取一系列的前端想要展示出的資料,并通過域對象傳到前端。

Jsp:主要用于商品展示,拿到資料後基本就是前端的工作了。

3.2注冊

registerPage.jsp裡通過form送出資料,通過register()方法進行處理,并添加到資料庫中。唯一可說的就是——

将html辨別符轉義。具體内容可以看這個連結:https://www.xuebuyuan.com/2100005.html

3.3登入

登入和注冊代碼基本類似,差別是:注冊是對資料庫進行add操作,登入是對資料庫進行select操作。

登出:隻要把域對象中的user删除即可。在其他用到user的地方都要做為空判斷,如果不存在user這個域對象,那麼就說明沒有沒有登入,邏輯就那麼簡單直接。

servlet中對應的方法分别是login(),logout()。

值得一提的在模态登入中,前端采用了Ajax的技術與背景進行異步通信。

業務功能:在具體商品頁面,點選購買或加入購物車。

Servlet:在imgAndInfo.jsp中當點選加入購物車或者立即購買時,采用ajax方式調用servlet中的checkLogin()方法,如果傳回值不是success則打開模态登入。

方法實作:checkLogin()負責傳回success或者fail。但是問題來了,我們明明看到傳回值是“%success”,但是前端裡的判斷卻是“result==success”,請問那個%去哪裡了呢?在BaseForeServlet中我們寫過如下的代碼——

else if(redirect.startsWith("%"))
    response.getWriter().print(redirect.substring(1));
           

這邊給你的啟示就是,前端ajax獲得的result并不是從域對象中擷取,而是從response中後擷取。是以異步通訊,簡單了解就是當你點下立即購買的按鍵之後,啟動了一個小線程,這個小線程發送了1個request進了servlet中,調用了checkLogin()方法,此時傳回值為“%success”,然後response向浏覽器寫資料的時候用了substring(1)。是以變成了success。

至于登入的方法為loginAjax()非常簡單,不在贅述。

Jsp:modal.jsp與imgAndInfo.jsp中都運用到了前端的不少知識,但是你隻要知道我上述說的ajax内容就好。如果之後有時間,我再單獨把前端及JSP的知識點拿出來。還是那句話,我現在的教程隻針對後端,目前隻需要了解後端需要給前端發什麼資料,後端需要前端發來什麼資料即可。

4需要登入的前台操作

總流程分别是,加入購物車/直接購買,結算頁面,訂單頁操作。這邊主要都是對表的操作,代碼不複雜,但是業務邏輯要搞清楚。

JavaWeb項目詳解系列2-4(基于How2j天貓J2EE項目:前台業務邏輯)0 項目來源與閱讀建議1概念厘清:前台與前端2首頁3無需登入的前台操作4需要登入的前台操作5小結(重要)與預告

我并不準備按照站長的思路(按照購物順序)來介紹,我認為,應該以Order和OrderIteam為核心進行分别介紹。

4.1針對OrderItem的操作

首先必須厘清,OrderItem到底是什麼。OrderItem并不是Order中的元素,它表示了有可能要放入或者已經放入訂單中的元素,在本文的業務場景中,可以認為,訂單項不是在購物車中,就是在訂單中。因為訂單項隻會由于增加購物車或者操作訂單而産生。

是以,所有所有購物的流程都是先操作OrderItem,再操作Order的。

搞清楚這個基本邏輯之後,我們看看,購物的時候哪些是要對OrderItem進行操作的:

  1. 直接購買

    對應方法:buyone()。訂單項的基本資訊包括商品,使用者,數量。這裡的操作相當于添加了一個OrderItem記錄,這個記錄就好比說是吃火鍋前準備的菜,下不下鍋還不一定(是否成為Order還不一定)。

    這個是跳轉到buy()方法中繼續處理的。

  2. 加入購物車

    對應方法:addCart()。和buyone()類似,但是我自己做了個業務上的差別,我認為直接下單的行為并不需要考慮購物車中有沒有同類商品,添加購物車的時候需要考慮。

    業務邏輯:這裡的業務邏輯是核對目前使用者購物車内有沒有相同的産品,有的話就增加數量即可,沒有的話就新增一個訂單項記錄。換而言之,存在相同商品則update,不存在則add。

    這個是response一個success,說明已經添加成功。為什麼不跳轉到其他的頁面呢?你想想看你在天貓的購物場景,加入購物車之後,自己還在目前界面。

  3. 檢視購物車

    對應方法:cart()。這個方法其實就是對OrderItem表進行查詢操作,查詢的條件是使用者為目前使用者。

  4. 操作購物車

    對應方法:changeOrderItem()和deleteOrderItem()。就是對OrderItem的改和删操作。這兩個操作都要先判斷使用者是否登陸。其實我也不太明白這邊為什麼要判斷,感覺按照業務邏輯,能到這裡一定是登陸的使用者。然後利用DAO的方法對相應的訂單項進行修改或删除即可。

  5. 購買

    對應方法:buy()。這個方法無論針對購物車的下單行為還是針對1.直接購買的下單行為,都可以。這是因為如果前端使用者是直接下單行為,那麼傳遞來的參數就是一個oiid,如果是在購物車頁面合并下單,那傳遞來的參數就是多個oiid。

    将這些oiid對應的OrderItem放置到一個List中,作為域對象發送到前端。當然,傳過去的資料還要包括購物總金額之類前端需要顯示的資料。跳轉到buy.jsp,所展示的就是訂單項和總價格,需要輸入的就是一些訂單的基本資訊。

    從buy.jsp,就開始了從OrderItem到Order的華麗轉身。

4.2針對Order的操作

  1. 建立訂單。

    對應方法:createOrder()。将List<OrderItem>放入訂單對象Order中,并且對表進行操作,從前端buy.jsp中擷取對應的表單資料,通過set方法完善Order對象,并添加至資料庫中。

    傳回值為forealipay界面,跳轉到支付界面。

  2. 支付完畢。

    對應方法:payed()。支付完畢會顯示一個已經成功支付的頁面,payed.jsp。我們需要傳遞給前端一些參數以供顯示,除此之外,也是在這個函數裡通過set方法設定了訂單的付款時間以及訂單狀态。

    說到這個訂單的标記資訊,其實就是一堆枚舉值,用來維護訂單的狀态值,比如說1代表未下單,2代表已發貨等等。

  3. 檢視訂單。

    對應方法:bought()。Order表的查詢方法,查詢所有狀态不為delete的。站長表示,訂單是使用者的重要資訊,是以通常不删除記錄,而是标記為删除,這個查詢就是查詢所有未标記為删除的訂單。交給前台展示。

  4. 确認付款與确認訂單。

    對應方法:confirmPay()。沒什麼好說的,前台要展示你确認收貨了什麼東西,是以要給一些域對象資料。

  5. 删除訂單。OrderDAO的update(),如上文所說,把狀态值改為delete即可。

4.3評價

  1. 跳轉到評價頁面。

    對應方法:review()。這個方法并不是讓你寫評價,而是為了在寫評價的頁面上展示一些東西。比如展示你買的是什麼,花了多少錢,訂單裡面有哪些訂單項,已經别人已經寫得評價和評價數量。

  2. 在評價頁面送出評價。

    對應方法:doreview()。送出評價後,要對資料庫進行操作。

5小結(重要)與預告

寫這篇文章的時候,我才發現,後端程式servlet其實核心思想非常重要,那就是派發。你要很清楚,servlet寫的那些方法,本質上都是controller層,是控制器,做的是派發的工作。

什麼叫派發?

  1. 前端需要顯示的資料,後端需要通過servlet中service方法調用對應方法,在這個方法裡調用Model層的東西(DAO或實體類),擷取資料後,交給前端。從資料庫的角度來說,這叫查詢。從後端的角度來說,這叫寫出。
  2. 前端需要送出的資料,後端一樣的,擷取資料并放入資料庫。從資料庫的角度來說,這是增删改。從後端的角度來說,這叫寫入。

    這是從MVC整體架構的角度,高屋建瓴的看到這裡的所有業務邏輯。

    或許有的業務邏輯隻有1,就是顯示,比如說上面分析過的不需要登入的功能,基本都是顯示,是以隻要從資料庫裡讀,把資料寫入域對象,前台把域對象拿出來即可,這種需求通常傳回值為xxx.jsp。

    有的業務隻有2,比如說添加購物車就是比較典型的,添加完之後,仍然停留在目前界面,不需要跳轉到别的頁面顯示,這種一般傳回值為%,表示不需要做跳轉。

    有的業務既有2又有1,對資料庫做完操作後,要跳轉到另一個界面做顯示。那在做2的方法傳回值通常為一個servlet方法,而這個servlet方法中做的是1的操作,然後傳回一個xxx.jsp。

    隻有了解了我上面說的這些,我認為才真正從俯視圖上了解了MVC,了解了servlet+jsp+Bean+DAO架構,以後自己寫業務代碼的時候才能做到知其是以然。

預告

下一章講解背景業務邏輯,至于JSP講不講,看我有沒有空學習JSP。

繼續閱讀