首頁 Java java教程 java web開發_購物車功能實現

java web開發_購物車功能實現

Dec 17, 2016 pm 02:29 PM

之前沒有接觸過購物車的東東,也不知道購物車該怎麼做,所以在查詢了很多資料,總結一下購物車的功能實現。

查詢的資料,找到三種方法:

1.用cookie實現購物車;

2.用session實現購物車;

3.用cookie和資料庫(購物車資訊持久化)實現購物車;

================================================ =========================

分析一下這三種方法的優缺點:

1.單純有cookie實現購物車,這樣的購物車不是很理想,設想一下,如果客戶端的瀏覽器把cookie給禁用了,

這種方法就會在這裡流產...

2.session中保存購物車的信息,這個只是在一個會話中可用,如果用戶沒有登錄,或者說登錄了以後,添加購物車,在關閉瀏覽器

或者登出後,之前所添加的購物車通通都流產啦...

3.我這裡要說就是這種方法啦.....

主要的流程:

A.用戶登錄前的資料流:用戶在沒有登入系統的時候,對喜歡的商品進行添加購物車,那麼這個時候,我們可以把購物車資訊保存

到cookie中,這裡會涉及到cookie的添加,修改操作;也即如果之前在cookie中不存對應的cookie,則就對cookie進行添加操作。

如果在cookie中存在對應的cookie,那麼,這時候,就要對cookie進行修改操作了(這裡涉及到用戶對同一個商品進行多次添加購物車的情況)。

B.使用者登入後的資料流:使用者在登入後,系統首先做的第一件事就是去獲取對應的cookies,如果存在相關的購物車cookies,那麼就對該購物車

資訊進行相應使用者User的持久化操作,要麼添加,要麼修改。 (添加操作:該用戶所對應的購物車如果沒有相應的信息進行添加操作;修改操作:類似的,

如果存在對應用戶的購物車信息,就進行修改操作)。使用者登入後,也可以進行購物車的新增操作,不過,這裡不是加入cookie中,而是直接持久化到

資料庫。註:使用者登入後的資料都是和資料庫打交道。

================================================ =========================

程式碼部分:

==================== ================================================== =====

注:

1 Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME = "iduona_cashTicket_";

/**
     * 用户登录
     * 
     * @author hongten
     */
    public void login() {
        //用户登录的时候,去读取cookies,并且进行持久话操作,更多的登录操作这里省略啦....
        peristShoppingCartWhenUserLogin(newUser);
        }

/**
     * 加入购物车<br>
     * ============================================<br>
     * 用户登录前:<br>
     * 用户在选择现金券的时候,点击现金券的加入购物车的时候,会把该现金券的信息(现金券的id,购买数量)<br>
     * 传递到这里,这时候,后台要做的就是从cookie中查询出是否有相同的记录,如果有相同的记录<br>
     * 则把相应的记录更新;否则,就添加新的记录<br>
     * 用户登录后:<br>
     * 用户在登录后,如果有添加购物车操作,则不用保存到cookie中,而是直接持久化购物车信息<br>
     * 
     * @throws Exception
     */
    public void addToShoppingCart() throws Exception {
        if (cashTicket == null || cashTicket.getId() == null || cashTicket.getId() < 1) {
            write("nullId");
        } else if (q == null || q == "") {
            // 购买数量,默认情况下面为1
            q = String.valueOf(1);
        } else {
            // 读取所有的cookie
            Cookie cookies[] = ServletActionContext.getRequest().getCookies();
            if (cookies == null || cookies.length < 0) {
                // 没有cookie
                System.out.println("there is no any cookie ..");
            } else {
                // 判断用户是否登录
                if (getUserInSession() == null) {
                    boolean flag = true;
                    for (Cookie c : cookies) {
                        if (c.getName().equals(Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME + cashTicket.getId())) {
                            // 说明已有的cookies中有相应的cookie,就进行更新操作
                            Integer oldValue = Integer.valueOf(c.getValue());
                            Integer newValue = Integer.valueOf(oldValue + Integer.valueOf(q));
                            fixCookie(c, newValue.toString().trim());
                            flag = false;
                        }
                    }
                    // 说明已有的cookies中没有相应的cookie,就进行添加操作
                    if (flag) {
                        addCookie(Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME + cashTicket.getId(), q.trim());
                    }

                    // ==================================================
                    // 测试用,读取所有的cookies
                    readShoppingCartFromCookie();
                    // ==================================================

                    write("success");
                } else {
                    // 如果用户登录,说明session存在user,这时就持久化购物车信息
                    CashTicket cashTicketTemp = cashTicketService.get(cashTicket.getId());
                    if (shoppingCartService.isExistUserAndCashTicket(getUserInSession(), cashTicketTemp)) {
                        ShoppingCart oldShoppingCart = shoppingCartService.getByUserAndCashTicket(getUserInSession(), cashTicketTemp);
                        oldShoppingCart.setAmount(oldShoppingCart.getAmount() + Integer.valueOf(q));
                        if (shoppingCartService.update(oldShoppingCart)) {
                            write("success");
                        }
                    } else {
                        ShoppingCart shoppingCartTemp = new ShoppingCart();
                        shoppingCartTemp.setAmount(Integer.valueOf(q));
                        shoppingCartTemp.setUser(getUserInSession());
                        shoppingCartTemp.setCashTicket(cashTicketTemp);
                        shoppingCartTemp.setCreateTime(new Date());
                        shoppingCartTemp.setStatusType(StatusType.POSITIVE);
                        shoppingCartTemp.setUuid(UUID.randomUUID().toString());
                        if (shoppingCartService.save(shoppingCartTemp)) {
                            write("success");
                        }
                    }
                }
            }
        }
    }

/**
     * 从cookie中读取购物车信息
     * 
     * @throws Exception
     * @return
     */
    public void readShoppingCartFromCookie() throws Exception {
        System.out.println("======================================================");
        Cookie cookies[] = ServletActionContext.getRequest().getCookies();
        if (cookies == null || cookies.length < 0) {
            // System.out.println("there is no any cookie ..");
            // 没有cookie
        } else {
            for (Cookie c : cookies) {
                System.out.println("haha there are many cookies :" + c.getName() + "    " + c.getValue());
            }
        }
    }

    /**
     * 添加cookie操作
     * 
     * @param name
     *            cookie的name
     * @param value
     *            cookie的value
     */
    public void addCookie(String name, String value) {
        Cookie cookie = new Cookie(name.trim(), value.trim());
        cookie.setMaxAge(2 * 60 * 60 * 1000);// 设置为2个钟
        ServletActionContext.getResponse().addCookie(cookie);
    }

    /**
     * 更新cookie操作
     * 
     * @param c
     *            要修改的cookie
     * @param value
     *            修改的cookie的值
     */
    public void fixCookie(Cookie c, String value) {
        c.setValue(value.trim());
        c.setMaxAge(2 * 60 * 60 * 1000);// 设置为2个钟
        ServletActionContext.getResponse().addCookie(c);
    }

    /**
     * 当用户登录的时候,持久化cookie中的购物车信息,更新为本用户的购物车信息
     */
    public void peristShoppingCartWhenUserLogin(User user) {
        if (null != user) {
            Cookie cookies[] = ServletActionContext.getRequest().getCookies();
            if (cookies != null) {
                for (Cookie c : cookies) {
                    if (c.getName().startsWith(Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME)) {
                        // 获取cookie的名称:"iduona_cashTicket_45" 和 cookie的值: "21"
                        String name = c.getName();
                        Integer amount = Integer.valueOf(Integer.valueOf(c.getValue())+Integer.valueOf(q));
                        Integer ct_id = Integer.valueOf(name.substring(name.lastIndexOf("_") + 1));
                        CashTicket temp = cashTicketService.get(ct_id);
                        ShoppingCart shoppingCartTemp = new ShoppingCart();
                        if (null != temp) {
                            if (shoppingCartService.isExistUserAndCashTicket(user, temp)) {
                                // 进行更新操作
                                ShoppingCart oldShoppingCart = shoppingCartService.getByUserAndCashTicket(user, temp);
                                oldShoppingCart.setAmount(amount);
                                shoppingCartService.update(oldShoppingCart);
                            } else {
                                // 否则进行保存记录
                                shoppingCartTemp.setAmount(amount);
                                shoppingCartTemp.setUser(user);
                                shoppingCartTemp.setCashTicket(temp);
                                shoppingCartTemp.setCreateTime(new Date());
                                shoppingCartTemp.setStatusType(StatusType.POSITIVE);
                                shoppingCartTemp.setUuid(UUID.randomUUID().toString());
                                shoppingCartService.save(shoppingCartTemp);
                            }
                        }
                    }
                }
                // 移除所有的现金券cookies
                removeAllCookies();
            }
        }
    }

    /**
     * 移除所有的现金券cookies操作
     */
    public void removeAllCookies() {
        Cookie cookies[] = ServletActionContext.getRequest().getCookies();
        if (cookies == null || cookies.length < 0) {
            // 没有cookie
            System.out.println("there is no any cookie ..");
        } else {
            System.out.println("开始删除cookies..");
            for (Cookie c : cookies) {
                if (c.getName().startsWith(Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME)) {
                    c.setMaxAge(0);// 设置为0
                    ServletActionContext.getResponse().addCookie(c);
                }
            }
        }
    }
登入後複製

這是部分代碼....

效果:

用戶沒有登錄的情況下

java web开发_购物车功能实现

用戶登入了以後:

java web开发_购物车功能实现

資料庫裡面的狀況:

登入前資料

java web开发_购物车功能实现



web_🎜 🎜
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1247
24
公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles