day20_day23課堂筆記

day20_day23課堂筆記

一、概述

  做一個項目:bookStore圖書商城   目的:將前期學過的知識進行整合。

    1. 商城首頁 index.jsp

    2. 在首頁上點擊類別鏈接時會跳轉到 product_list.jsp 頁面展示相關商品信息

    3. 新用戶註冊頁面

    4. 當我們點擊我的帳戶

        如果用戶沒有登陸,則跳轉到 login.jsp 頁面

        如果用戶登陸了,角色是普通用戶,則跳轉到 myAccount.jsp 頁面

        如果用戶已經登陸,並且它的角色是管理員,則跳轉到 /admin/login/home.jsp 頁面

    5. 點擊購物車,跳轉到 cart.jsp 頁面展示出購物車中商品信息

    6.搜索操作

        會對輸入的信息與商品的名稱進行 模糊匹配 ,將查詢出的數據在 product_list.jsp 頁面展示出來

二、分述

1.  關於用戶的操作(普通註冊的用戶)

    1.1 用戶信息的修改操作     1.2 用戶訂單查詢的操作     1.3 用戶退出(註銷)的操作

        用戶信息的修改操作:

            對於普通註冊用戶,它可以修改除了 會員郵箱 與 會員名 之外其它信息

        用戶訂單查詢的操作

            用戶可以查詢出自己的訂單,可以查看訂單詳情,可以刪除已支付的訂單

        用戶退出

            本質就是將存儲到 session 中的 User對象 invalidate(); 銷燬掉

    1.4 關於商品查看         查看所有商品信息         查看類別商品信息         查看類似名稱的商品信息         查看某個商品的詳細信息     1.5 關於購物車         將商品添加到購物車         查看購物車中商品信息         對購物車中商品信息修改及刪除     1.6 關於訂單操作         生成訂單         當前用戶所有訂單的查看         查看訂單的詳細信息         刪除訂單         如果訂單爲支付,我們可以點擊進行支付操作     1.7 支付操作         支付頁面是 pay.jsp

2.  關於後臺商城管理的操作

    2.1 商品管理         商品查看    a) 查看所有商品信息    b) 多條件查詢         商品編輯    對商品信息修改(上傳操作)         商品刪除    a) 刪除一件商品           b) 批量刪除         商品添加     (上傳操作)         下載銷售榜單

    2.2 訂單管理         查看所有的訂單         多條件查詢訂單         查看訂單詳細信息         訂單刪除

3.  數據庫設計

    通過ER圖來描述(實體關係圖)

    只畫了簡單的實體關係圖(屬性沒有添上)

    數據庫的架構設計圖如下:

三、功能具體實現(部分功能)

1.  註冊用戶

        register.jsp ——> RegistServlet ——> UserService ——> UserDao

        註冊成功後,需要發送一封激活郵件。

        在UserService中調用dao中addUser方法扣,執行下面代碼:

        我們需要創建一個 ActiveUserServlet 這樣一個 servlet。

        注意:在激活時,需要考慮激活碼的時間限制。

2.  登陸用戶

        login.jsp ——> LoginServlet ——> UserService ——> UserDao

        在登陸時,需要考慮用戶的狀態是否激活,如果沒有激活,用戶名與密碼正確,也不能登陸。

3.  關於點擊在 product_list.jsp 頁面上點擊“我的帳戶”的操作

        注意:在其他頁面上的點擊“我的帳戶”沒有做,目前只做了這一個頁面的。

        注意:如果用戶沒有登陸,則 session 中就不會有User對象,那麼會跳轉到 login.jsp。

                  如果用戶已經登陸了,則 session 中就會有User對象,會根據用戶的角色跳轉。

        1. 在 head.jsp 中將我們的帳戶的鏈接:

            <a href="login.jsp">我的帳戶</a>

            修改成訪問

            <a href="${pageContext.request.contextPath}/myAccount">我的帳戶</a>

        2. 創建一個 MyAccountServlet

4.  關於註冊用戶登陸後的操作

用戶信息修改操作

            從數據庫中將用戶信息查詢出來,回顯

            <a href="${pageContext.request.contextPath}/findUserById?id=${user.id}">用戶信息修改</a>

            創建一個 FindUserByIdServlet  完成用戶查找回顯功能。

            對數據進行修改操作

            創建 ModifyUserServlet 完成修改操作。

            注意:修改後,要將user從session中銷燬,重新登陸。

用戶退出操作

            <a href="${pageContext.request.contextPath}/logout">用戶退出</a>

            在LogOutServlet完成退出操作

5. 關於首頁上的商品類別查詢的操作

        根據類別查詢後的數據最終要在product_list.jsp頁面展示,並且是分頁顯示:

            select * from products limimt m,n where category=?

        如果點擊的是全部商品目錄就是查詢所有:

            select * from products limimt m,n

        代碼實現:

            在menu_seacher.jsp頁面上類別連接

            <a href="${pageContext.request.contextPath}/pageServlet?category=文學">文學</a>

        需要創建一個pageServlet

            這個servlet中與我們之前寫的分頁的servlet唯一的區別就是需要再獲取一個類別屬性

            String category=request.getParameter(“category”);

        再調用service,dao查詢出數據返回 PageBean

6. 關於訂單的操作

前臺-訂單操作

        a) 生成訂單

        b) 查看訂單(查看當前用戶所有訂單)

        c) 查看訂單詳情(查看某一個訂單的信息)

        d) 刪除訂單

後臺-訂單操作

        a) 查看訂單(查看所有用戶的訂單)

        b) 按條件查詢訂單(1. 收貨人查詢   2. 訂單號查詢)

        c) 刪除訂單


a) 生成訂單 

        將訂單數據 insert 到 orders 表中(批處理)

        將訂單相關數據 insert 到 orderitem 表中(批處理)

        update修改 products 表中的 pnum

    在 order.jsp 頁面上

    點擊提交訂單,就應該創建一個訂單。

    訂單生成思路圖:

    創建一個 CreateOrderServlet ,它是用於接收 order.jsp 頁面的請求的。

    在CreateOrderServlet中完成什麼操作?

        1. 收集訂單相關數據封裝成一個 Order 對象

        2. 調用 OrderService 完成訂單生成操作。

            注意:在 OrderService 中完成訂單的生成需要事務控制。


b) 查看訂單(查看當前用戶所有訂單) 

    查詢訂單詳情

    可以有兩種寫法:

        1.  寫一條sql語句,得到信息

        2.  寫n條sql語句,得到信息

    代碼如下圖所示:


7. 在線支付操作

    方式一:直接與各個銀行做接口

        優點:快捷。

        缺點:需要針對於不同銀行做實現,並且銀行接口變動,你也需要變動。 維護工作量極大。

    方式二:使用第三方支付

        優點:不需要考慮銀行,只與第三方支付進行交互。開發工作量極低。

        缺點:第三方支付需要一定的時間,並且會收取一定的費用。

    常見第三方支付公司

    易寶支付開發所需工具

    本次案例我們使用第三方支付

         我們使用的是易寶支付http://www.yeepay.com/

         前提條件:

            1. 必須申請一個商家用戶商家帳戶: 10001126856

            2. 需要網上銀行

            3. 真實ip地址

        支付流程:

        pay.jsp提交時會訪問一個PayOnlineServlet,在這個PayOnlineServlet中我們需要將傳遞給第三方支付公司的信息獲取到封裝成表格,併發送給第三方支付公司。

            問題1:發送信息有哪些?

                查看接口文檔。

            問題2:信息向哪發送? 

                正式請求地址:https://www.yeepay.com/app-merchant-proxy/node

            問題3:第三方支付公司反饋信息怎樣處理?

                按照接口文檔來處理。

        第三方支付公司反饋信息爲:

        http://localhost:8080/product/callBackServlet?p1_MerId=10001126856&r0_Cmd=Buy&r1_Code=1&r2_TrxId=914221214141971I&r3_Amt=0.01

        &r4_Cur=RMB&r5_Pid=&r6_Order=2cab9734-e148-44c8-a167-eed72e4abca0&r7_Uid=&r8_MP=&r9_BType=1&ru_Trxtime=20150531161117

        &ro_BankOrderId=2767595753150531&rb_BankId=BOC-NET&rp_PayDate=20150531161116&rq_CardNo=&rq_SourceFee=0.0&rq_TargetFee=0.0

        &hmac=7f60261451a3f8f51cacaa1bcd5592c4


8. 權限控制

    1. url級別的控制,使用Filter,來攔截指定的路徑,控制資源訪問。 粗粒度權限控制。

    2. 自定義標籤。

            後續會更新。。。

    3. Annotation(註解)+動態代理+工廠模式(擴展)。細粒度權限控制。      

        我們可以對行爲攔截(攔截service行爲)。

        使用 動態代理 與 Annotation 來完成。

        原理:我們在Userservice中使用自定義註解,這個自定義註解是用於定義當前行爲訪問需要的權限。(注意:我們這個項目把接口省略了,直接寫的實現類,雖不規範,但是簡潔!)

        步驟:

            1. 我們先自定義一個註解類(注意:自定義註解不是類,本質上是一個接口,但是叫法上我們以類相稱,雖不正確,但是親切!)

            2. 我們在Userservice中使用自定義註解

            3. 後面不知道該怎麼做了。。。


9. 代碼重構(優化Servlet)

  • 對servlet進行重構,在實際開發中,一般情況下是一個功能模塊對應一個servlet,簡單說,就是UserServlet、ProductServlet、OrderServlet、CartServlet。

    步驟:

    1. 創建一個 UserServlet,配置 web.xml

        <url-pattern>/user</url-pattern>

    2. 獲得發送請求的參數URI

            URL: 統一資源定位符(俗稱:網址)

            URI: 統一資源標識符

http://localhost:8080/day07_03_myApp1/1.html

            URL= 協議 主機IP(端口號) URI(當前應用的資源路徑)

        例如:http://localhost:8080/product/user?method=register

    優化一:

    以UserServlet爲例

        RegisterServlet、LoginServlet、 ActiveUserServlet、LogOutServlet、ModifyUserServlet、MyAccountServlet、FindUserServlet

        在UserServlet中完成以下方法對應以上的Servlet完成的功能,把之前的Servlet中的代碼粘過來放到每個功能下即可,如下圖所示:

        問題:這些方法怎樣被調用呢?反過來說,當我們點擊頁面上的登陸或註冊或……怎樣找到這些方法呢?如下圖所示:

            1. 先刪除之前的web.xml中配置的servlet映射,添加新的servlet映射:

            2. 修改其他頁面的跳轉鏈接,例如:

            3. 在UserServlet中完成下列代碼:

            同理:可以按照這種方式完成OrderServlet、ProductServlet、CartServlet功能。

            注意:添加商品操作不抽取,因爲它是文件上傳,也就是說,關於商品添加或修改操作的,只要涉及到上傳就不抽取。   

        經過這樣抽取(封裝)後,Servlet變少了,代碼簡潔了,但問題又來了,添加功能後,UserServlet就需要修改,這樣不好,不夠健壯,那就繼續封裝!

優化二:

反射思想:

    UserServlet.java中,不就是變量(字段)和方法嗎?UserServlet.java編譯後,生成UserServlet.class文件,

    UserServlet.java裏面的變量(字段)和方法在內存中就有了相應的位置,我們把這些“位置”看成對象,而整個.class文件我們看成Class對象,直接從內存的高度去獲取和使用它們。示例如下:  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章