posts - 70,comments - 408,trackbacks - 0

          異常是當JVM(JAVA虛擬機)在執行應用程序的某個方法的時候遇到的非正常現象,JVM就會生成一個異常對象,拋給客戶以便客戶進行異常處理.Struts框架的異常處理機制建立在java異常處理的基礎之上.在研究Struts異常處理之前,先回顧一下java異常處理原理,理解java虛擬機JVM的異常處理過程有助于應用設計正確的異常處理方法.處理異常需要JVM付出不小的開銷,所以用于必須慎重使用.

          JAVA異常是在java程序運行的時候遇到非正常的情況而創建的對象,它封裝了異常信息,java異常的根類為java.lang.Throwable,整個類有兩個直接子類java.lang.Error和java.lang.Exception.Error是程序本身無法恢復的嚴重錯誤.Exception則表示可以被程序捕獲并處理的異常錯誤.JVM用方法調用棧來跟蹤每個線程中一系列的方法調用過程,該棧保存了每個調用方法的本地信息.對于獨立的JAVA程序,可以一直到該程序的main方法.當一個新方法被調用的時候,JVM把描述該方法的棧結構置入棧頂,位于棧頂的方法為正確執行的方法.當一個JAVA方法正常執行完畢,JVM回從調用棧中彈處該方法的棧結構,然后繼續處理前一個方法.如果java方法在執行代碼的過程中拋出異常,JVM必須找到能捕獲異常的catch塊代碼.它首先查看當前方法是否賊這樣的catch代碼塊,如果存在就執行該catch代碼塊,否則JVM回調用棧中彈處該方法的棧結構,繼續到前一個方法中查找合適的catch代碼塊.最后如果JVM向上追到了main()方法,也就是一直把異常拋給了main()方法,仍然沒有找到該異常處理的代碼塊,該線程就會異常終止,如果該線程是主線程,應用程序也隨之終止,此時JVM將把異常直接拋給用戶,在用戶終端上會看到原始的異常信息.回顧完了JAVA的異常處理機制,就要開始研究Struts的異常處理了.

          Struts框架在視圖層和控制層提供了對異常處理的支持.Struts的控制器負責捕獲各種異常,包括控制器運行中本身拋出的異常,以及調用模型的業務方法的異常.當異常被控制器捕獲的時候,在異常處理代碼塊中,創建描述異常信息的ActionMessage對象把它保存在ActionMessages或者它的子類ActionErrors對象中,然后把它保存在特定的范圍內,比如request或session.接下來在視圖層<html:error>標簽檢索特定范圍的ActionMessages對象,把本地化錯誤消息輸出到頁面上.這種異常處理機制可以避免用戶看到原始的java異常信息.可以更友好的把錯誤信息展示給用戶.

          Struts框架處理異常是以JVM的異常處理機制為基礎的,盡管它提供了強大的通用錯誤處理機制,但是不能保證捕獲到所有的異常或者錯誤.當錯誤發生的時候,如果Struts不能處理這種異常或者錯誤,就把錯誤拋給JavaWeb容器.容器先查看是否在Web應用發布描述文件中配置了<error-page>元素,如果存在該元素就返回元素的子元素<location>指定的錯誤頁面,否則就會把錯誤直接拋給用戶.下面簡單介紹一Struts幾個重要的類的異常處理機制,如果想了解這幾個類的更深的異常機制,建議查看Struts源代碼.

          1)              ActionServlet類的peocess()方法不捕獲任何異常,僅僅聲明向上層調用方法拋出異常.

          2)              RequestProcessor類是Struts框架處理異常的核心組件.

          3)              ExceptionHandler類是默認的異常處理類,它的execute()方法負責處理異常.

          根據打造技術Blog,尋求JAVA精髓! Servlet規范,當容器捕獲到異常的時候,將查看是否在Web.xml中配置了相

          應的<error-page>元素,如果存在,就會返回其<location>子元素指定的錯誤頁面.舉個簡單明了的例子如下:

          <error-page>

            <error-code>500</error>

            <location>/error.jsp</location>

          </error-page>

           

          <error-page>

            <exception-type>javax.servlet.ServletException</error>

            <location>/error.jsp</location>

          </error-page>

          Struts框架也允許以配置的方式來處理異常,配置方法可以避免在Action類中通過硬編碼來處理異常,提高應用的靈活性,可重用性和可維護性.對于Action類的execute()方法拋出的異常會先查找異常處理元素<exception>,如果是被嵌套在<global-exception>元素中就表示是全局異常處理元素,對所有的Action都適用.如果是嵌套在<action>元素中,就表示局部的異常處理元素,僅對當前的Action適用.闡述一下<exception>元素的屬性:

          1)     type:指定待處理的異常類

          2)     handler:指定異常處理類.默認是ExceptionHandler.如果自己要定義必須繼承它

          3)     path:指定轉發路徑

          4)     key:指定錯誤消息key.根據這個key到ResourceBundle中尋找匹配的消息文本

          5)     bundle:指定ResourceBundle,如果沒設置將使用哦么人的ResourceBundle

          6)     scope:指定ActionMessages對象的存放范圍,默認request,也可以設置session

          Struts框架提供了強大的異常處理功能,Struts控制器負責捕獲異常,并把異常包裝與

          ResourceBundle綁定的ActionMessages對象,在視圖層<html:error>標簽能夠顯示出來,主要可以通過配置的方式和編程的方式實現,這里不推薦用編程的方法,可以增強程序的靈活性,可重用性,可維護性. (網友們的支持,是我繼續寫技術文章的動力!)

          posted on 2005-10-29 14:02 我心依舊 閱讀(7668) 評論(10)  編輯  收藏

          FeedBack:
          # re: Struts異常處理(原創)
          2005-10-30 11:51 | lunarychen
          思路很清晰,條理很明了,可見功力不乏。很能靜下心來學習的人。向你學習。  回復  更多評論
            
          # re: Struts異常處理(原創)
          2006-11-02 11:55 | zhang xiuqing
          dd  回復  更多評論
            
          # re: Struts異常處理(原創)
          2006-11-16 14:32 | 梁帆
          講的很好,很生動.以后多來看你的文章.繼續努力吧  回復  更多評論
            
          # re: Struts異常處理(原創)
          2006-11-28 15:14 | bbbb
          只是OReilly Programming Jakarta Struts中的翻譯罷了  回復  更多評論
            
          # re: Struts異常處理(原創)
          2007-03-28 09:52 | xx
          這里不推薦用編程的方法,可以增強程序的靈活性,可重用性,可維護性. ???

          到底是推薦,還是不推薦??  回復  更多評論
            
          # re: Struts異常處理(原創)
          2007-09-07 17:13 | 匿名
          這個不是抄的孫衛勤的精通Struts中的嘛 ?
            回復  更多評論
            
          # re: Struts異常處理(原創)
          2007-10-03 19:14 | bluesea
          舉個例子會更好些!~  回復  更多評論
            
          # re: Struts異常處理(原創)[未登錄]
          2008-11-26 21:58 | xxx
          您在文章中提到,如果在struts中對exception不做處理,則會把錯誤直接拋給用戶,不知道你指的拋給用戶是怎樣的拋呢?會做哪些處理?在web容器比如weblogic中會是一個什么樣的反應?對weblogic服務會有什么樣的影響,忘賜教,謝謝!  回復  更多評論
            
          # re: Struts異常處理(原創)
          2009-03-07 17:10 | hc
          很明顯Copy!還原創???
          孫MM的文字。  回復  更多評論
            
          # re: Struts異常處理(原創)
          2009-07-01 08:25 | 匿名
          孫衛琴寫的比較詳細,樓主總結的很好

          無所謂抄襲,孫衛琴不也是參考OReilly Programming Jakarta Struts

          翻譯出來的嗎?
            回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宕昌县| 津市市| 徐闻县| 东方市| 温州市| 乌鲁木齐县| 合作市| 胶南市| 怀集县| 岑溪市| 瓮安县| 恩平市| 安陆市| 武鸣县| 平江县| 汤阴县| 五常市| 辽源市| 韩城市| 神木县| 灵川县| 丰县| 建德市| 昆明市| 怀柔区| 和政县| 长岛县| 昌吉市| 高青县| 榕江县| 涞源县| 漯河市| 噶尔县| 石林| 沂源县| 安宁市| 金川县| 百色市| 铁岭市| 天祝| 修水县|