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