Javaweb-綜合練習(xí)
第1章?項(xiàng)目介紹
后臺管理p2p_management
實(shí)現(xiàn)登錄,退出產(chǎn)品管理(產(chǎn)品添加,產(chǎn)品查詢悴能,產(chǎn)品修改)
前臺管理p2p_home
客戶注冊,登錄杜耙,郵箱認(rèn)證
帳戶中心產(chǎn)品查詢帳戶信息查詢產(chǎn)品購買
技術(shù)架構(gòu):jsp+servlet+javabean+mysql+redis+filter
新的知識點(diǎn):
1. 數(shù)據(jù)庫操作的事務(wù)管理
2. Javamail
3. Beanutils工具它可以將請求參數(shù)直接封裝成實(shí)體對象
本次綜合練習(xí)搜骡,主要是以ajax操作為主拂盯。
第2章?項(xiàng)目環(huán)境搭建
1. eclipse中項(xiàng)目環(huán)境搭建
搭建package結(jié)構(gòu)
2. 關(guān)于數(shù)據(jù)庫
五張表
1. user表佑女,它是后臺用戶表
2. product表,產(chǎn)品表
3. account表 客戶帳戶表
4. product_account客戶購買產(chǎn)品表
5. customer客戶表
第3章?功能實(shí)現(xiàn)
]3.1?[endif]p2p_management功能實(shí)現(xiàn)
[if !supportLists]3.1.1?[endif]簡單登錄與退出
[if !supportLists]3.1.1.1?[endif]登錄操作
登錄頁面login.html
步驟1:創(chuàng)建一個(gè)User類它與表user對應(yīng)
步驟2:創(chuàng)建UserServlet
步驟3:將login.html頁面轉(zhuǎn)換為login.jsp
步驟4:在servlet中完成用戶登錄操作
1.先獲取username,password
2.完成驗(yàn)證操作
3.調(diào)用service完成操作
4.在service中調(diào)用dao完成操作
操作數(shù)據(jù)庫使用的是c3p0連接池與dbutils工具谈竿,提供了一個(gè)JdbcUtils
步驟5:從數(shù)據(jù)庫中查詢出user,判斷是否登錄成功团驱,進(jìn)行頁面跳轉(zhuǎn)
[if !supportLists]3.1.1.2?[endif]用戶未登錄不能訪問/views/hom.jsp
可以使用filter來完成操作
注意:上面的filter配置它只能對REQUEST請求攔截,我們也需要對FORWARD攔截
[if !supportLists]3.1.1.3?[endif]退出操作
1.在home.jsp頁面顯示登錄用戶的名稱
2.退出操作
我們退出時(shí)空凸,一定要將session銷毀诉位,在將頁面關(guān)閉弟头。
我使用ajax操作來完成。
步驟1:創(chuàng)建home.js文件,在home.jsp頁面導(dǎo)入
步驟2:修改home.jsp頁面
步驟3:在home.js文件中創(chuàng)建一個(gè)函數(shù)shutdown()來完成關(guān)閉操作
[if !supportLists]3.1.2?[endif]產(chǎn)品管理-產(chǎn)品查詢
關(guān)于產(chǎn)品信息的查詢稚瘾,我們使用ajax來完成操作,并且沒有分頁砂沛。
思路:
1.當(dāng)home.jsp頁面加載時(shí)就會向服務(wù)器發(fā)送請求來獲取產(chǎn)品信息
2.服務(wù)器端在servlet中處理請求瞎暑,調(diào)用service,dao完成產(chǎn)品信息查詢,并將信息轉(zhuǎn)換成json響應(yīng)到瀏覽器端
3.在瀏覽器中得到服務(wù)器響應(yīng)的數(shù)據(jù)(json)滓窍,對數(shù)據(jù)進(jìn)行處理卖词,展示在home.jsp頁面上。
[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中完成頁面加載時(shí)向服務(wù)器發(fā)送請求吏夯,獲取產(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ù),展示在頁面上
在home.jsp頁面上添加一個(gè)
將json數(shù)據(jù)處理后轉(zhuǎn)換成的html代碼顯示在pbody中就可以噪生。
[if !supportLists]3.1.3?[endif]產(chǎn)品管理-產(chǎn)品添加
產(chǎn)品添加思路:
在home.jsp頁面上點(diǎn)擊添加按鈕裆赵,彈出一個(gè)窗口,在窗口中錄入相關(guān)產(chǎn)品信息跺嗽,將信息發(fā)送到服務(wù)器端顾瞪,在servlet中調(diào)用service,dao,完成將數(shù)據(jù)插入到product表中,最后我們要在調(diào)用查詢所有產(chǎn)品操作抛蚁,將添加的產(chǎn)品顯示出來陈醒。
[if !supportLists]3.1.3.1?[endif]步驟1:在home.jsp頁面上點(diǎn)擊添加按鈕彈出窗口
1.修改home.jsp頁面上的按鈕
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ān)于jquery插件钉跷。
[if !supportLists]3.1.3.3?[endif]步驟3在服務(wù)器端完成添加操作
使用beanutils來完成請求參數(shù)封裝
1.導(dǎo)入jar包
2.使用beanutils將請求參數(shù)封裝到bean對象中
參數(shù)1是bean對象 ?
參數(shù)2是我們的請求參數(shù)的Map集合,一般我們使用時(shí)都是使用request.getParameterMap()方法獲取肚逸。
注意:要想將請求參數(shù)封裝到bean對象中爷辙,必須讓bean屬性與請求參數(shù)的名稱對應(yīng)彬坏。
這些參數(shù)與Product類中的bean屬性名稱相同
完成服務(wù)器端添加操作
Servlet
Service
Dao
[if !supportLists]3.1.3.4?[endif]步驟4添加完成后,在查詢產(chǎn)品在頁面上顯示
[if !supportLists]3.1.4?[endif]產(chǎn)品管理-產(chǎn)品修改
對于修改操作就是進(jìn)行查詢膝晾,回顯示數(shù)據(jù)后在修改栓始。
[if !supportLists]3.1.4.1?[endif]步驟1:給home.jsp頁面上的編輯添加連接,點(diǎn)擊進(jìn)行產(chǎn)品的查詢
給編輯添加連接
創(chuàng)建了一個(gè)findById函數(shù)來完成根據(jù)產(chǎn)品id查詢產(chǎn)品操作
注意:點(diǎn)擊編輯后要彈出一個(gè)窗口
注意:要對添加操作中的彈窗進(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頁面上顯示查詢到的產(chǎn)品信息
對每一個(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]用戶管理-注冊操作
注冊操作它不僅是添加客戶信息幻赚,還要在注冊時(shí),為客戶生成一個(gè)帳戶臊旭。簡單說落恼,我們在進(jìn)行客戶注冊操作時(shí),要insert兩條記錄,一條是customer表中添加數(shù)據(jù)离熏,代表的是客戶信息佳谦,還需要向account表中插入數(shù)據(jù),當(dāng)創(chuàng)建一個(gè)客戶時(shí)滋戳,也會為其生成一條帳戶信息钻蔑。
(本項(xiàng)中,沒有使用支付寶奸鸯,微信操作)去進(jìn)行轉(zhuǎn)賬操作咪笑,只是簡單的自己生成了帳戶信息。
[if !supportLists]3.2.1.1?[endif]步驟1:修改register.html頁面府喳,當(dāng)點(diǎn)擊注冊按鈕時(shí)向服務(wù)器發(fā)送請求
1.修改手機(jī)號為郵箱地址
2.給注冊按鈕添加事件蒲肋,點(diǎn)擊它完成向服務(wù)器發(fā)送請求操作
[if !supportLists]3.2.1.2?[endif]步驟2:服務(wù)器端完成注冊操作
注意:注冊時(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類型的返回結(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àn)證碼
將資料中的CheckImageServlet復(fù)制到utils包下在web.xml文件中配置
在login.html頁面上添加
點(diǎn)擊圖片驗(yàn)證碼切換圖片
[if !supportLists]3.2.2.2?[endif]步驟2:完成點(diǎn)擊立即登錄操作路鹰,將信息發(fā)送到服務(wù)器端
注意:在頁面上需要給用戶名密碼驗(yàn)證碼添加name屬性
[if !supportLists]3.2.2.3?[endif]步驟3:在服務(wù)器端完成登錄操作,并響應(yīng)數(shù)據(jù)到瀏覽器端
獲取請求參數(shù)收厨,判斷驗(yàn)證碼是否正確
調(diào)用service完成登錄操作
在瀏覽器端處理服務(wù)器的響應(yīng)數(shù)據(jù)
注意:在login.html頁面上我們進(jìn)行了修改
[if !supportLists]3.2.2.4?[endif]步驟4:完成郵箱登錄
在登錄程序中添加一段來判斷是否是郵箱
[if !supportLists]3.2.2.5?[endif]步驟5:在服務(wù)器端進(jìn)行校驗(yàn)
[if !supportLists]3.2.2.6?[endif]步驟6:關(guān)于密碼md5加密問題
Java加密
在mysql中對密碼進(jìn)行加密
UPDATE customer SET PASSWORD=MD5('123');
[if !supportLists]3.2.2.7?[endif]步驟7登錄后晋柱,跳轉(zhuǎn)到space.html頁面加載客戶帳戶信息
給space.html頁面中導(dǎo)入一個(gè)space.js文件,在space.js文件中
這個(gè)函數(shù)是頁面加載完成后執(zhí)行诵叁。我們就可以在函數(shù)中向服務(wù)器發(fā)送請求雁竞,來獲取客戶的帳戶信息在頁面上顯示
1.向服務(wù)器發(fā)送請求
2.在服務(wù)器端判斷客戶是否登錄
3.客戶登錄,查詢客戶的帳戶信息
注意:在JsonResult中雙封裝了一個(gè)content信息,它主要是用于封裝查詢的對象碑诉,例如Account對象彪腔。
4.在頁面上處理帳戶信息顯示
首先在space.html頁面上添加了id,在js代碼中進(jìn)行了處理
[if !supportLists]3.2.3?[endif]用戶管理-郵箱認(rèn)證
郵箱認(rèn)證主要就是修改customer表中的email_status字段值修改為1
第一部分:點(diǎn)擊”認(rèn)證”彈出窗口,在窗口中顯示用戶注冊時(shí)的郵箱进栽,可以在點(diǎn)擊按鈕向服務(wù)器發(fā)送請求德挣,服務(wù)器端要向郵箱發(fā)送一封郵件。
第二部分:完成郵箱認(rèn)證操作
[if !supportLists]3.2.3.1?[endif]步驟1:點(diǎn)擊”認(rèn)證”彈出窗口
在space.html頁面上添加了模態(tài)框代碼
在”認(rèn)證”上添加
在space.js文件中
接下來我們修改模態(tài)框
[if !supportLists]3.2.3.2?[endif]步驟2:完成服務(wù)器端客戶信息查詢快毛,在文本框中顯示客戶的郵箱地址
瀏覽器端處理
關(guān)于客戶郵箱認(rèn)證時(shí)顯示問題處理
在整個(gè)space.html頁面加載后格嗅,處理郵箱認(rèn)證顯示
注意:服務(wù)器端在查詢帳戶信息時(shí),將客戶信息也封裝到Account對象中祸泪。
[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.
前臺給“認(rèn)證”按鈕添加事件吗浩,點(diǎn)擊它向服務(wù)器發(fā)送請求建芙,攜帶著郵箱與錄入驗(yàn)證碼没隘,在服務(wù)器端完成認(rèn)證操作。
[if !supportLists]3.2.4?[endif]帳戶中心-產(chǎn)品購買
產(chǎn)品購買禁荸,我們首先要對產(chǎn)品進(jìn)行查詢右蒲。我們在p2p_home中要查詢產(chǎn)品信息,在p2p_management工程中已經(jīng)提供了產(chǎn)品的crud操作赶熟,會使用跨域來完成數(shù)據(jù)查詢瑰妄。可以使用jquery提供的getJson操作
對于產(chǎn)品的購買映砖,我們怎樣操作?
1.用戶的帳戶表中的信息一定要改變
2.product_account表间坐,這張表中記錄的是客戶的投資信息。
注意:在product_account表中我們還需要添加兩個(gè)字段邑退,一個(gè)是money代表投資金額 竹宋,還需要記錄本次交易收益interest
[if !supportLists]3.2.4.1?[endif]步驟1:跨域查詢產(chǎn)品信息在moto.html頁面上展示產(chǎn)品
在moto.js中完成向p2p_management工程發(fā)送請求,查詢所有產(chǎn)品信息
在p2p_management的ProductServlet的findAll方法中修改
[if !supportLists]3.2.4.2?[endif]步驟2:在moto.html頁面上展示產(chǎn)品信息
我們使用一個(gè)jquery的插件來實(shí)現(xiàn)產(chǎn)品信息的滾動(dòng)展示地技。
1.導(dǎo)入自動(dòng)滾動(dòng)jquery插件相關(guān)的css與js文件
2.在頁面上進(jìn)行修改
3.在moto.js文件中拼裝html代碼時(shí)
[if !supportLists]3.2.4.3?[endif]步驟3:moto.html頁面上產(chǎn)品購買信息生成
1.點(diǎn)擊我要購買時(shí)在頁頁面上展示產(chǎn)品信息
2.在moto.html頁面上展示當(dāng)前要購買的產(chǎn)品的相關(guān)數(shù)據(jù)及計(jì)算收益信息
預(yù)期收益=本金*預(yù)期收益率/100/12*limit
[if !supportLists]3.2.4.4?[endif]步驟4:完成購買操作
將投資的金額與產(chǎn)品信息傳遞到服務(wù)器蜈七,在服務(wù)器端進(jìn)行操作,來完成購買莫矗。
修改帳戶信息飒硅,向product_account表中插入數(shù)據(jù)。注意:在操作前作谚,要判斷當(dāng)前用戶是否登錄三娩,要判斷帳戶的余額是否充足。
1.向服務(wù)器發(fā)送我們的投資請求
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)品投資查詢分析
對于產(chǎn)品投資查詢彬伦,我們主要是完成用戶資產(chǎn)的信息查詢滔悉。
伊诵、
我們要查詢的信息,包括當(dāng)前客戶的帳戶信息回官,購買的理財(cái)產(chǎn)品信息曹宴。
對于帳戶信息,我們要查詢account表歉提。
對于購買的產(chǎn)品信息笛坦,包括product表 product_account表 customer表
問題:怎樣去完成查詢以上信息操作,查詢到信息后苔巨,怎樣響應(yīng)到瀏覽器端版扩?
關(guān)于帳戶信息可以從select * from account where cid=?就可以查詢到。
表格中的數(shù)據(jù)要從product_account, customer,product表中查詢出來侄泽。
服務(wù)器給我們返回的數(shù)據(jù)應(yīng)該是json類型礁芦。
JsonResult來封裝返回的數(shù)據(jù)就可以。JsonResult中定義了一個(gè)content對象悼尾,它是Object類型柿扣。
[if !supportLists]3.2.5.2?[endif]步驟2:前端向服務(wù)器發(fā)送請求來查詢投資信息
Servlet中操作
Service中操作
[if !supportLists]3.2.5.3?[endif]步驟3在dao中查詢購買的產(chǎn)品相關(guān)信息
在service中將查詢的結(jié)果進(jìn)行了處理
[if !supportLists]3.2.5.4?[endif]步驟4:在頁面上展示投資產(chǎn)品及帳戶相關(guān)信息
[if !supportLists]3.2.5.5?[endif]步驟5:展示購買理財(cái)產(chǎn)品是否到期,處理頁面上時(shí)間顯示問題
關(guān)于時(shí)間顯示問題,在頁面上修改
在頁面上展示當(dāng)前產(chǎn)品是否到期
可以在服務(wù)器端完成闺魏,在ProductAccount類中添加一個(gè)屬性未状。
[if !supportLists]3.3?[endif]項(xiàng)目優(yōu)化與增強(qiáng)
[if !supportLists]3.3.1?[endif]監(jiān)聽投資到期
帳戶表中的interest它記錄的當(dāng)前用戶的總收益情況。
做一個(gè)定時(shí)處理程序析桥,在每天晚上0點(diǎn)來掃描投資信息司草,如果當(dāng)前投資到期了,將這次投資的收益添加到帳戶的interest上泡仗。會使用到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)化
使用工廠模式來完成優(yōu)化埋虹。結(jié)合著配置文件來減化操作。
我們的思路:將關(guān)于service與dao的相關(guān)類都配置在xml文件中沮焕,結(jié)合java中反射與工廠模式來完成service與dao的獲取吨岭。
在使用dom4j是報(bào)這樣一錯(cuò),
原因是dom4j與xpath語法結(jié)合時(shí)峦树,需要在單獨(dú)導(dǎo)入一個(gè)jar包
在servlet中要使用service對象辣辫,而我們獲取bean.xml文件的路徑是通過ServletContext對象來獲取classes目錄
在service中要獲取dao對象,而在service中獲取bean.xml文件的路徑
[if !supportLists]3.3.3?[endif]Redis緩存優(yōu)化
我們可以將產(chǎn)品信息保存到redis中魁巩。以后每一次查詢都從redis中獲取產(chǎn)品信息急灭。
不用每一次都與數(shù)據(jù)庫交互。
我們可以將關(guān)于產(chǎn)品信息的json串存儲到redis中谷遂,以后從redis中獲取就可以葬馋。
在查詢理財(cái)產(chǎn)品時(shí),先從redis中獲取,如果沒有在從數(shù)據(jù)庫中查詢出來畴嘶,在保存到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ò)問題窗悯。
如果修改后還有問題区匣,將DEVICE=eth0修改為DEVICE=eth1
重啟網(wǎng)絡(luò)服務(wù)service network restart
[if !supportLists]4.2?[endif]將mysql數(shù)據(jù)庫導(dǎo)入,并生成war文件導(dǎo)入到tomcat中
在開發(fā)環(huán)境下導(dǎo)出我們的數(shù)據(jù)庫信息
將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下的類都要實(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文件