项目03--当当网源码解读
最近讀了當(dāng)當(dāng)網(wǎng)的源碼,收獲很多,利用這篇博文和大家分享分享心得。
一開始,我將源碼導(dǎo)入eclipse的時(shí)候,jsp文件大面積出錯,原因是jdk版本不匹配,將原項(xiàng)目的jdk刪除,重新設(shè)置自己eclipse版本的jdk即可。
首先我們來看整個項(xiàng)目的 Project Explorer :
接下來我們先簡單的分析一下整個項(xiàng)目:
前端分析:(1)前端頁面采用 js + css + jsp 共同完成,css 主要用于網(wǎng)頁中樣式的定義,用于美化網(wǎng)頁,js 主要是實(shí)現(xiàn)簡單的表單驗(yàn)證和美化靜態(tài)頁面。前端主要是 結(jié)構(gòu)+樣式+行為,而 css 就負(fù)責(zé)樣式, js 負(fù)責(zé)行為。
(2)前端設(shè)計(jì)的時(shí)候,有 error.jsp,表示一旦出錯,交互友好。在jsp頁面中用到了struts2的標(biāo)簽庫.
(3)jsp文件按照模塊分了4個包,cart(購物車)、main()、order(訂單)、user(用戶)。
①user模塊包括用戶注冊和用戶登錄,注冊分為填寫信息,驗(yàn)證郵箱和注冊成功。
②order模塊包括填寫訂單、輸入地址、生成訂單。
③cart模塊包括了購物車的所有信息。
④main模塊包括了主要的瀏覽書籍的界面,按照最新排序查詢,按照最熱排序查詢,自動推薦等功能。
(4) js 文件主要用到了 jquery 和 ajax. ajax 實(shí)現(xiàn)異步更新頁面數(shù)據(jù),jquery 是一個輕量級的 js 庫,實(shí)現(xiàn)更方便的處理 html, 并實(shí)現(xiàn)動畫效果。
js 文件實(shí)現(xiàn)了最簡單的表單驗(yàn)證:
① 頁面填入的各項(xiàng)信息不能為空
② 各項(xiàng)驗(yàn)證不能全通過則點(diǎn)擊按鈕無效
③ 信息格式是否正確,是否為空,是否已經(jīng)存在
驗(yàn)證的方式有很多,最常見的是利用正則表達(dá)式進(jìn)行驗(yàn)證。這些都是直接在前臺頁面就進(jìn)行了初步驗(yàn)證,不用和后臺和數(shù)據(jù)庫交互。
(5)css文件做的是樣式,即字體,布局,顏色,邊框等,給每一個頁面都要進(jìn)行樣式設(shè)計(jì)與設(shè)置,使頁面呈現(xiàn)出來較為酷炫的效果,直接設(shè)置就行。
(6)配置文件:
①web.xml中配置了struts2。
②mytag.tld文件是tag標(biāo)簽的配置文件,配置了tag標(biāo)簽后才能在jsp中調(diào)用。
(1)配置文件:
struts.xml這個配置文件中配置了一些共用的攔截器,異常處理和 action .
db.properties配置文件中配置了連接數(shù)據(jù)庫的基本參數(shù)。
(2)我主要是做后臺的,所以現(xiàn)在開始我們來分析最核心的后臺框架以及設(shè)計(jì)思想。
先戳圖:
整個處理過程如下:
(1)頁面發(fā)送請求到 struts.xml 配置文件。
(2)配置文件根據(jù)action的對應(yīng)關(guān)系去找到相應(yīng)的action類。
(3)Dao層利用sql語言,通過entity實(shí)體層實(shí)現(xiàn)對數(shù)據(jù)的增刪改查操作。
(4)action類中通過對dao層方法的轉(zhuǎn)發(fā)以及調(diào)用實(shí)現(xiàn)對業(yè)務(wù)的處理,返回給struts.xml一個表示狀態(tài)的字符串。
(5)struts.xml根據(jù)返回的字符串控制跳轉(zhuǎn)到下一個要跳轉(zhuǎn)的頁面。
接下來,我們分析每一層的功能和寫法:
1.dao層:
dao層主要負(fù)責(zé)操作數(shù)據(jù)庫的數(shù)據(jù),實(shí)現(xiàn)增刪改查的功能。
在這個項(xiàng)目中,dao層又分為三層,分別是:DAO接口,DAOImpl實(shí)現(xiàn)和DAOFactory。
注意,寫接口的時(shí)候每個方法都要拋出異常,涉及到查詢的時(shí)候最好將數(shù)據(jù)類型寫成List,方便后期循環(huán)遍歷查詢或者顯示。
DAOImpl是通過sql語句來實(shí)現(xiàn)增刪改查的。涉及到連接數(shù)據(jù)庫,獲得結(jié)果集等,連接數(shù)據(jù)庫后就可以執(zhí)行插入刪除等操作。
2.entity層:
entity層主要是數(shù)據(jù)庫中表的映射,dao層與數(shù)據(jù)庫交互的時(shí)候就是通過entity層來實(shí)現(xiàn)的。
這里就提到了關(guān)于數(shù)據(jù)庫中表的設(shè)計(jì):
(1)凡是涉及到時(shí)間的屬性數(shù)據(jù)類型都是long型,注意要在entity中對long型的時(shí)間的輸出格式進(jìn)行處理:
(2)凡是涉及到價(jià)錢的屬性數(shù)據(jù)類型都是double型。
(3)涉及到結(jié)果集的屬性都要用List,方便后期循環(huán)遍歷。
(2)布爾類型:需要將T或者F寫進(jìn)數(shù)據(jù)庫,從數(shù)據(jù)庫返回的是True或者false.即數(shù)據(jù)庫中存的是T或者F,但是頁面顯示的是true或者false.
3.interceptor層:
本層主要寫了一個攔截器,用來檢查用戶是否已經(jīng)登錄。
4.util層
本層包括四個 .java文件。
(1) DBConnection.java主要實(shí)現(xiàn)的功能是連接數(shù)據(jù)庫:
(2)EmailCode.java主要用來解析用戶輸入的郵箱驗(yàn)證碼,郵箱驗(yàn)證碼是隨機(jī)生成的,且包括兩部分 uuid 和 id ,當(dāng)用戶輸入的郵箱驗(yàn)證碼和自動生成的相匹配,則郵箱驗(yàn)證成功!
隨機(jī)生成的郵箱驗(yàn)證碼如下(測試了3次):
(3)ImageUtil.java
ImageUtil是生成圖片驗(yàn)證碼的函數(shù):
//圖片驗(yàn)證碼 //java中利用Graphics類來實(shí)現(xiàn)繪制圖形 //整個驗(yàn)證碼都是繪制粗來的,我們可以來分析,顯示驗(yàn)證碼的最外層圖片是畫出來的,驗(yàn)證碼數(shù)字或者字符是利用隨機(jī)數(shù)自動生成的 //干擾線的位置、顏色等也都是利用隨機(jī)數(shù)自動生成的。一開始先定義這個圖片驗(yàn)證碼的元素組成
包括整個圖片的長度和寬度,字體的大小,包含字符個數(shù),以及字符隨機(jī)生成的原庫,還有干擾線的條數(shù).
然后產(chǎn)生隨機(jī)字符,產(chǎn)生隨機(jī)干擾線,產(chǎn)生隨機(jī)顏色。
(4)Md5Code.java
這個文件是對用戶的密碼進(jìn)行加密的過程。
/***關(guān)于MD5算法:*用戶的密碼是利用MD5算法(或者其他類似算法)經(jīng)哈希運(yùn)算后存儲到文件系統(tǒng)或者數(shù)據(jù)庫系統(tǒng)中*當(dāng)用戶登錄時(shí)輸入密碼時(shí),系統(tǒng)會將用戶密碼進(jìn)行MD5哈希運(yùn)算,再和數(shù)據(jù)庫中保存的MD5值進(jìn)行比較,從而確認(rèn)密碼的輸入是否正確*這樣可以避免用戶的密碼被具有管理員權(quán)限的人知道*優(yōu)點(diǎn)是從MD5值反推原密碼非常困難,幾乎是不可能的。*也可用來校驗(yàn)文件的完整性*/5.最后我們來看action層:
action層分模塊,cart(購物車模塊),main(主功能模塊),order(訂單模塊),user(用戶模塊)。
(1)BaseAction: BaseAction是公共基類,用來負(fù)責(zé)處理將所有從界面?zhèn)鬟^來的的信息保存在request和session中. 從頁面?zhèn)鬟M(jìn)來一個Map<String, Object>的session對象,這個函數(shù)負(fù)責(zé)用set方法存儲在服務(wù)器session中 從頁面?zhèn)鬟M(jìn)來一個request對象,這個函數(shù)負(fù)責(zé)用set方法將request存儲在服務(wù)器request上。(2)cart(購物車模塊):
分析:
/**
*整個cart模塊的分析
*1.CartService是一個接口,用來聲明對購物車所作的常用操作
*2.SessionCartServiceImpl實(shí)現(xiàn)了CartService接口,實(shí)現(xiàn)了接口中的所有方法
*3.CartFactory是一個工廠
*4.CartAction是界面和后臺交互的地方,接收界面的請求,轉(zhuǎn)發(fā)請求,調(diào)用dao層實(shí)現(xiàn)相應(yīng)的功能
*5.CartItem是一個model
*注意:購物車應(yīng)存在session中,當(dāng)用戶確認(rèn)購買時(shí),再將購物車信息生成一個訂單(order),以訂單形式復(fù)制到數(shù)據(jù)庫中進(jìn)行存儲。
*/
(3)order(訂單模塊):
/**
*訂單提交過程:
*1.檢查購物車,若購物車中無商品,返回empty,不提交
*2.若購物車中有商品,則需要提交
* 2.1 根據(jù)用戶id獲得購物車實(shí)例(session中購物車信息)
* 2.2 創(chuàng)建訂單對象(order),將session中購物車的信息復(fù)制到訂單中,一條一條賦值
* 2.3 查看數(shù)據(jù)庫中是否存有訂單信息,若沒有,則將order的信息和地址信息存入數(shù)據(jù)庫
* 2.4 清空session中的購物車信息
*/
OrderConfirmAction.java完成的功能如下:
//如果購物車為空,提示錯誤信息,無法確認(rèn)訂單 //如果購物車不為空,返回確認(rèn)訂單成功,并計(jì)算訂單總價(jià)(4) user (用戶模塊):
①用戶登錄 LoginAction.java:
//用戶名是郵箱名,登錄時(shí)只需要驗(yàn)證郵箱和密碼是否匹配即可 //根據(jù)dao層方法驗(yàn)證email和密碼是否正確,不正確返回login_form.jsp //密碼的驗(yàn)證需要調(diào)用Md5驗(yàn)證類,判斷新登錄的密碼是否和原來存的密碼的Md5值相同 //郵箱驗(yàn)證在這個函數(shù)中,只判斷了是否為空。調(diào)用了另外寫的郵箱驗(yàn)證函數(shù)來判斷。 //如果用戶名和郵箱驗(yàn)證成功,則需要更新最后登錄時(shí)間和ip,將新的Model寫進(jìn)session中和數(shù)據(jù)庫中,并返回狀態(tài)字符串。 //退出登錄的時(shí)候,需要清除session中存的信息 //session的生命周期在用戶退出登錄這一刻結(jié)束。② 郵箱驗(yàn)證:
//郵箱驗(yàn)證函數(shù) //當(dāng)用戶登錄時(shí)輸入郵箱時(shí),點(diǎn)擊郵箱驗(yàn)證,會隨機(jī)生成一個對應(yīng)的郵箱驗(yàn)證碼a,用戶輸入郵箱驗(yàn)證碼b時(shí),系統(tǒng)會進(jìn)行解析,若解析結(jié)果和a匹配,則郵箱驗(yàn)證成功!④ 注冊驗(yàn)證:
注冊的時(shí)候,要將密碼進(jìn)行加密。注冊后要將新用戶的信息加入數(shù)據(jù)庫和session中。
到這里為止,當(dāng)當(dāng)網(wǎng)的源碼分析就基本上告一段落了,整個系統(tǒng)層次分明,綜合利用了很多基礎(chǔ)的知識點(diǎn)。安全驗(yàn)證方面做得還算完善。通過閱讀分析這個源碼,我對于struts2框架的應(yīng)用更加熟練,共勉!
總結(jié)
以上是生活随笔為你收集整理的项目03--当当网源码解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国家天文台结盟阿里云:计算100亿光年的
- 下一篇: 肯塔基大学计算机科学,2020年肯塔基大