day13-功能實現12

来源:https://www.cnblogs.com/liyuelian/archive/2023/01/01/17018681.html
-Advertisement-
Play Games

家居網購項目實現012 以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git 29.功能27-Ajax檢驗註冊名 29.1需求分析/圖解 用戶註冊時,後端通過驗證,提示用戶當前輸入的用戶名是否可用。 29.2思路分析 29.3代碼實現 ...


家居網購項目實現012

以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git

29.功能27-Ajax檢驗註冊名

29.1需求分析/圖解

用戶註冊時,後端通過驗證,提示用戶當前輸入的用戶名是否可用。

29.2思路分析

29.3代碼實現

dao層和service層的方法在之前已經實現過了,這裡不必再寫

29.3.1web層

MemberServlet添加方法isExistUserName,該方法返回json格式的數據給前端

/**
 * 校驗某個用戶名是否已經存在資料庫中
 *
 * @param req
 * @param resp
 * @throws ServletException
 * @throws IOException
 */
protected void isExistUserName(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1.獲取用戶名
    String username = req.getParameter("username");
    //2.調用service
    boolean isExistUsername = memberService.isExistsUsername(username);
    //3.返回json格式[按照前端的需求]
    //{"isExist":false}
    //先使用最簡單的拼接,一會使用可拓展的方式
    //String resultJson = "{\"isExist\":" + isExistUsername + "}";
    
    //=>將要返回的數據返回map=>json
    //使用map可以方便拓展
    HashMap<String, Object> resultMap = new HashMap<>();
    resultMap.put("isExist", isExistUsername);
    String resultJson = new Gson().toJson(resultMap);

    //4.返回json
    resp.getWriter().write(resultJson);
}

29.3.2前端

login.jsp使用Ajax局部請求刷新

//給註冊模塊的用戶名輸入框綁定一個失去焦點事件
$("#username").blur(function () {
    //獲取輸入的用戶名
    var username = this.value;
    //發出ajax請求(使用jquery的$.getJSON())
    //jQuery.getJSON(url,data,success(data,status,xhr))
    $.getJSON(
        "memberServlet",
        //使用json格式發送數據
        {
            "action": "isExistUserName",
            "username": username,
        },
        function (data) {
            if (data.isExist) {
                $("span.errorMsg").text("用戶名已經存在,不能使用");
            } else {
                $("span.errorMsg").text("用戶名可用");
            }
        })
})

29.4完成測試

30.功能28-Ajax添加購物車

30.1需求分析/圖解

當前每次添加家居到購物車方式,每次都需要sendRedirect(),會刷新整個頁面,數據傳輸開銷大

image-20230101183217743

實際上添加家居到購物車,整個頁面只需要刷新購物車的數量

因此使用ajax進行優化,只要刷新購物車的數量即可

30.2思路分析

30.3代碼實現

30.3.1web層

CartServlet:

/**
 * 添加家居數據到購物車-Ajax方式
 *
 * @param req
 * @param resp
 * @throws ServletException
 * @throws IOException
 */
protected void addItemByAjax(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    //得到添加的家居ID
    int id = DataUtils.parseInt(req.getParameter("id"), 0);
    //獲取到id對應的Furn對象
    Furn furn = furnService.queryFurnById(id);
    if (furn == null || furn.getStock() == 0) {//如果沒有對應的家居信息或者該家居庫存為0
        return;//結束業務
    }
    //根據furn構建CartItem
    CartItem item =
            new CartItem(furn.getId(), furn.getName(), furn.getPrice(), 1, furn.getPrice());
    //從session獲取cart對象
    Cart cart = (Cart) req.getSession().getAttribute("cart");
    if (null == cart) {//如果當前的session沒有cart對象
        //創建一個cart對象
        cart = new Cart();
        //將其放入到session中
        req.getSession().setAttribute("cart", cart);
    }
    //將cartItem加入到cart對象
    cart.addItem(item);

    //添加完畢後,將當前購物車的商品數量以json形式的數據返回
    //前端得到json後進行局部刷新即可
    //1.規定json格式{"cartTotalcount,3"}
    Map<String, Object> resultMap = new HashMap<>();
    //2.創建map
    resultMap.put("cartTotalcount", cart.getTotalCount());
    //3.轉為json
    String resultJson = new Gson().toJson(resultMap);
    resp.getWriter().write(resultJson);
}

30.3.2前端

customer/index.jsp

//給add to cart綁定事件
$("button.add-to-cart").click(function () {
    //獲取到點擊的furn-id
    var furnId = $(this).attr("furnId");
    //發出一個請求-添加家居=>後面改成ajax
    //location.href = "cartServlet?action=addItem&id=" + furnId;

    //改為ajax請求,得到數據進行局部刷新,解決刷新這個頁面的效率低的問題
    //jQuery.getJSON(url,data,success(data,status,xhr))
    $.getJSON(
        "cartServlet",
        {
            "action": "addItemByAjax",
            "id": furnId
        },
        function (data) {
            //刷新局部 <span class="header-action-num">
            $("span.header-action-num").text(data.cartTotalCount)
        }
    )
})

30.3.3解決ajax請求轉發失效的問題

測試上面的代碼,會發現針對ajax的重定向和請求轉發失效了,AuthFilter.java的許可權攔截沒有用了,即我們點擊add to cart,後臺服務沒有響應,怎麼辦?

使用ajax向後臺發送請求跳轉頁面無效的原因:

  1. 主要是伺服器得到的是ajax發送過來的request,這個請求不是瀏覽器發送的請求,而是ajax請求的。因此servlet對request進行請求轉發或者重定向都不能影響瀏覽器的跳轉
  2. 這時就出現了請求轉發和重定向失效的問題
  3. 解決方案:如果想要實現跳轉,可以返回url,在瀏覽器執行window.location(url)
image-20230101201434997 image-20230101201609766

utils包WebUtils:

package com.li.furns.utils;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 李
 * @version 1.0
 */
public class WebUtils {
    /**
     * 判斷一個請求是否是ajax請求
     *
     * @param request
     * @return
     */
    public static boolean isAjaxRequest(HttpServletRequest request) {
        return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
    }
}

AuthFilter:

package com.li.furns.filter;

import com.google.gson.Gson;
import com.li.furns.entity.Member;
import com.li.furns.utils.WebUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 這是用於許可權驗證的過濾器,對指定的url進行驗證
 * 如果登錄過,就放行;如果沒有登錄,就返回登錄頁面
 *
 * @author 李
 * @version 1.0
 */
public class AuthFilter implements Filter {
    //後面我們把要排除的url放入到excludedUrls中
    private List<String> excludedUrls;

    public void init(FilterConfig config) throws ServletException {
        //獲取到配置的excludedUrls
        String strExcludedUrls = config.getInitParameter("excludedUrls");
        //進行分割
        String[] splitUrl = strExcludedUrls.split(",");
        //將splitUrl轉成List,賦給excludedUrls
        excludedUrls = Arrays.asList(splitUrl);
        System.out.println("excludedUrls=>" + excludedUrls);
    }

    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        //許可權驗證
        HttpServletRequest req = (HttpServletRequest) request;
        //得到請求的url
        String url = req.getServletPath();

        //判斷是否要驗證
        if (!excludedUrls.contains(url)) {//如果url不在配置的規則中,就進行校驗
            //得到session中的member對象
            Member member = (Member) req.getSession().getAttribute("member");
            if (member == null) {//說明用戶沒有登錄過
                //先判斷該請求是否為Ajax請求
                if (!WebUtils.isAjaxRequest(req)) {//不是ajax請求
                    //轉發到登錄頁面
                    //不要使用重定向,因為重定向的url符合過濾器規則時也會被攔截,
                    //如果設置不合理就會出現 請求無線迴圈重定向的 情況
                    req.getRequestDispatcher("/views/member/login.jsp").forward(request, response);
                } else {//如果是ajax請求
                    //以json格式返回一個url
                    HashMap<String, Object> resultMap = new HashMap<>();
                    resultMap.put("url", "views/member/login.jsp");
                    String resultJson = new Gson().toJson(resultMap);
                    response.getWriter().write(resultJson);
                }
                return;//返回
            }
        }
        //否則就放行
        chain.doFilter(request, response);
    }
}

修改前端介面customer/index.jsp

//給add to cart綁定事件
$("button.add-to-cart").click(function () {
    //獲取到點擊的furn-id
    var furnId = $(this).attr("furnId");
    //發出一個請求-添加家居=>後面改成ajax
    //location.href = "cartServlet?action=addItem&id=" + furnId;

    //改為ajax請求,得到數據進行局部刷新,解決刷新這個頁面的效率低的問題
    //jQuery.getJSON(url,data,success(data,status,xhr))
    $.getJSON(
        "cartServlet",
        {
            "action": "addItemByAjax",
            "id": furnId
        },
        function (data) {
            if (data.url == undefined) {
                //說明沒有返回url,過濾器沒有讓跳轉到登錄頁面,即說明已經登錄過了
                $("span.header-action-num").text(data.cartTotalCount);
            } else {
                //否則說明當前伺服器返回了url,要求定位
                location.href = data.url;
            }
        }
    )
})

30.4完成測試

沒有登錄的情況下,點擊add to cart,頁面成功跳轉到login.jsp

登錄後,點擊添加購物車,成功添加

31.功能29-上傳/更新家居圖片

31.1需求分析/圖解

image-20230101210445718
  1. 後臺修改家居,可以點擊圖片,選擇新的圖片
  2. 這裡會使用到文件上傳功能

31.2思路分析

31.3代碼實現

31.4完成測試


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天在寫一個通訊錄實現程式的時候,遇到個讓我突然卡殼的問題,不知道怎麼進行兩個結構體之間的成員互換......結構體成員有“姓名”,“性別”,“年齡”,“地址”,“電話”,目的就是實現一個通過年齡進行sort排序的功能,作為一個努力學習的編程小白來說,有太多的東西需要學習了..........代碼如 ...
  • 動態鏈接庫(dynamic link library)介紹 代碼放到exe中,肯定會造成磁碟冗餘; 電腦ABCD四個軟體,lib加入到代碼中不是在編譯期進入的,而是在運行期 (A進程啟動,把dll加入到A進程中……),編譯的時候不需要這份代碼, 尾碼是.dll 如果要更新軟體,把dll換掉就可以了, ...
  • 卸載mysql教程: (261條消息) 如何徹底卸載 MySQL ,再可重新安裝 MySQL_Cavalier_01的博客-CSDN博客_如何卸載mysql重新安裝 安裝mysql5.7.19: 首先,去官網下載5.7.19壓縮包然後解壓; MySQL :: Download MySQL Commu ...
  • 一:背景 1. 講故事 上一篇寫完了之後,馬上就有朋友留言對記錄行的 8060byte 限制的疑惑,因為他的表記錄存儲了大量的文章,存儲文章的欄位類型用的是 nvarchar(max),長度很顯然是超過 8060byte 的,請問這個底層是怎麼破掉 8060byte 的限制的? 說實話這是一個好問題 ...
  • 為了應對大流量,現代應用/中間件通常採用分散式部署,此時不得不考慮 CAP 問題。ZooKeeper(後文簡稱 ZK)是面向 CP 設計的一個開源的分散式協調框架,將那些複雜且容易出錯的分散式一致性服務封裝起來,構成一個高效可靠的原語集,並以一系列簡單易用的介面提供給用戶使用,分散式應用程式可以基於... ...
  • 力扣104 求二叉樹的最大深度 題目: 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度 3 ...
  • 力扣100 相同的樹 題目: 給你兩棵二叉樹的根節點 p 和 q ,編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。 示例 1: 輸入:p = [1,2,3], q = [1,2,3] 輸出:true 示例 2: 輸入:p = [1,2], q ...
  • RequestMappingHandlerAdapter是Spring Web MVC中針對@Controller和@RequestMapping體系的處理器適配器,本文對RequestMappingHandlerAdapter的組成、初始化以及同步請求處理流程進行詳細梳理和總結。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...