分頁
- 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
閱讀建議
- 本教程與站長的官方教程互為補充,并不是取而代之,也做不到取而代之。站長是以老師的身份告訴你怎麼寫,我是以課代表的身份告訴你,我是怎麼學的。
- 本教程應當在你做完站長相對應部分的内容之後,再來看。也就是說,在看本教程之前,你應當對站長對應章節的内容有了一定的了解和基礎,不然某些詞語你可能聽不懂。
- 我在How2j的ID名叫HuangTY,我喜歡分享大家存在的問題,是以也希望大家能夠在評論區多多留言,共同進步。
1概念厘清:前台與前端
前端指的是JS+CSS+HTML那一套,主要負責展示和互動。當然因為本人前端接觸的很少,這隻是我的一點看法。那你問我JSP是前端還是後端呢?JSP是前端和後端雜糅在一起的産物,因為JSP本質上就是HTML+Servlet的合體嘛。在MVC開發模式中,JSP主要用于顯示資料,那麼JSP在這個模式裡的作用就是前端。
現在流行的開發模式是前後端分離,本來嘛,前端程式員幹前端的事情,後端幹後端的事情,術業有專攻。隻要你們約定好接口,這樣能大幅度的提高效率,也不至于互相扯皮。
那前台又是什麼呢?于一個網站,分為普通使用者和管理者。普通使用者登入檢視的就是前台,管理者操作的就是背景,他們之間隻有業務或者說功能不同,但沒有技術的差異。本質上都是一個網站,隻不過對不同的權限的人開放了不同的功能罷了。
如果你用過WordPress之類的東西,就會更加明白這個差別。總而言之,前端與後端開發的主要差別在于技術棧,前台與背景的差別主要在于業務與功能。
2首頁
首頁是用來展示分類及部分商品資訊的,前台需要顯示的内容有:
- 商品分類。
- 商品分類中的部分屬性展示。
- 圖檔輪播。
-
分類中的部分産品展示。
前台功能均不涉及分頁。
這邊隻要看foreServlet中的home()方法和home檔案下的jsp即可。
那麼考慮一下,我們需要給前台傳哪些資料呢?
- foreServlet中的home()方法中,将Category對象:cs,傳給了categoryAndcarouse.jsp。前端有了cs就可以周遊擷取名稱并顯示,可以在超連結标簽中寫超連結。
- homepageCategoryProducts.jsp用于顯示首頁下半部分各個分類彙總的商品介紹及縮略圖,仍然接收Category對象cs。還記得Bean中Category類中存在list<Product>對象嗎?cs.products即可獲得目前cs下的商品,然後你就可以把它們顯示出來了。
-
productsAsideCategorys.jsp用于當你滑鼠滑過左側分類資訊之後,會在右側顯示一些相關資訊,這些相關資訊并不是分類的屬性,而是cs的productbyRow這個list中product的subtitle。簡單而言,隻要你穿了category對象cs到前台,并且這個cs是使用過fill()方法的,那麼就可以實作上述功能。
其它:
carousel.jsp:前端知識,顯示靜态資源。
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需要登入的前台操作
總流程分别是,加入購物車/直接購買,結算頁面,訂單頁操作。這邊主要都是對表的操作,代碼不複雜,但是業務邏輯要搞清楚。
我并不準備按照站長的思路(按照購物順序)來介紹,我認為,應該以Order和OrderIteam為核心進行分别介紹。
4.1針對OrderItem的操作
首先必須厘清,OrderItem到底是什麼。OrderItem并不是Order中的元素,它表示了有可能要放入或者已經放入訂單中的元素,在本文的業務場景中,可以認為,訂單項不是在購物車中,就是在訂單中。因為訂單項隻會由于增加購物車或者操作訂單而産生。
是以,所有所有購物的流程都是先操作OrderItem,再操作Order的。
搞清楚這個基本邏輯之後,我們看看,購物的時候哪些是要對OrderItem進行操作的:
-
直接購買
對應方法:buyone()。訂單項的基本資訊包括商品,使用者,數量。這裡的操作相當于添加了一個OrderItem記錄,這個記錄就好比說是吃火鍋前準備的菜,下不下鍋還不一定(是否成為Order還不一定)。
這個是跳轉到buy()方法中繼續處理的。
-
加入購物車
對應方法:addCart()。和buyone()類似,但是我自己做了個業務上的差別,我認為直接下單的行為并不需要考慮購物車中有沒有同類商品,添加購物車的時候需要考慮。
業務邏輯:這裡的業務邏輯是核對目前使用者購物車内有沒有相同的産品,有的話就增加數量即可,沒有的話就新增一個訂單項記錄。換而言之,存在相同商品則update,不存在則add。
這個是response一個success,說明已經添加成功。為什麼不跳轉到其他的頁面呢?你想想看你在天貓的購物場景,加入購物車之後,自己還在目前界面。
-
檢視購物車
對應方法:cart()。這個方法其實就是對OrderItem表進行查詢操作,查詢的條件是使用者為目前使用者。
-
操作購物車
對應方法:changeOrderItem()和deleteOrderItem()。就是對OrderItem的改和删操作。這兩個操作都要先判斷使用者是否登陸。其實我也不太明白這邊為什麼要判斷,感覺按照業務邏輯,能到這裡一定是登陸的使用者。然後利用DAO的方法對相應的訂單項進行修改或删除即可。
-
購買
對應方法:buy()。這個方法無論針對購物車的下單行為還是針對1.直接購買的下單行為,都可以。這是因為如果前端使用者是直接下單行為,那麼傳遞來的參數就是一個oiid,如果是在購物車頁面合并下單,那傳遞來的參數就是多個oiid。
将這些oiid對應的OrderItem放置到一個List中,作為域對象發送到前端。當然,傳過去的資料還要包括購物總金額之類前端需要顯示的資料。跳轉到buy.jsp,所展示的就是訂單項和總價格,需要輸入的就是一些訂單的基本資訊。
從buy.jsp,就開始了從OrderItem到Order的華麗轉身。
4.2針對Order的操作
-
建立訂單。
對應方法:createOrder()。将List<OrderItem>放入訂單對象Order中,并且對表進行操作,從前端buy.jsp中擷取對應的表單資料,通過set方法完善Order對象,并添加至資料庫中。
傳回值為forealipay界面,跳轉到支付界面。
-
支付完畢。
對應方法:payed()。支付完畢會顯示一個已經成功支付的頁面,payed.jsp。我們需要傳遞給前端一些參數以供顯示,除此之外,也是在這個函數裡通過set方法設定了訂單的付款時間以及訂單狀态。
說到這個訂單的标記資訊,其實就是一堆枚舉值,用來維護訂單的狀态值,比如說1代表未下單,2代表已發貨等等。
-
檢視訂單。
對應方法:bought()。Order表的查詢方法,查詢所有狀态不為delete的。站長表示,訂單是使用者的重要資訊,是以通常不删除記錄,而是标記為删除,這個查詢就是查詢所有未标記為删除的訂單。交給前台展示。
-
确認付款與确認訂單。
對應方法:confirmPay()。沒什麼好說的,前台要展示你确認收貨了什麼東西,是以要給一些域對象資料。
- 删除訂單。OrderDAO的update(),如上文所說,把狀态值改為delete即可。
4.3評價
-
跳轉到評價頁面。
對應方法:review()。這個方法并不是讓你寫評價,而是為了在寫評價的頁面上展示一些東西。比如展示你買的是什麼,花了多少錢,訂單裡面有哪些訂單項,已經别人已經寫得評價和評價數量。
-
在評價頁面送出評價。
對應方法:doreview()。送出評價後,要對資料庫進行操作。
5小結(重要)與預告
寫這篇文章的時候,我才發現,後端程式servlet其實核心思想非常重要,那就是派發。你要很清楚,servlet寫的那些方法,本質上都是controller層,是控制器,做的是派發的工作。
什麼叫派發?
- 前端需要顯示的資料,後端需要通過servlet中service方法調用對應方法,在這個方法裡調用Model層的東西(DAO或實體類),擷取資料後,交給前端。從資料庫的角度來說,這叫查詢。從後端的角度來說,這叫寫出。
-
前端需要送出的資料,後端一樣的,擷取資料并放入資料庫。從資料庫的角度來說,這是增删改。從後端的角度來說,這叫寫入。
這是從MVC整體架構的角度,高屋建瓴的看到這裡的所有業務邏輯。
或許有的業務邏輯隻有1,就是顯示,比如說上面分析過的不需要登入的功能,基本都是顯示,是以隻要從資料庫裡讀,把資料寫入域對象,前台把域對象拿出來即可,這種需求通常傳回值為xxx.jsp。
有的業務隻有2,比如說添加購物車就是比較典型的,添加完之後,仍然停留在目前界面,不需要跳轉到别的頁面顯示,這種一般傳回值為%,表示不需要做跳轉。
有的業務既有2又有1,對資料庫做完操作後,要跳轉到另一個界面做顯示。那在做2的方法傳回值通常為一個servlet方法,而這個servlet方法中做的是1的操作,然後傳回一個xxx.jsp。
隻有了解了我上面說的這些,我認為才真正從俯視圖上了解了MVC,了解了servlet+jsp+Bean+DAO架構,以後自己寫業務代碼的時候才能做到知其是以然。
預告
下一章講解背景業務邏輯,至于JSP講不講,看我有沒有空學習JSP。