最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC中的異常處理機制詳解

 更新時間:2024年05月17日 15:21:12   作者:樂其所樂  
SpringMVC提供了基于xml和基于注解的異常處理機制,一般情況下兩者都要進行配置,xml異常處理機制主要用于處理xml方式產(chǎn)生的異常,注解異常處理機制主要用于處理基于注解方式產(chǎn)生的異常,這篇文章主要介紹了SpringMVC中的異常處理機制,需要的朋友可以參考下

1. 概述

SpringMVC提供了基于xml和基于注解的異常處理機制,一般情況下兩者都要進行配置,xml異常處理機制主要用于處理xml方式產(chǎn)生的異常,注解異常處理機制主要用于處理基于注解方式產(chǎn)生的異常。

2. 基于xml方式的異常處理機制

<!--配置基于xml的異常映射-->
    <bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--key屬性指定具體的出錯類型,標簽體中為對應的出錯頁面(這個值會拼上前后綴以得到全路徑)-->
                <prop key="java.lang.Exception">system-error</prop>
            </props>
        </property>
    </bean>

3. 基于注解方式的異常處理

步驟:

  • 使用@ControllerAdvice注解表名此類為異常處理類
  • 方法上使用@ExceptionHandler注解表示此方法處理何種異常,如
    @ExceptionHandler(value = ArithmeticException.class)

4. 實際應用

一般若是普通請求產(chǎn)生的異常,則應該返回錯誤頁面,若是Ajax請求返回的是相應的JSON字符串。

  • 判斷一個請求是否是Ajax請求

    請求依據(jù):(兩者含其一則為Ajax請求)

    • 請求頭中Accept中包含application/json
    • 請求頭中X-Requested-With字段為XMLHttpRequest的為Ajax請求
/**
     * 判斷此次請求是否是Ajax請求
     * @param request 此次請求對應的request對象
     * @return true表示是Ajax請求,false表示是普通請求
     */
    public static boolean isAjax(HttpServletRequest request) {
        String accept = request.getHeader("Accept");
        String xRequestHeader = request.getHeader("X-Requested-With");
        return accept != null && accept.contains("application/json")
                ||
                xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest");
    }
  • 配置基于xml方式的異常處理機制

配置基于注解方式的異常處理

package com.wuw.crowd.mvc.config;
import com.google.gson.Gson;
import com.wuw.crowd.exception.LoginFailedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import com.wuw.crowd.util.CrowdUtil;
import com.wuw.crowd.constant.CrowdConstant;
import com.wuw.crowd.util.ResultEntity;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * @description: 基于注解的異常處理機制
 * @author: WuW
 * @create: 2022/5/2 18:36
 */
@ControllerAdvice
public class MyExceptionResolver {
    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView resolveArithmeticException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
        String viewName = "system-error";
        return commonResolve(viewName, exception, request, response);
    }
    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView resolveNullPointerException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
        String viewName = "system-error";
        return commonResolve(viewName, exception, request, response);
    }
    @ExceptionHandler(value = LoginFailedException.class)
    public ModelAndView resolveLoginFailedException(HttpServletRequest request, HttpServletResponse response, LoginFailedException exception) throws IOException {
        String viewName = "admin-login";
        return commonResolve(viewName, exception, request, response);
    }
    /**
     * 抽取異常處理機制的公共部分
     * @param viewName 將要返回到哪個頁面
     * @param exception 捕獲到的異常信息
     * @param request 請求對象
     * @param response 響應對象
     * @return 返回ModelAndView
     * @throws IOException 響應對象獲取輸出流時拋出異常
     */
    private ModelAndView commonResolve(String viewName, Exception exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
        boolean ajax = CrowdUtil.isAjax(request);
        // 如果是Ajax請求
        if (ajax) {
            // 創(chuàng)建ResultEntity對象
            ResultEntity<Object> failed = ResultEntity.failed(exception.getMessage());
            Gson gson = new Gson();
            // 將ResultEntity對象轉(zhuǎn)換為JSON字符串
            String s = gson.toJson(failed);
            // 將JSON字符串作為響應體返回給瀏覽器
            response.getWriter().write(s);
            return null;
        }
        // 如果是普通請求
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
        // 設置對應的視圖名稱
        modelAndView.setViewName(viewName);
        return modelAndView;
    }
}
 

注:ResultEntity對象為統(tǒng)一響應對象,其中的failed方法實際上是將傳入的exception對象封裝成一個ResultEntity對象并返回給調(diào)用者。CrowdConstant類為自定義的常量類,主要用于存儲各種常用的字符串,可有效預防寫錯單詞導致的程序錯誤,在實際開發(fā)中十分有用。

解釋:若為Ajax請求,則應該向瀏覽器返回一個JSON字符串格式的ResultEntity對象,此時異常處理機制返回null即可;若為普通請求,則拋出異常,并返回異常頁面(此時是頁面名稱,因為前后綴在mvc文件中已配置)。

到此這篇關于SpringMVC中的異常處理機制的文章就介紹到這了,更多相關SpringMVC異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot實現(xiàn)動態(tài)切換數(shù)據(jù)源的示例代碼

    SpringBoot實現(xiàn)動態(tài)切換數(shù)據(jù)源的示例代碼

    這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)動態(tài)切換數(shù)據(jù)源的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-08-08
  • IDEA Maven Mybatis generator 自動生成代碼(實例講解)

    IDEA Maven Mybatis generator 自動生成代碼(實例講解)

    下面小編就為大家分享一篇IDEA Maven Mybatis generator 自動生成代碼的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Spring創(chuàng)建Bean的過程Debug的詳細流程

    Spring創(chuàng)建Bean的過程Debug的詳細流程

    這篇文章主要介紹了Spring創(chuàng)建Bean的過程Debug的流程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Maven?Pom?文件中的隱式依賴導致Jar沖突問題

    Maven?Pom?文件中的隱式依賴導致Jar沖突問題

    這篇文章主要介紹了Maven?Pom?文件中的隱式依賴導致Jar沖突問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解SpringBoot如何優(yōu)雅的進行全局異常處理

    詳解SpringBoot如何優(yōu)雅的進行全局異常處理

    在SpringBoot的開發(fā)中,為了提高程序運行的魯棒性,我們經(jīng)常需要對各種程序異常進行處理,但是如果在每個出異常的地方進行單獨處理的話,這會引入大量業(yè)務不相關的異常處理代碼,這篇文章帶大家了解一下如何優(yōu)雅的進行全局異常處理
    2023-07-07
  • Java動態(tài)添加view的方法

    Java動態(tài)添加view的方法

    這篇文章主要介紹了Java動態(tài)添加view的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-01-01
  • springboot數(shù)據(jù)訪問和數(shù)據(jù)視圖的使用方式詳解

    springboot數(shù)據(jù)訪問和數(shù)據(jù)視圖的使用方式詳解

    這篇文章主要為大家介紹了springboot數(shù)據(jù)訪問和數(shù)據(jù)視圖的使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • SpringSecurity定義多個過濾器鏈的操作代碼

    SpringSecurity定義多個過濾器鏈的操作代碼

    Spring?Security?是?Spring家族中的一個安全管理框架。相比與另外一個安全框架Shiro,它提供了更豐富的功能,社區(qū)資源也比Shiro豐富,今天通過本文給大家介紹SpringSecurity定義多個過濾器鏈的實例,感興趣的朋友跟隨小編一起看看吧
    2023-04-04
  • JVM調(diào)試命令與調(diào)試工具詳解

    JVM調(diào)試命令與調(diào)試工具詳解

    JVM statistics Monitoring,用于監(jiān)視虛擬機運行時狀態(tài)信息的命令,它可以顯示出虛擬機進程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運行數(shù)據(jù),這篇文章主要介紹了JVM調(diào)試命令與調(diào)試工具,需要的朋友可以參考下
    2023-10-10
  • java數(shù)組基礎詳解

    java數(shù)組基礎詳解

    下面小編就為大家?guī)硪黄狫ava創(chuàng)建數(shù)組的幾種方式總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給大家?guī)韼椭?/div> 2021-06-06

最新評論

彭水| 乡宁县| 蓬安县| 静乐县| 龙岩市| 元朗区| 苗栗县| 温州市| 伊春市| 高阳县| 盐山县| 达日县| 古丈县| 高青县| 温州市| 涞源县| 若尔盖县| 三台县| 南陵县| 宿迁市| 彭水| 凤冈县| 新沂市| 新闻| 祁阳县| 安庆市| 稻城县| 龙泉市| 收藏| 新郑市| 武山县| 兴仁县| 达拉特旗| 长沙县| 永昌县| 睢宁县| 新化县| 乌鲁木齐县| 西平县| 永川市| 酒泉市|