風人園

          弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
          隨筆 - 99, 文章 - 181, 評論 - 56, 引用 - 0

          導航

          <2012年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(11)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          收藏夾

          友情鏈接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Spring MVC異常處理(ZT)

          Web應用中對于異常的處理方式與其他形式的應用并沒有太大的不同――通過try/catch
          語句針對不同的異常進行相應處理。
          但是在具體實現(xiàn)中,由于異常層次、種類繁雜,我們往往很難在Servlet、JSP層妥善的處
          理好所有異常情況,代碼中大量的try/catch代碼顯得尤為凌亂。
          我們通常面對下面兩個主要問題:
          1. 對異常實現(xiàn)集中式處理
          典型情況:對數(shù)據(jù)庫異常記錄錯誤日志。一般處理方法無外兩種,一是在各處數(shù)據(jù)庫
          訪問代碼的異常處理中,加上日志記錄語句。二是將在數(shù)據(jù)訪問代碼中將異常向上拋
          出,并在上層結(jié)構(gòu)中進行集中的日志記錄處理。
          第一種處理方法失之繁瑣、并且導致系統(tǒng)難以維護,假設后繼需求為“對于數(shù)據(jù)庫異
          常,需記錄日志,并發(fā)送通知消息告知系統(tǒng)管理員”。我們不得不對分散在系統(tǒng)中的各
          處代碼進行整改,工作量龐大。
          第二種處理方法實現(xiàn)了統(tǒng)一的異常處理,但如果缺乏設計,往往使得上層異常處理過
          于復雜。
          這里,我們需要的是一個設計清晰、成熟可靠的集中式異常處理方案。
          2. 對未捕獲異常的處理
          對于Unchecked Exception而言,由于代碼不強制捕獲,往往被程序員所忽略,如果
          運行期產(chǎn)生了Unchecked Exception,而代碼中又沒有進行相應的捕獲和處理,則我
          們可能不得不面對尷尬的500服務器內(nèi)部錯誤提示頁面。
          這里,我們需要一個全面而有效的異常處理機制。
          上面這兩個問題,從技術(shù)角度上而言并算不上什么大的難點。套用一些短平快的設計模式,
          我們也能進行處理并獲得不錯的效果。同時,目前大多數(shù)服務器也都支持在Web.xml中通過
          <error-page>(Websphere/Weblogic)或者<error-code>(Tomcat)節(jié)點配置特定異常情
          況的顯示頁面。
          Spring MVC中提供了一個通用的異常處理機制,它提供了一個成熟的,簡潔清晰的異常處
          理方案。如果基于Spring MVC開發(fā)Web應用,那么利用這套現(xiàn)成的機制進行異常處理也更加自
          然和有效。
          Spring MVC中的異常處理:
          以前面的注冊系統(tǒng)為例,首先,在Dispatcher配置文件Config.xml中增加id為
          “exceptionResolver”的bean定義:
          <bean id="exceptionResolver"
          class="org.springframework.web.servlet.handler.SimpleMappingEx
          ceptionResolver">
          <property name="defaultErrorView">
          <value>failure</value>
          </property>
          <property name="exceptionMappings">
          <props>
          <prop key="java.sql.SQLException">showDBError</prop>
          <prop key="java.lang.RuntimeException">showError</prop>
          </props>
          </property>
          </bean>
          通過SimpleMappingExceptionResolver我們可以將不同的異常映射到不同的jsp頁
          面(通過exceptionMappings屬性的配置),同時我們也可以為所有的異常指定一個默認的異
          常提示頁面(通過defaultErrorView屬性的配置),如果所拋出的異常在exceptionMappings
          中沒有對應的映射,則Spring將用此默認配置顯示異常信息(注意這里配置的異常顯示界面均
          僅包括主文件名,至于文件路徑和后綴已經(jīng)在viewResolver中指定)。
          一個典型的異常顯示頁面如下:
          <html>
          <head><title>Exception!</title></head>
          <body>
          <% Exception ex = (Exception)request.getAttribute("exception"); %>
          <H2>Exception: <%= ex.getMessage();%></H2>
          <P/>
          <% ex.printStackTrace(new java.io.PrintWriter(out)); %>
          </body>
          </html>
          exception 實在SimpleMappingExceptionResolver 被存放到request中的,具體可以查看源代碼。
          如果SimpleMappingExceptionResolver無法滿足異常處理的需要,我們可以針對
          HandlerExceptionResolver接口實現(xiàn)自己異常處理類,這同樣非常簡單(只需要實現(xiàn)一個
          resolveException方法)。

          如果有ViewResolver,則制定的jsp頁面必須在那個頁面下,到時候如果找不到頁面,可以根據(jù)錯誤提示再調(diào)整頁面路徑

          posted on 2008-04-07 08:15 風人園 閱讀(13913) 評論(3)  編輯  收藏 所屬分類: Spring

          評論

          # re: Spring MVC異常處理(ZT)  回復  更多評論   

          寫的不錯,讓我對springMVC的錯誤處理機制更進一步了
          2011-05-02 19:52 | blur

          # re: Spring MVC異常處理(ZT)  回復  更多評論   

          我的Manager對象拋出一個RuntimeException給Spring的Controller層,SimpleMappingExceptionResolver 攔截到錯誤頁面,但是Exception ex = (Exception)request.getAttribute("exception"); 獲取不到對象,請問這是怎么回事?
          2012-01-11 16:38 |

          # re: Spring MVC異常處理(ZT)  回復  更多評論   

          寫得可以哦。
          2012-03-09 19:15 | 紅淚
          主站蜘蛛池模板: 阜新市| 濮阳市| 江孜县| 大足县| 天气| 威远县| 西乌珠穆沁旗| 镇江市| 宣城市| 永清县| 清丰县| 保山市| 精河县| 阳西县| 石屏县| 天峻县| 贵港市| 太康县| 上思县| 永泰县| 布尔津县| 志丹县| 仁化县| 炎陵县| 奉化市| 萝北县| 油尖旺区| 枝江市| 富民县| 云梦县| 石阡县| 昌江| 邻水| 克东县| 乐陵市| 镇原县| 社会| 曲周县| 洮南市| 弋阳县| 济源市|