JavaWeb图书管理系统day03
- 視頻+資料+筆記【鏈接:https://pan.baidu.com/s/127I2oA8zvhTECCmC6wMSmQ? ?提取碼:zjxs】
- JavaWeb圖書管理系統(tǒng)【bookEstore文檔】
- JavaWeb圖書管理系統(tǒng)【源碼 + 效果展示】
目錄
一、生成訂單
二、查看訂單
三、訂單的取消與支付
四、權(quán)限控制
一、生成訂單
1.生成訂單
 ?? ?1.showCart.jsp頁面,點(diǎn)擊結(jié)算會(huì)生成訂單
 ?? ?2.會(huì)跳轉(zhuǎn)到order.jsp頁面,在頁面展示我們訂單中的信息
 ?? ? ?需要輸入一上訂單的收貨地址
 ?? ?生成訂單的代碼實(shí)現(xiàn):
 ?? ??? ?1.在order.jsp頁面表單會(huì)向 ${pageContext.request.contextPath}/order提交
 ?? ??? ? ?表單中有一個(gè)隱藏域 <input type="hidden" name="method" value="add">
 ?? ??? ?2.在 OrderServlet中有一個(gè)add方法,它是訂單添加操作
 ?? ??? ??? ?
 ?? ??? ??? ?訂單的添加注意事項(xiàng):
 ?? ??? ??? ??? ?當(dāng)訂單生成后,需要對以下的表進(jìn)行操作
 ?? ??? ??? ??? ?1.訂單表中要插入數(shù)據(jù)
 ?? ??? ??? ??? ?2.商品表中的商品數(shù)量要進(jìn)行修改(修改商品的庫存)
 ?? ??? ??? ??? ?3.訂單與用戶之間也存在關(guān)系,添加訂單時(shí),也需要得到當(dāng)前用戶的id
 ?? ??? ??? ??? ?
 ?? ??? ??? ?以上操作需要進(jìn)行事務(wù)控制。
 ?? ??? ??? ??? ?1.獲取Connection時(shí),要使用同一個(gè),需要在DataSourceUtils中
 ?? ??? ??? ??? ? 對獲取Connection對象操作進(jìn)行修改,將其放入到ThreadLocale中
 ?? ??? ??? ??? ?2.Dbutils
 ?? ??? ??? ??? ??? ?QueryRunner 直接使用帶參數(shù)的,參數(shù)類型是DataSource類型。
 ?? ??? ??? ??? ??? ?new QueryRunner(DataSource ds);這個(gè)操作,在調(diào)用update,query方法,
 ?? ??? ??? ??? ??? ?一般不會(huì)帶Connection參數(shù),這樣,它就是一條sql一個(gè)事務(wù)。
 ?? ??? ??? ??? ??? ?
 ?? ??? ??? ??? ??? ?而現(xiàn)在,我們需要事務(wù)管理,所以我們在使用QueryRunner時(shí),就會(huì)
 ?? ??? ??? ??? ??? ?不帶參數(shù) ?new QueryRunner(),而使用帶Connection參數(shù)的update、query方法。
 ?? ??? ??? ??? ??? ?
 ?? ??? ??? ?---------------------------------
 ?? ??? ??? ?要注意:訂單要包含商品信息,這時(shí)就需要從session中獲取購物車,將購物車中的信息封裝Order對象中。
?? ??? ??? ?現(xiàn)在,我們需要事務(wù)控制,所以我們在service層進(jìn)行了事務(wù)的開啟。
添加訂單操作? ? ? ? ? ? 在添加訂單項(xiàng)時(shí),使用了批處理,因?yàn)橛唵闻c商品之間存在多對多關(guān)系,
 ?? ??? ??? ?那么,我們的中間表orderItem,它就有可能有多條數(shù)據(jù),所以我們使用了QueryRuner的batch方法完成添加訂單項(xiàng)操作。
 ?? ??? ??? ?
 ?? ??? ??? ?注意:當(dāng)我們操作完成后,一定要將Connection對象從ThreadLocale中remove掉。
二、查看訂單
2.查看訂單
?? ?查看訂單,會(huì)根據(jù)用戶的role去顯示出不同的訂單。
 ?? ?如果role=admin,它查詢出所有的訂單
 ?? ?如果role=user,它只查詢出當(dāng)前用戶的訂單
 ?? ?
 ?? ?代碼實(shí)現(xiàn):
 ?? ??? ?查看訂單的入口:
 ?? ??? ??? ?1.在首頁,提供了查看訂單連接
 ?? ??? ??? ?2.當(dāng)用戶添加完成訂單成功后,會(huì)顯示查看訂單操作
 ?? ??? ??? ?<a href="${pageContext.request.contextPath}/order?method=search">
 ?? ??? ??? ?
 ?? ??? ?1.當(dāng)點(diǎn)擊連接后會(huì)訪問OrderServlet,并提交一個(gè)參數(shù) method=search;
 ?? ??? ?2.在OrderServlet會(huì)首先得到當(dāng)前用戶 ? request.getSession().getAttribute("user");?? ?
 ?? ??? ? ?如果用戶沒有登錄,會(huì)讓它登錄,如果用戶登錄了,會(huì)查看訂單信息。
 ?? ??? ? ?
 ?? ??? ?3.當(dāng)調(diào)用dao中查詢訂單操作時(shí),會(huì)根據(jù)當(dāng)前用戶的role進(jìn)行不同的sql語句操作。
 ? ? ? ? ? 查詢出訂單后,訂單中不包含商品信息,所以要根據(jù)訂單的信息,在orderItem表與products表中查詢出商品信息。
?? ??? ?4.查詢出所有訂單后,會(huì)得到一個(gè)List<Order>,將集合存儲(chǔ)到request域中,
 ?? ??? ? ?最后請求轉(zhuǎn)發(fā)到showOrder.jsp頁面,在頁面上顯示出所有查詢出的訂單。
三、訂單的取消與支付
3.訂單的取消與支付
 ?? ?1.支付操作
 ?? ??? ?使用了在線支付操作 ? epay第三方支付平臺(tái).
 ?? ??? ?
 ?? ??? ?在顯示訂單頁面上showOrder.jsp頁面,顯示訂單信息中,包含了當(dāng)前支付狀態(tài)。
 ?? ??? ?會(huì)顯示 ?"已支付" ?"未支付",如果是未支付,會(huì)有一個(gè)連接訪問pay.jsp頁面,
 ?? ??? ?并將當(dāng)前訂單的id,以及當(dāng)前訂單的金額傳遞到pay.jsp頁面。
 ?? ??? ?
 ?? ??? ?1.在pay.jsp頁面上可以選擇銀行,表單提交時(shí),將訂單編號(hào),金額,以及銀行,提交到OnlinepayServlet中。
 ?? ??? ?2.在OnlinePayServlet中完成請求參數(shù)封裝
 ?? ??? ?3.第三方支付,會(huì)根據(jù)你提交的請求參數(shù) ? p8_Url 向這個(gè)路徑發(fā)送信息,
 ?? ??? ?4.可以指定p8_url為CallbackServlet,那么我們在servlet中就可以得到支付結(jié)果信息
 ?? ??? ?5.通過判斷信息是否正確,以及r9_BType=1 ?r9_BType=2 可以知道,是否支付成功
 ?? ??? ?6.當(dāng)判斷支付成功后,我們要修改訂單的狀態(tài)。
 ?? ??? ??? ?1.在orders表中有一個(gè)字段,paystate=0 代表未支付,我們支付成功后,要修改訂單的狀態(tài)。
 ?? ??? ??? ??? ?paystat=1,這個(gè)代表訂單已對付。
 ?? ??? ??? ??? ?
 ?? ??? ??? ?2.修改訂單狀態(tài)要根據(jù)訂單編號(hào)修改,在返回的支付結(jié)果信息中r6_Order,它就代表了我們的訂單編號(hào)。?? ??? ??? ??? ?
 ?? ?---------------------------------------------
 ?? ?2.訂單取消
 ?? ??? ?在顯示訂單的頁面上,會(huì)提供一個(gè)刪除訂單的鏈接。
 ?? ??? ?
 ?? ??? ?1.錄取消訂單時(shí),這個(gè)超連接會(huì)攜帶當(dāng)前訂單的編號(hào)傳遞到服務(wù)器端。
 ?? ??? ??? ?<a href="${pageContext.request.contextPath}/order?method=del&id=${order.id}">取消訂單</a>
 ?? ??? ?2.這個(gè)鏈接會(huì)訪問OrderServlet,并且 method=del ?id=訂單編號(hào)
 ?? ??? ??? ?
 ?? ??? ?3.OrderServlet中會(huì)根據(jù)傳遞method 判斷 執(zhí)行 取消訂單操作,會(huì)根據(jù)id知道要?jiǎng)h除哪一個(gè)訂單。
 ?? ??? ??? ?
 ?? ??? ?4.刪除訂單注意事項(xiàng)
 ?? ??? ??? ?1.刪除訂單要將orders表中數(shù)據(jù)刪除---根據(jù)id刪除。
 ?? ??? ??? ?2.需要?jiǎng)h除orderItem表中數(shù)據(jù)。
 ?? ??? ??? ?3.需要修改商品的數(shù)量,也就是說需要對products表進(jìn)行update操作。
 ?? ??? ??? ?
 ?? ??? ??? ?代碼:
 ?? ??? ??? ??? ?1.根據(jù)訂單id在orderitem表中查詢出相關(guān)的商品信息.
 ?? ??? ??? ??? ?2.修改商品信息
 ?? ??? ??? ??? ?3.刪除訂單項(xiàng)信息
 ?? ??? ??? ??? ?4.刪除訂單.
 ?? ??? ??? ?以上操作,也需要進(jìn)行事務(wù)控制。
四、權(quán)限控制
4.權(quán)限控制
 ?? ?
 ?? ?當(dāng)前系統(tǒng)有三種用戶:
 ?? ??? ?1.游客? ?----? 查看商品
 ?? ??? ?2.user? ? ----? 查看商品 ?生成訂單 ?查看訂單 ?
 ?? ??? ?3.admin ----- 下載榜單 ?添加商品.
 ?? ??? ?
 ?? ?權(quán)限控制---使用annotation ?+ 動(dòng)態(tài)代理完成操作.
? ? 對數(shù)據(jù)庫進(jìn)行修改
 ?? ??? ?users表中的role字段作為一個(gè)外鍵
 ?? ??? ?添加一個(gè)role表,這個(gè)表中有相關(guān)用戶角色信息
 ?? ??? ?
 ?? ??? ?create table role(
 ?? ??? ??? ?role varchar(100) primary key
 ?? ??? ?)
 ?? ??? ?users表中的role字段是一個(gè)外鍵,依賴于role表中的role字段.
 ?? ??? ?
 ?? ??? ?
 ?? ??? ?create table privileges(
 ?? ??? ??? ?id int primary key auto_increment, ?
 ?? ??? ??? ?name varchar(20) ?權(quán)限名稱
 ?? ??? ?)
 ?? ??? ?
 ?? ??? ?角色與權(quán)限之間存在多對多對象
 ?? ??? ?有一個(gè)中間表
 ?? ??? ?
 ?? ??? ?
 ?? ??? ?create table userprivilege(
 ?? ??? ??? ?privilege_id int,
 ?? ??? ??? ?role varchar(100),
 ?? ??? ??? ?primary key(privilege_id,role),
 ?? ??? ??? ?foreign key userprivilege(privilege_id) references privileges(id),
 ?? ??? ??? ?foreign key userprivilege(role) references role(role)
 ?? ??? ?)
 ?? ??? ?-----------------------------------------
 ?? ??? ?1.做一個(gè)注解
 ?? ??? ??? ?@Retention(RetentionPolicy.RUNTIME) ?//說明當(dāng)前注解在runtime階段有效果
 ?? ??? ??? ?@Target(ElementType.METHOD) //當(dāng)前注解是在方法上使用的
 ?? ??? ??? ?@Inherited ?//當(dāng)前注解具有繼承性
 ?? ??? ??? ?public @interface PrivilegeInfo {
?? ??? ??? ??? ?String value(); //權(quán)限名稱
 ?? ??? ??? ?}
 ?? ??? ?
 ?? ??? ?2.對所有的service層的類進(jìn)行提取接口操作.
 ?? ??? ??? ?ProductServiceImpl 類---------->ProductService 接口
 ?? ??? ??? ?OrderServieImple類 ------------>OrderService接口.
 ?? ??? ??? ?
 ?? ??? ??? ?在接口的方法上添加注解,注解中的value值,就是當(dāng)前方法要執(zhí)行,所需要的權(quán)限名稱。
 ?? ??? ??? ?
 ?? ??? ?3.在servlet中得到的service對象,我們不直接new出來,可以針對每一個(gè)Service提供一個(gè)工廠,
 ? ? ? ? ?在工廠中生產(chǎn)對應(yīng)的service對象,并且,返回的是代理對象。
?? ??? ??? ?OrderServiceFactory
 ?? ??? ??? ?ProductServiceFactory
 ?? ??? ??? ?
 ?? ??? ??? ?它們用于生產(chǎn)不同的service對象
 ?? ??? ??? ?
 ?? ??? ??? ?在工廠中創(chuàng)建出對應(yīng)的service對象,在提供的getInstance()方法中,返回其代理對象。
 ?? ??? ??? ?
 ?? ??? ??? ?這樣我們在servlet中,就通過工廠獲取service對象,得到的其實(shí)是代理對象。
 ?? ??? ??? ?
 ?? ??? ?4.在動(dòng)態(tài)代理的InvocationHandler的invoke方法中進(jìn)行權(quán)限控制。
 ?? ??? ??? ?
 ?? ??? ??? ?1.得到當(dāng)前方法上的注解
 ?? ??? ??? ??? ?1.判斷當(dāng)前方法上是否有指定的注解
 ?? ??? ??? ??? ?2.如果沒有,代表這個(gè)操作不需要權(quán)限控制。
 ? ? ? ? ? ? ? ? ? ?如果有,就會(huì)存在我們的注解。
 ?? ??? ??? ??? ?3.得到方法上的注解,通過注解對象得到當(dāng)前方法要執(zhí)行時(shí) 所需要的權(quán)限名稱。
 ?? ??? ??? ??? ?
 ?? ??? ??? ??? ?4.得到注解后,還需要得到當(dāng)前用戶,好么我們在所有添加注解的方法上
 ?? ??? ??? ??? ? ?添加了一個(gè)參數(shù) ?User.
 ?? ??? ??? ??? ? ?
 ?? ??? ??? ??? ? ?可以在invoke方法中通過args參數(shù)獲取User對象.
 ?? ??? ??? ??? ? ?
 ?? ??? ??? ??? ?5.可以判斷當(dāng)前用戶是否存在,知道是否有權(quán)限操作。
 ?? ??? ??? ??? ??? ?1.如果用戶不存在,throw new PrivilegeException();權(quán)限不足。
 ?? ??? ??? ??? ??? ?2.如果用戶存在
 ?? ??? ??? ??? ??? ??? ?1.根據(jù)user的role,在數(shù)據(jù)庫中查詢出用戶所具有的所有的權(quán)限名稱,
 ?? ??? ??? ??? ??? ??? ? ?與注解上提供的權(quán)限名稱對比。如果包含,那么具有權(quán)限;如果不包含,沒有權(quán)限。
 ?? ??? ??? ??? ??? ??? ? ?
 ?? ??? ??? ??? ??? ??? ?2.不包含 throw new PrivilegeException();權(quán)限不足。
 ?? ??? ??? ??? ??? ??? ? ? 包含 method.invoke();
總結(jié)
以上是生活随笔為你收集整理的JavaWeb图书管理系统day03的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: JavaWeb图书管理系统day02
- 下一篇: JavaWeb黑马旅游网-学习笔记02【
