Javaweb-綜合練習(xí)
第1章?項(xiàng)目介紹
后臺(tái)管理p2p_management
實(shí)現(xiàn)登錄,退出產(chǎn)品管理(產(chǎn)品添加,產(chǎn)品查詢,產(chǎn)品修改)
前臺(tái)管理p2p_home
客戶注冊(cè),登錄,郵箱認(rèn)證
帳戶中心產(chǎn)品查詢帳戶信息查詢產(chǎn)品購(gòu)買(mǎi)
技術(shù)架構(gòu):jsp+servlet+javabean+mysql+redis+filter
新的知識(shí)點(diǎn):
1. 數(shù)據(jù)庫(kù)操作的事務(wù)管理
2. Javamail
3. Beanutils工具它可以將請(qǐng)求參數(shù)直接封裝成實(shí)體對(duì)象
本次綜合練習(xí),主要是以ajax操作為主。
第2章?項(xiàng)目環(huán)境搭建
1. eclipse中項(xiàng)目環(huán)境搭建
搭建package結(jié)構(gòu)
2. 關(guān)于數(shù)據(jù)庫(kù)
五張表
1. user表,它是后臺(tái)用戶表
2. product表,產(chǎn)品表
3. account表 客戶帳戶表
4. product_account客戶購(gòu)買(mǎi)產(chǎn)品表
5. customer客戶表
第3章?功能實(shí)現(xiàn)
]3.1?[endif]p2p_management功能實(shí)現(xiàn)
[if !supportLists]3.1.1?[endif]簡(jiǎn)單登錄與退出
[if !supportLists]3.1.1.1?[endif]登錄操作
登錄頁(yè)面login.html
步驟1:創(chuàng)建一個(gè)User類(lèi)它與表user對(duì)應(yīng)
步驟2:創(chuàng)建UserServlet
步驟3:將login.html頁(yè)面轉(zhuǎn)換為login.jsp
步驟4:在servlet中完成用戶登錄操作
1.先獲取username,password
2.完成驗(yàn)證操作
3.調(diào)用service完成操作
4.在service中調(diào)用dao完成操作
操作數(shù)據(jù)庫(kù)使用的是c3p0連接池與dbutils工具,提供了一個(gè)JdbcUtils
步驟5:從數(shù)據(jù)庫(kù)中查詢出user,判斷是否登錄成功,進(jìn)行頁(yè)面跳轉(zhuǎn)
[if !supportLists]3.1.1.2?[endif]用戶未登錄不能訪問(wèn)/views/hom.jsp
可以使用filter來(lái)完成操作
注意:上面的filter配置它只能對(duì)REQUEST請(qǐng)求攔截,我們也需要對(duì)FORWARD攔截
[if !supportLists]3.1.1.3?[endif]退出操作
1.在home.jsp頁(yè)面顯示登錄用戶的名稱
2.退出操作
我們退出時(shí),一定要將session銷(xiāo)毀,在將頁(yè)面關(guān)閉。
我使用ajax操作來(lái)完成。
步驟1:創(chuàng)建home.js文件,在home.jsp頁(yè)面導(dǎo)入
步驟2:修改home.jsp頁(yè)面
步驟3:在home.js文件中創(chuàng)建一個(gè)函數(shù)shutdown()來(lái)完成關(guān)閉操作
[if !supportLists]3.1.2?[endif]產(chǎn)品管理-產(chǎn)品查詢
關(guān)于產(chǎn)品信息的查詢,我們使用ajax來(lái)完成操作,并且沒(méi)有分頁(yè)。
思路:
1.當(dāng)home.jsp頁(yè)面加載時(shí)就會(huì)向服務(wù)器發(fā)送請(qǐng)求來(lái)獲取產(chǎn)品信息
2.服務(wù)器端在servlet中處理請(qǐng)求,調(diào)用service,dao完成產(chǎn)品信息查詢,并將信息轉(zhuǎn)換成json響應(yīng)到瀏覽器端
3.在瀏覽器中得到服務(wù)器響應(yīng)的數(shù)據(jù)(json),對(duì)數(shù)據(jù)進(jìn)行處理,展示在home.jsp頁(yè)面上。
[if !supportLists]3.1.2.1?[endif]步驟1:創(chuàng)建Product模型
[if !supportLists]3.1.2.2?[endif]步驟2創(chuàng)建服務(wù)器端的servlet ,service,dao
在service包中創(chuàng)建IProductService 與其實(shí)現(xiàn)ProductServiceImpl ?
在dao包中創(chuàng)建IProductDAO 與其實(shí)現(xiàn)ProductDAOImpl
[if !supportLists]3.1.2.3?[endif]步驟3在home.js中完成頁(yè)面加載時(shí)向服務(wù)器發(fā)送請(qǐng)求,獲取產(chǎn)品信息
[if !supportLists]3.1.2.4?[endif]步驟4.在服務(wù)器端查詢所有產(chǎn)品信息,并轉(zhuǎn)換成json響應(yīng)到瀏覽器
[if !supportLists]3.1.2.5?[endif]步驟5:在瀏覽器端處理json數(shù)據(jù),展示在頁(yè)面上
在home.jsp頁(yè)面上添加一個(gè)
將json數(shù)據(jù)處理后轉(zhuǎn)換成的html代碼顯示在pbody中就可以。
[if !supportLists]3.1.3?[endif]產(chǎn)品管理-產(chǎn)品添加
產(chǎn)品添加思路:
在home.jsp頁(yè)面上點(diǎn)擊添加按鈕,彈出一個(gè)窗口,在窗口中錄入相關(guān)產(chǎn)品信息,將信息發(fā)送到服務(wù)器端,在servlet中調(diào)用service,dao,完成將數(shù)據(jù)插入到product表中,最后我們要在調(diào)用查詢所有產(chǎn)品操作,將添加的產(chǎn)品顯示出來(lái)。
[if !supportLists]3.1.3.1?[endif]步驟1:在home.jsp頁(yè)面上點(diǎn)擊添加按鈕彈出窗口
1.修改home.jsp頁(yè)面上的按鈕
2.在home.jsp中添加彈出層
3.在home.js中添加js代碼
4.在彈出的窗口中創(chuàng)建一個(gè)表單
[if !supportLists]3.1.3.2?[endif]步驟2:添加產(chǎn)品信息,將信息發(fā)送到服務(wù)器端完成添加操作
1.在home.js中完成點(diǎn)擊添加按鈕,獲取添加的表單的數(shù)據(jù)
我們可以使用前面講過(guò)的關(guān)于jquery插件。
[if !supportLists]3.1.3.3?[endif]步驟3在服務(wù)器端完成添加操作
使用beanutils來(lái)完成請(qǐng)求參數(shù)封裝
1.導(dǎo)入jar包
2.使用beanutils將請(qǐng)求參數(shù)封裝到bean對(duì)象中
參數(shù)1是bean對(duì)象 ?
參數(shù)2是我們的請(qǐng)求參數(shù)的Map集合,一般我們使用時(shí)都是使用request.getParameterMap()方法獲取。
注意:要想將請(qǐng)求參數(shù)封裝到bean對(duì)象中,必須讓bean屬性與請(qǐng)求參數(shù)的名稱對(duì)應(yīng)。
這些參數(shù)與Product類(lèi)中的bean屬性名稱相同
完成服務(wù)器端添加操作
Servlet
Service
Dao
[if !supportLists]3.1.3.4?[endif]步驟4添加完成后,在查詢產(chǎn)品在頁(yè)面上顯示
[if !supportLists]3.1.4?[endif]產(chǎn)品管理-產(chǎn)品修改
對(duì)于修改操作就是進(jìn)行查詢,回顯示數(shù)據(jù)后在修改。
[if !supportLists]3.1.4.1?[endif]步驟1:給home.jsp頁(yè)面上的編輯添加連接,點(diǎn)擊進(jìn)行產(chǎn)品的查詢
給編輯添加連接
創(chuàng)建了一個(gè)findById函數(shù)來(lái)完成根據(jù)產(chǎn)品id查詢產(chǎn)品操作
注意:點(diǎn)擊編輯后要彈出一個(gè)窗口
注意:要對(duì)添加操作中的彈窗進(jìn)行修改,添加一個(gè)id進(jìn)行操作
[if !supportLists]3.1.4.2?[endif]步驟2在服務(wù)器端完成根據(jù)id查詢產(chǎn)品操作
Servlet
Dao
[if !supportLists]3.1.4.3?[endif]步驟3在home.jsp頁(yè)面上顯示查詢到的產(chǎn)品信息
對(duì)每一個(gè)文本框添加id
[if !supportLists]3.1.4.4?[endif]步驟4修改操作
瀏覽器端操作
注意:參數(shù)中一定要攜帶id
服務(wù)器端操作
Servlet
dao
[if !supportLists]3.2?[endif]p2p_home功能實(shí)現(xiàn)
[if !supportLists]3.2.1?[endif]用戶管理-注冊(cè)操作
注冊(cè)操作它不僅是添加客戶信息,還要在注冊(cè)時(shí),為客戶生成一個(gè)帳戶。簡(jiǎn)單說(shuō),我們?cè)谶M(jìn)行客戶注冊(cè)操作時(shí),要insert兩條記錄,一條是customer表中添加數(shù)據(jù),代表的是客戶信息,還需要向account表中插入數(shù)據(jù),當(dāng)創(chuàng)建一個(gè)客戶時(shí),也會(huì)為其生成一條帳戶信息。
(本項(xiàng)中,沒(méi)有使用支付寶,微信操作)去進(jìn)行轉(zhuǎn)賬操作,只是簡(jiǎn)單的自己生成了帳戶信息。
[if !supportLists]3.2.1.1?[endif]步驟1:修改register.html頁(yè)面,當(dāng)點(diǎn)擊注冊(cè)按鈕時(shí)向服務(wù)器發(fā)送請(qǐng)求
1.修改手機(jī)號(hào)為郵箱地址
2.給注冊(cè)按鈕添加事件,點(diǎn)擊它完成向服務(wù)器發(fā)送請(qǐng)求操作
[if !supportLists]3.2.1.2?[endif]步驟2:服務(wù)器端完成注冊(cè)操作
注意:注冊(cè)時(shí)要向customer與account表中插入數(shù)據(jù),我們需要進(jìn)行事務(wù)控制。
Servlet創(chuàng)建
Domain
[if !supportLists]3.2.1.3?[endif]步驟3:完成添加客戶操作
關(guān)于JdbcUtils工具
Service操作
Dao操作
[if !supportLists]3.2.1.4?[endif]步驟4:完成添加帳戶操作
注意:添加客戶時(shí)要保證它的email與c_name是唯一的。
添加帳戶信息
[if !supportLists]3.2.1.5?[endif]步驟5:判斷客戶名稱與郵箱唯一 ,并響應(yīng)數(shù)據(jù)到瀏覽器
為了方便在瀏覽器端判斷是否成功,我們可以設(shè)置一個(gè)json類(lèi)型的返回結(jié)果。
[if !supportLists]3.2.1.6?[endif]步驟6:解決前端js校驗(yàn)
非空校驗(yàn)
規(guī)則校驗(yàn)
[if !supportLists]3.2.2?[endif]用戶管理-登錄操作
注意:在登錄時(shí),我們錄制客戶名稱或郵箱地址都可以完成登錄。
[if !supportLists]3.2.2.1?[endif]步驟1:在登錄頁(yè)面上顯示圖片驗(yàn)證碼
將資料中的CheckImageServlet復(fù)制到utils包下在web.xml文件中配置
在login.html頁(yè)面上添加
點(diǎn)擊圖片驗(yàn)證碼切換圖片
[if !supportLists]3.2.2.2?[endif]步驟2:完成點(diǎn)擊立即登錄操作,將信息發(fā)送到服務(wù)器端
注意:在頁(yè)面上需要給用戶名密碼驗(yàn)證碼添加name屬性
[if !supportLists]3.2.2.3?[endif]步驟3:在服務(wù)器端完成登錄操作,并響應(yīng)數(shù)據(jù)到瀏覽器端
獲取請(qǐng)求參數(shù),判斷驗(yàn)證碼是否正確
調(diào)用service完成登錄操作
在瀏覽器端處理服務(wù)器的響應(yīng)數(shù)據(jù)
注意:在login.html頁(yè)面上我們進(jìn)行了修改
[if !supportLists]3.2.2.4?[endif]步驟4:完成郵箱登錄
在登錄程序中添加一段來(lái)判斷是否是郵箱
[if !supportLists]3.2.2.5?[endif]步驟5:在服務(wù)器端進(jìn)行校驗(yàn)
[if !supportLists]3.2.2.6?[endif]步驟6:關(guān)于密碼md5加密問(wèn)題
Java加密
在mysql中對(duì)密碼進(jìn)行加密
UPDATE customer SET PASSWORD=MD5('123');
[if !supportLists]3.2.2.7?[endif]步驟7登錄后,跳轉(zhuǎn)到space.html頁(yè)面加載客戶帳戶信息
給space.html頁(yè)面中導(dǎo)入一個(gè)space.js文件,在space.js文件中
這個(gè)函數(shù)是頁(yè)面加載完成后執(zhí)行。我們就可以在函數(shù)中向服務(wù)器發(fā)送請(qǐng)求,來(lái)獲取客戶的帳戶信息在頁(yè)面上顯示
1.向服務(wù)器發(fā)送請(qǐng)求
2.在服務(wù)器端判斷客戶是否登錄
3.客戶登錄,查詢客戶的帳戶信息
注意:在JsonResult中雙封裝了一個(gè)content信息,它主要是用于封裝查詢的對(duì)象,例如Account對(duì)象。
4.在頁(yè)面上處理帳戶信息顯示
首先在space.html頁(yè)面上添加了id,在js代碼中進(jìn)行了處理
[if !supportLists]3.2.3?[endif]用戶管理-郵箱認(rèn)證
郵箱認(rèn)證主要就是修改customer表中的email_status字段值修改為1
第一部分:點(diǎn)擊”認(rèn)證”彈出窗口,在窗口中顯示用戶注冊(cè)時(shí)的郵箱,可以在點(diǎn)擊按鈕向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器端要向郵箱發(fā)送一封郵件。
第二部分:完成郵箱認(rèn)證操作
[if !supportLists]3.2.3.1?[endif]步驟1:點(diǎn)擊”認(rèn)證”彈出窗口
在space.html頁(yè)面上添加了模態(tài)框代碼
在”認(rèn)證”上添加
在space.js文件中
接下來(lái)我們修改模態(tài)框
[if !supportLists]3.2.3.2?[endif]步驟2:完成服務(wù)器端客戶信息查詢,在文本框中顯示客戶的郵箱地址
瀏覽器端處理
關(guān)于客戶郵箱認(rèn)證時(shí)顯示問(wèn)題處理
在整個(gè)space.html頁(yè)面加載后,處理郵箱認(rèn)證顯示
注意:服務(wù)器端在查詢帳戶信息時(shí),將客戶信息也封裝到Account對(duì)象中。
[if !supportLists]3.2.3.3?[endif]步驟3:完成郵件的發(fā)送操作
服務(wù)器端發(fā)送郵件
[if !supportLists]3.2.3.4?[endif]步驟4:郵箱認(rèn)證
主要就是修改customer表中的email_status字段值為1.
前臺(tái)給“認(rèn)證”按鈕添加事件,點(diǎn)擊它向服務(wù)器發(fā)送請(qǐng)求,攜帶著郵箱與錄入驗(yàn)證碼,在服務(wù)器端完成認(rèn)證操作。
[if !supportLists]3.2.4?[endif]帳戶中心-產(chǎn)品購(gòu)買(mǎi)
產(chǎn)品購(gòu)買(mǎi),我們首先要對(duì)產(chǎn)品進(jìn)行查詢。我們?cè)趐2p_home中要查詢產(chǎn)品信息,在p2p_management工程中已經(jīng)提供了產(chǎn)品的crud操作,會(huì)使用跨域來(lái)完成數(shù)據(jù)查詢??梢允褂胘query提供的getJson操作
對(duì)于產(chǎn)品的購(gòu)買(mǎi),我們?cè)鯓硬僮?
1.用戶的帳戶表中的信息一定要改變
2.product_account表,這張表中記錄的是客戶的投資信息。
注意:在product_account表中我們還需要添加兩個(gè)字段,一個(gè)是money代表投資金額 ,還需要記錄本次交易收益interest
[if !supportLists]3.2.4.1?[endif]步驟1:跨域查詢產(chǎn)品信息在moto.html頁(yè)面上展示產(chǎn)品
在moto.js中完成向p2p_management工程發(fā)送請(qǐng)求,查詢所有產(chǎn)品信息
在p2p_management的ProductServlet的findAll方法中修改
[if !supportLists]3.2.4.2?[endif]步驟2:在moto.html頁(yè)面上展示產(chǎn)品信息
我們使用一個(gè)jquery的插件來(lái)實(shí)現(xiàn)產(chǎn)品信息的滾動(dòng)展示。
1.導(dǎo)入自動(dòng)滾動(dòng)jquery插件相關(guān)的css與js文件
2.在頁(yè)面上進(jìn)行修改
3.在moto.js文件中拼裝html代碼時(shí)
[if !supportLists]3.2.4.3?[endif]步驟3:moto.html頁(yè)面上產(chǎn)品購(gòu)買(mǎi)信息生成
1.點(diǎn)擊我要購(gòu)買(mǎi)時(shí)在頁(yè)頁(yè)面上展示產(chǎn)品信息
2.在moto.html頁(yè)面上展示當(dāng)前要購(gòu)買(mǎi)的產(chǎn)品的相關(guān)數(shù)據(jù)及計(jì)算收益信息
預(yù)期收益=本金*預(yù)期收益率/100/12*limit
[if !supportLists]3.2.4.4?[endif]步驟4:完成購(gòu)買(mǎi)操作
將投資的金額與產(chǎn)品信息傳遞到服務(wù)器,在服務(wù)器端進(jìn)行操作,來(lái)完成購(gòu)買(mǎi)。
修改帳戶信息,向product_account表中插入數(shù)據(jù)。注意:在操作前,要判斷當(dāng)前用戶是否登錄,要判斷帳戶的余額是否充足。
1.向服務(wù)器發(fā)送我們的投資請(qǐng)求
2.在服務(wù)器端完成操作
因?yàn)槲覀冃枰薷腶ccount表中數(shù)據(jù),還需要向product_account表中插入數(shù)據(jù),它們是需要進(jìn)行事務(wù)控制的。
[if !supportLists]3.2.5?[endif]帳戶中心-產(chǎn)品投資查詢
[if !supportLists]3.2.5.1?[endif]步驟1:產(chǎn)品投資查詢分析
對(duì)于產(chǎn)品投資查詢,我們主要是完成用戶資產(chǎn)的信息查詢。
、
我們要查詢的信息,包括當(dāng)前客戶的帳戶信息,購(gòu)買(mǎi)的理財(cái)產(chǎn)品信息。
對(duì)于帳戶信息,我們要查詢account表。
對(duì)于購(gòu)買(mǎi)的產(chǎn)品信息,包括product表 product_account表 customer表
問(wèn)題:怎樣去完成查詢以上信息操作,查詢到信息后,怎樣響應(yīng)到瀏覽器端?
關(guān)于帳戶信息可以從select * from account where cid=?就可以查詢到。
表格中的數(shù)據(jù)要從product_account, customer,product表中查詢出來(lái)。
服務(wù)器給我們返回的數(shù)據(jù)應(yīng)該是json類(lèi)型。
JsonResult來(lái)封裝返回的數(shù)據(jù)就可以。JsonResult中定義了一個(gè)content對(duì)象,它是Object類(lèi)型。
[if !supportLists]3.2.5.2?[endif]步驟2:前端向服務(wù)器發(fā)送請(qǐng)求來(lái)查詢投資信息
Servlet中操作
Service中操作
[if !supportLists]3.2.5.3?[endif]步驟3在dao中查詢購(gòu)買(mǎi)的產(chǎn)品相關(guān)信息
在service中將查詢的結(jié)果進(jìn)行了處理
[if !supportLists]3.2.5.4?[endif]步驟4:在頁(yè)面上展示投資產(chǎn)品及帳戶相關(guān)信息
[if !supportLists]3.2.5.5?[endif]步驟5:展示購(gòu)買(mǎi)理財(cái)產(chǎn)品是否到期,處理頁(yè)面上時(shí)間顯示問(wèn)題
關(guān)于時(shí)間顯示問(wèn)題,在頁(yè)面上修改
在頁(yè)面上展示當(dāng)前產(chǎn)品是否到期
可以在服務(wù)器端完成,在ProductAccount類(lèi)中添加一個(gè)屬性。
[if !supportLists]3.3?[endif]項(xiàng)目?jī)?yōu)化與增強(qiáng)
[if !supportLists]3.3.1?[endif]監(jiān)聽(tīng)投資到期
帳戶表中的interest它記錄的當(dāng)前用戶的總收益情況。
做一個(gè)定時(shí)處理程序,在每天晚上0點(diǎn)來(lái)掃描投資信息,如果當(dāng)前投資到期了,將這次投資的收益添加到帳戶的interest上。會(huì)使用到Listener.
具體功能實(shí)現(xiàn)
[if !supportLists]3.3.2?[endif]架構(gòu)優(yōu)化
[if !supportLists]3.3.2.1?[endif]Servlet優(yōu)化
[if !supportLists]3.3.2.2?[endif]Service與dao獲取優(yōu)化
使用工廠模式來(lái)完成優(yōu)化。結(jié)合著配置文件來(lái)減化操作。
我們的思路:將關(guān)于service與dao的相關(guān)類(lèi)都配置在xml文件中,結(jié)合java中反射與工廠模式來(lái)完成service與dao的獲取。
在使用dom4j是報(bào)這樣一錯(cuò),
原因是dom4j與xpath語(yǔ)法結(jié)合時(shí),需要在單獨(dú)導(dǎo)入一個(gè)jar包
在servlet中要使用service對(duì)象,而我們獲取bean.xml文件的路徑是通過(guò)ServletContext對(duì)象來(lái)獲取classes目錄
在service中要獲取dao對(duì)象,而在service中獲取bean.xml文件的路徑
[if !supportLists]3.3.3?[endif]Redis緩存優(yōu)化
我們可以將產(chǎn)品信息保存到redis中。以后每一次查詢都從redis中獲取產(chǎn)品信息。
不用每一次都與數(shù)據(jù)庫(kù)交互。
我們可以將關(guān)于產(chǎn)品信息的json串存儲(chǔ)到redis中,以后從redis中獲取就可以。
在查詢理財(cái)產(chǎn)品時(shí),先從redis中獲取,如果沒(méi)有在從數(shù)據(jù)庫(kù)中查詢出來(lái),在保存到redis中
當(dāng)我們的產(chǎn)品修改了或添加了,就需要修改redis中的數(shù)據(jù)。
[if !supportLists]第4章?[endif]項(xiàng)目部署
[if !supportLists]4.1?[endif]克隆一份linux
注意:關(guān)于克隆這份linux的網(wǎng)絡(luò)問(wèn)題。
如果修改后還有問(wèn)題,將DEVICE=eth0修改為DEVICE=eth1
重啟網(wǎng)絡(luò)服務(wù)service network restart
[if !supportLists]4.2?[endif]將mysql數(shù)據(jù)庫(kù)導(dǎo)入,并生成war文件導(dǎo)入到tomcat中
在開(kāi)發(fā)環(huán)境下導(dǎo)出我們的數(shù)據(jù)庫(kù)信息
將p2p.sql文件內(nèi)容在linux服務(wù)器的mysql中執(zhí)行一下。
[if !supportLists]4.2.1?[endif]關(guān)于項(xiàng)目導(dǎo)出成war文件
1.c3p0連接池的配置信息需要修改
2.所有的domain下的類(lèi)都要實(shí)現(xiàn)java.io.Serializable
3.需要修改RedisUtils中的redis的服務(wù)器ip
[if !supportLists]4.3?[endif]使用nginx搭建tomcat集群,并實(shí)現(xiàn)session共享
[if !supportLists]4.3.1?[endif]配置nginx實(shí)現(xiàn)反向代理并實(shí)現(xiàn)負(fù)載均衡
在nginx下的conf目錄 中有一個(gè)nginx.conf文件,修改這個(gè)文件
[if !supportLists]4.3.2?[endif]實(shí)現(xiàn)session共享
1.導(dǎo)入四個(gè)jar包到tomcat的lib下
2.修改tomcat/conf/context.xml文件