Spring MVC學習隨筆-Ajax集成(JSON格式返回數據)、攔截器(MyInterceptor)、全局異常處理(GlobalExceptionResolver)

来源:https://www.cnblogs.com/eyewink/archive/2023/12/05/17878123.html
-Advertisement-
Play Games

這份筆記詳細介紹了Spring MVC中的關鍵概念。在Ajax集成部分,通過引入相關依賴和開發控制器,展示瞭如何以JSON格式返回數據。特別強調了日期格式修正,使用@JsonFormat註解來規範日期顯示。 攔截器章節深入探討了攔截器的作用、特點和開發過程。與AOP進行對比,並解釋了其在請求處理階段... ...


學習視頻:【編程不良人】繼spring之後快速入門springmvc,面對SpringMVC不用慌

第七章、SpringMVC與Ajax集成

  • 引入相關依賴

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.8</version>
    </dependency>
    
  • 開發控制器

    @Controller
    @RequestMapping("json")
    public class JsonController {
        /**
         * 引入jackson庫可以使用@ResponseBody自動轉換為json格式數據【推薦】
         */
        @RequestMapping("showAll")
        public @ResponseBody List<User> findAll() {
            //1.收集數據
            //2.調用業務
            List<User> users = new ArrayList<>();
            users.add(new User(UUID.randomUUID().toString(), "小紅", 23, new Date()));
            users.add(new User(UUID.randomUUID().toString(), "小名", 29, new Date()));
            users.add(new User(UUID.randomUUID().toString(), "小撒", 25, new Date()));
            return users;
        }
        /**
         * 傳統寫法:引入阿裡fastjson手動轉換為json格式數據
         */
        @RequestMapping("findAll")
        public void findAll(HttpServletResponse response) throws IOException {
            //1.收集數據
            //2.調用業務
            List<User> users = new ArrayList<>();
            users.add(new User(UUID.randomUUID().toString(), "小陳", 23, new Date()));
            users.add(new User(UUID.randomUUID().toString(), "小名", 29, new Date()));
            users.add(new User(UUID.randomUUID().toString(), "小撒", 25, new Date()));
            // fastjson
            String s = JSONObject.toJSONStringWithDateFormat(users, "yyyy-MM-dd");
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().println(s);
        }
    }
    
  • 日期格式修正

    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date bir;
    

    可以正常響應

第八章、SpringMVC的攔截器

  1. 攔截器 :Interceptor 攔截 中斷

    類似於javaweb中的Filter,不過沒有Filter那麼強大

  2. 作用

    Spring MVC的攔截器是一種用於在請求處理過程中進行預處理和後處理的機制。攔截器可以在請求到達控制器之前和之後執行一些操作,例如日誌記錄、許可權驗證、數據處理等。

  3. 攔截器特點

    1. 請求到達會經過攔截器,響應回來同樣會經過攔截器
    2. 攔截器只能Controller的請求,不能攔截jsp、靜態資源相關請求
    3. 攔截器可以中斷請求軌跡
  4. 開發攔截器

    1. 類 實現implements HandlerInterceptor介面中的方法

    2. 配置攔截器

      註冊攔截器對象 bean id class=””

      配置攔截器攔截請求路徑

  • 編碼和測試結果

    攔截器介面的實現

    public class MyInterceptor implements HandlerInterceptor {
        @Override
        //**參數1:當前請求對象  參數2:當前請求響應對象 參數3:當前請求的控制器對應的方法對象**
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("handler = " + ((HandlerMethod)handler).getMethod().getName() );
            System.out.println("MyInterceptor.preHandle");
            //強制用戶登錄
            Object user = request.getSession().getAttribute("user");
    //        if (user == null) {
    //            // 重定向到登錄頁面
    //            response.sendRedirect(request.getContextPath() + "/login.jsp");
    //            return false;
    //        }
            return HandlerInterceptor.super.preHandle(request, response, handler);
        }
    
        @Override
        // 參數1、2、3同上 **參數4:當前控制器方法的返回值**
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("modelAndView = " + modelAndView);
            System.out.println("MyInterceptor.postHandle");
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        // 參數1、2、3同上 **參數4:請求過程中出現異常時的異常對象**
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("MyInterceptor.afterCompletion");
            if (ex != null) {
                System.out.println("ex.getMessage() = " + ex.getMessage());
            }
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    }
    

    dispatcher.xml 配置攔截器

    <!--註冊攔截器-->
    <bean id="myInterceptor" class="com.baizhi.interceptors.MyInterceptor"/>
    <!--配置攔截器-->
    <mvc:interceptors>
        <!--配置一個攔截器-->
        <mvc:interceptor>
            <!-- mvc:mapping 代表攔截哪個請求路徑-->
            <mvc:mapping path="/json/test"/>
            <!--排除具體地攔截請求-->
            <mvc:exclude-mapping path="/json/showAll"/>
            <!--使用攔截器-->
            <ref bean="myInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    

    進行測試

    @RequestMapping("test")
        public String test() {
            System.out.println("JsonController.test");
    //        throw new RuntimeException();
            return "index";
        }
    

    按預期執行順序執行

    看到攔截器的執行順序,我們會聯想到Spring中的AOP,兩者的底層邏輯都是通過動態代理實現的,雖然攔截器和AOP都可以用於在請求處理過程中添加額外的邏輯,但攔截器更專註於請求處理階段的任務,而AOP更適用於在不同模塊中實現橫切關註點的功能。

關於動態代理和AOP底層可以看之前學習的:Spring5學習隨筆-AOP底層實現(JDK、CGlib)、實現切麵(@Aspect)
Spring5學習隨筆-AOP系列Spring動態代理

第九章、SpringMVC中的全局異常處理

  1. SpringMVC作為一個控制主要作用

    1. 處理請求 接收請求數據 調用業務對象
    2. 請求響應 跳轉對應視圖展示數據

  2. 現有控制器開發存在問題?

    1. 在處理用戶請求出現運行時異常直接響應給用戶的是一個錯誤節目,對於用戶的使用體驗不友好。

      沒有使用全局異常處理時

  3. 全局異常處理機制

    作用:用來解決整合系統中任意一個控制器拋出異常時的統一處理入口

  • 編碼

    開發控制類

    public class GlobalExceptionResolver implements HandlerExceptionResolver {
        /**
         * 用來處理髮生異常時的方法
         *
         * @param request  當前請求對象
         * @param response 當前請求對應的響應對象
         * @param handler  當前請求的方法對象
         * @param ex       當前出現異常時的異常對象
         * @return 出現異常時展示視圖和數據
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
            System.out.println("進入全局異常處理器,獲取的異常信息為:" + ex.getMessage());
            ModelAndView modelAndView = new ModelAndView();
            // 基於不同業務異常跳轉到不同頁面
            modelAndView.setViewName("redirect:/error.jsp"); // return "error" -> error.jsp
            // modelAndView中的model預設放到request作用域,如果使用redirect跳轉,model中數據會自動拼接到跳轉url
            modelAndView.addObject("msg", ex.getMessage());
            return modelAndView;
        }
    }
    

    dispatcher.xml 配置全局異常處理類

    <bean class="com.baizhi.handlerexception.GlobalExceptionResolver"/>
    
  • 基於不同業務異常跳轉不同頁面

    // 基於不同業務異常跳轉到不同頁面
    if (ex instanceof NotFoundException) {
        modelAndView.setViewName("notFound");
    } else if (ex instanceof GeneralException) {
        modelAndView.setViewName("generalException");
    }
    

異常處理器的工作流程

作者:揚眉劍出鞘
出處: https://www.cnblogs.com/eyewink/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


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

-Advertisement-
Play Games
更多相關文章
  • 蘋果在 iPhone 14 Pro 及 iPhone 14 Pro MAX 上推出了靈動島,是一次交互玩法的革新。本文從靈動島的展現形式、場景限制、適配情況和遠程通知更新數據幾個方面全面帶你走進靈動島 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 背景 最近心血來潮,想要在本地開發時,也用CDN的方式引入 Vue,想著既然通過CDN引入了,那麼在項目中就沒必要再 import Vue,然後把項目中引入 Vue 的地方都刪掉,結果改完後,界面看似正常運行,但數據變更後,界面沒有重新渲 ...
  • 項目代碼同步至碼雲 weiz-vue3-template pina 是 vue3 官方推薦的狀態管理庫,由 Vue 核心團隊維護,旨在替代 vuex。pina 的更多介紹,可從 pina官網 查看 特點 更簡潔直接的 API,提供組合式風格的 API 支持模塊熱更新和服務端渲染 對TS支持更為友好 ...
  • 一、CSS簡介 CSS:層疊樣式表(英文全稱:Cascading Style Sheets):是一種用來表現HTML樣式的電腦語言。CSS不僅可以靜態地修飾網頁,還可以配合各種腳本語言動態地對網頁各元素進行格式化。 二、CSS選擇器 2.1基本選擇器(三種) 1.標簽選擇器 <style> p { ...
  • 前言 這是第三次博客作業,總結了近三次PTA大作業的完成情況,作業7、8次的大作業的小題目圍繞著HashMap、ArrayList和自定義介面來展開,大題目則是課程成績程式的第二次第三次迭代,因為第一次課程成績的程式寫的結構不太好,於是重新寫的,第三次迭代並沒有拿到滿分,後面也沒有時間改了。期末考試 ...
  • 2.7Python(目前ArcGIS使用)代碼轉化為3.5Python(目前ArcGIS Pro使用)代碼 Analyze Tools For Pro (2to3命令) 基本操作 調用ArcToolbox的兩種形式 #arcpy.ToolboxAlias.ToolName() #arcpy.Tool ...
  • Java作為最熱門的開發語言之一,長居各類排行榜的前三。所以,就算你目前不是用Java開發,你應該瞭解Java語言的特點,能用來做什麼,以備不時之需。 Java 是一種高級、多範式編程語言,以其編譯為獨立於平臺的位元組碼的能力而聞名。 它是由 Sun Microsystems 的 James Gosl ...
  • 外接矩形、外接圓: 1 import cv2 2 import numpy 3 4 img = cv2.imread('../img/img.png', -1) 5 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) 6 con ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...