欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC中的異常處理機(jī)制詳解

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

1. 概述

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

2. 基于xml方式的異常處理機(jī)制

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

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

步驟:

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

4. 實際應(yīng)用

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

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

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

    • 請求頭中Accept中包含application/json
    • 請求頭中X-Requested-With字段為XMLHttpRequest的為Ajax請求
/**
     * 判斷此次請求是否是Ajax請求
     * @param request 此次請求對應(yīng)的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方式的異常處理機(jī)制

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

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: 基于注解的異常處理機(jī)制
 * @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);
    }
    /**
     * 抽取異常處理機(jī)制的公共部分
     * @param viewName 將要返回到哪個頁面
     * @param exception 捕獲到的異常信息
     * @param request 請求對象
     * @param response 響應(yīng)對象
     * @return 返回ModelAndView
     * @throws IOException 響應(yīng)對象獲取輸出流時拋出異常
     */
    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字符串作為響應(yīng)體返回給瀏覽器
            response.getWriter().write(s);
            return null;
        }
        // 如果是普通請求
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
        // 設(shè)置對應(yīng)的視圖名稱
        modelAndView.setViewName(viewName);
        return modelAndView;
    }
}
 

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

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

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

相關(guān)文章

最新評論