欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

springMVC對異常處理的支持

系統 1815 0

無論做什么項目,進行異常處理都是非常有必要的,而且你不能把一些只有程序員才能看懂的錯誤代碼拋給用戶去看,所以這時候進行統一的異常處理,展現一個比較友好的錯誤頁面就顯得很有必要了。跟其他MVC框架一樣,springMVC也有自己的異常處理機制。
springMVC提供的異常處理主要有兩種方式,一種是直接實現自己的HandlerExceptionResolver,當然這也包括使用Spring已經為我們提供好的SimpleMappingExceptionResolver和DefaultHandlerExceptionResolver,另一種是使用注解的方式實現一個專門用于處理異常的Controller——ExceptionHandler。


1、實現自己的HandlerExceptionResolver,HandlerExceptionResolver是一個接口,springMVC本身已經對其有了一個自身的實現——DefaultHandlerExceptionResolver,該解析器只是對其中的一些比較典型的異常進行了攔截,然后返回對應的錯誤碼,當然你也可以繼承DefaultHandlerExceptionResolver類,然后重寫其中的一些異常處理方法來實現自己的異常處理。

    import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

public class ExceptionHandler implements HandlerExceptionResolver {

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		// TODO Auto-generated method stub
		return new ModelAndView("exception");
	}

}

  

? 上述的resolveException的第4個參數表示對哪種類型的異常進行處理。因為Exception類是所有異常類的基類,所以如果想根據異常類型的不同來進行不同的處理的話,可以在resolveException方法里面根據不同的異常類型進行不同的處理,返回不同的異常視圖。如:

    public class ExceptionHandler implements HandlerExceptionResolver {

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		// TODO Auto-generated method stub
		if (ex instanceof NumberFormatException) {
			//doSomething...
			return new ModelAndView("number");
		} else if (ex instanceof NullPointerException) {
			//doSomething...
			return new ModelAndView("null");
		}
		return new ModelAndView("exception");
	}

}
  
?

?

定義了這樣一個異常處理器之后就要在applicationContext中定義這樣一個bean對象,如:

    <bean id="exceptionResolver" class="com.tiantian.xxx.web.handler.ExceptionHandler"/>
  

Spring除了實現了一個DefaultHandlerExceptionResolver之外,還實現了一個SimpleMappingExceptionResolver,這兩者都是繼承自抽象類AbstractHandlerExceptionResolver,而AbstractHandlerExceptionResolver是實現了HandlerExceptionResolver接口的resolveException方法的,并由此抽取出兩個抽象方法,一個是在進行異常處理之前執行的方法prepareResponse(exception, response),一個是進行異常解析的doResolveException(request, response, handler, exception)方法。SimpleMappingExceptionResolver,顧名思義就是通過簡單的映射關系來決定由哪個視圖來處理當前的錯誤信息。SimpleMappingExceptionResolver提供了通過異常類型exceptionMappings來進行異常與視圖之間的映射關系,提供了在發生異常時通過statusCodes來映射異常返回的視圖名稱和對應的HttpServletResponse的返回碼。而且可以通過defaultErrorView和defaultErrorCode來指定默認值,defaultErrorView表示當沒有在exceptionMappings里面找到對應的異常類型時就返回defaultErrorView定義的視圖,defaultErrorCode表示在發生異常時當沒有在視圖與返回碼的映射關系statusCodes里面找到對應的映射時默認返回的返回碼。在使用SimpleMappingExceptionResolver時,當發生異常的時候,SimpleMappingExceptionResolver將會把當前的異常對象放到自身屬性exceptionAttribute中,當沒有指定exceptionAttribute時,exceptionAttribute就是用默認值exception。

以下是一個簡單的例子:

(1)SpringMVC的servlet配置文件中申明一個SimpleMappingExceptionResolver bean,并通過配置屬性exceptionMappings和defaultExceptionView來指定異常和視圖的對應關系。

    	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="NumberFormatException">number</prop><!-- 表示當拋出NumberFormatException的時候就返回名叫number的視圖 -->
				<prop key="NullPointerException">null</prop>
			</props>
		</property>
		<property name="defaultErrorView" value="exception"/><!-- 表示當拋出異常但沒有在exceptionMappings里面找到對應的異常時 返回名叫exception的視圖-->
		<property name="statusCodes"><!-- 定義在發生異常時視圖跟返回碼的對應關系 -->
			<props>
				<prop key="number">500</prop><!-- 表示在發生NumberFormatException時返回視圖number,然后這里定義發生異常時視圖number對應的HttpServletResponse的返回碼是500 -->
				<prop key="null">503</prop>
			</props>
		</property>
		<property name="defaultStatusCode" value="404"/><!-- 表示在發生異常時默認的HttpServletResponse的返回碼是多少,默認是200 -->
	</bean>
  

(2)如下訪問:

    @Controller
@RequestMapping("/test")
public class TestController {

	@RequestMapping("/null")
	public void testNullPointerException() {
		Blog blog = null;
		//這里就會發生空指針異常,然后就會返回定義在SpringMVC配置文件中的null視圖
		System.out.println(blog.getId());
	}
	
	@RequestMapping("/number")
	public void testNumberFormatException() {
		//這里就會發生NumberFormatException,然后就會返回定義在SpringMVC配置文件中的number視圖
		Integer.parseInt("abc");
	}
	
	@RequestMapping("/default")
	public void testDefaultException() {
		if (1==1)
			//由于該異常類型在SpringMVC的配置文件中沒有指定,所以就會返回默認的exception視圖
			throw new RuntimeException("Error!");
	}
	
}

  

?

(3)Jsp頁面中可以訪問到的異常對象,這里以NumberFormatException的返回視圖number.jsp作為示例:

    <%@ page language="java" import="java.util.*" pageEncoding="GB18030" isErrorPage="true"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'number.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    NumberFormatException. <br>
    <%=exception.getMessage() %><br/>
    <%=exception %><br/>
    
      <!-- 這是JSP中的內置對象exception -->
    
    



    <%=request.getAttribute("ex") %><br>
    
      <!-- 這是SpringMVC放在返回的Model中的異常對象 -->
    
    



    <%=request.getAttribute("javax.servlet.error.status_code") %>
    
      <!-- HttpServletResponse返回的錯誤碼信息,因為前面已經配置了NumberFormatException的錯誤碼返回值為888,所以這里應該顯示888 -->
    
    



  </body>
</html>

  
? ?

(4)當請求/test/number.do的時候會返回定義好的number視圖,返回結果如下:


springMVC對異常處理的支持

?

2、使用@ExceptionHandler進行處理

使用@ExceptionHandler進行處理有一個不好的地方是進行異常處理的方法必須與出錯的方法在同一個Controller里面

如:

    import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import com.tiantian.blog.web.servlet.MyException;

@Controller
public class GlobalController {

	
	/**
	 * 用于處理異常的
	 * @return
	 */
	@ExceptionHandler({MyException.class})
	public String exception(MyException e) {
		System.out.println(e.getMessage());
		e.printStackTrace();
		return "exception";
	}
	
	@RequestMapping("test")
	public void test() {
		throw new MyException("出錯了!");
	}
	
	
}

  

? 這里在頁面上訪問test方法的時候就會報錯,而擁有該test方法的Controller又擁有一個處理該異常的方法,這個時候處理異常的方法就會被調用



優先級

既然在SpringMVC中有兩種處理異常的方式,那么就存在一個優先級的問題:

當發生異常的時候,SpringMVC會如下處理:

(1)SpringMVC會先從配置文件找異常解析器HandlerExceptionResolver

(2)如果找到了異常異常解析器,那么接下來就會判斷該異常解析器能否處理當前發生的異常

(3)如果可以處理的話,那么就進行處理,然后給前臺返回對應的異常視圖

(4)如果沒有找到對應的異常解析器或者是找到的異常解析器不能處理當前的異常的時候,就看當前的Controller中有沒有提供對應的異常處理器,如果提供了就由Controller自己進行處理并返回對應的視圖

(5)如果配置文件里面沒有定義對應的異常解析器,而當前Controller中也沒有定義的話,那么該異常就會被拋出來。

?

?

?

springMVC對異常處理的支持


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 最新亚洲国产 | 色婷婷国产精品欧美毛片 | 久久亚洲精品玖玖玖玖 | 日韩二三区 | 小明天天看 | 国产亚洲精品久久久久久国模美 | 免费看污成人午夜网站 | 久久天堂网 | av在线毛片 | 91久久精品一区二区二区 | 欧美激情久久欧美激情 | 日本在线播放不卡一区二区三区 | 日韩国产午夜一区二区三区 | 在线播放日本爽快片 | 国产在线播放免费 | 久草在线成人 | 777久久婷婷成人综合色 | 操网| 少妇特黄A片一区二区三区免费看 | 无码缴情做A爱片毛片A片 | 国内精品久久久久久中文字幕 | 精品中文在线 | 99热久久66是国产免费 | 成人毛片在线观看 | 久草小视频 | 91精品国产综合久久精品 | 成人区视频爽爽爽爽爽 | 在线精品自拍亚洲第一区 | 午夜精品一区二区三区免费视频 | 国产色司机在线视频免费观看 | 国产亚洲精品久久久久久久软件 | 久久国内精品视频 | 成人性视频免费网站 | 亚洲成人福利在线观看 | 久操青青 | 嫩草网站| 伊人久久国产精品 | 久草视频网站 | 色婷婷AV99XX | 久久久一区二区 | 高清毛片免费看 |