Java web中的異常處理狀況

.servlet容器中處理異常

如下兩種方式: html

1. web.xml定義異常處理  java

若是沒有在web的應用中做異常處理,那麼異常就會拋給Servlet容器,應該說此時Servlet容器是處理異常的時機了。若是此時Servlet容器還不對異常處理的話,那麼容器會把異常的內容直接顯示給訪問者。  Servlet容器經過web.xml配置對異常的處理。在web.xml中進行異常處理的配置是經過<error-page>元素來表示,支持兩種類型的異常攔截。 web

   1)依據http請求所返回的狀態碼來攔截 spring

   2)經過java異常類的類型來進行攔截 apache

   以下兩種類型的實例 編程

   <error-page> 瀏覽器

      <error-code>404</error-code>    app

         <location>/errors/pageNoFound.jsp</location> jsp

   </error-page> ide

  

   <error-page>

       <exception-type>java.lang.NullPointerException</exception-type>

          <location>/errors/pageNoFound.jsp</location>

   </error-page>

  

   錯誤頁面中錯誤信息的顯示

   jsp2.0開始,除了在錯誤頁面中能夠使用綁定到requestexception對象外,還增長了一個名爲errorData的綁定到pageContext的對象。它是javax.servlet.jsp.ErrorData類的對象。

errorData的屬性

-------------------------------------------------------

屬性                   類型          描述

requestURI             String        發出請求失敗的URI

servletName            String        發生錯誤的servletjsp頁面的名稱

statusCode             int           發生錯誤的狀態碼

throwable              Throwable     致使當前錯誤的異常

--------------------------------------------------------

在錯誤頁面中,可用以下實例顯示錯誤信息

<%@ page isErrorPage="true" contentType="text/html"; charset="utf-8" %>

<html>

   <head> ...</head>

   <body>

    請求地址:${pageContext.errorData.requestURI} <br>

       狀態碼:  ${pageContext.errorData.statusCode} <br>

       異常: ${pageContext.errorData.throwable}  <br>

   </body>

</html>

 

注:某些版本的瀏覽器須要關閉「顯示友好http錯誤信息」功能才能正常顯示錯誤信息。「工具」->"internet選項"->高級

 

2.自定義異常頁面(在jsp頁面中定義)

   經過jsp頁面中@page errorPage屬性來進行,以下:

   <% page errorPage="errors/error.jsp" %>

   這種處理方式將會覆蓋在web.xml中的定義  自定義異常將會攔截全部的異常,也就是說不能依據不一樣的異常的類型來進行不一樣的處理(區別於servlet容器異常處理)

  

二.Struts的異常處理機制

如下三種方式

1.編程式處理異常手動處理

 

  a)在發生異常的地方建立異常信息,並拋出異常

  b)捕獲異常,傳遞異常信息到相應的異常處理頁面

  c)Struts的配置文件struts-config.xml中,相應的action中配置<forward>指定異常處理頁面

  d)異常處理jsp頁面中顯示信息

  e)國際化資源文件ApplicationResources_zh_CN.properties中加入key-value

 

  具體實例以下:

  a)拋出異常

  

  public void delOrg(int orgId) {

              Orgnization org=(Orgnization)getHibernateTemplate().load(Orgnization.class, orgId);

              if(org.getChildren().size()>0)

              {

                  //拋出異常信息

                  throw new RuntimeException("存在子機構,不容許刪除");

              }

              getHibernateTemplate().delete(org);

       }

      

  b)捕獲異常,傳遞異常信息(此函數調用上一步定義的函數delOrg)

      public ActionForward del(ActionMapping mapping, ActionForm form,

                     HttpServletRequest request, HttpServletResponse response)

       throws Exception {

              OrgActionForm oaf = (OrgActionForm)form;

              try {

                     orgManager.delOrg(oaf.getId());

              } catch (Exception e) { 

                     //建立國際化文本信息

                    ActionMessages msgs=new ActionMessages();

                     ActionMessage msg=new ActionMessage("errors.detail",e.getMessage());

                     msgs.add("detail", msg);

                     //傳遞國際化文本信息

                    this.saveErrors(request, msgs);

                    return mapping.findForward("exception");

              }

              return mapping.findForward("pub_add_success");

       }

      

   c)Struts的配置文件struts-config.xml中,相應的action中配置<forward>指定異常處理頁面

     <action-mappings >

              <action

                     path="/org"

                     type="org.springframework.web.struts.DelegatingActionProxy"

                     name="orgForm"

                     scope="request"

                     parameter="method"

              >

                     <forward name="index" path="/org/index.jsp" />

                     <forward name="exception"  path="/org/exception.jsp" />

              </action>

     </action-mappings>

        

    d)/org/exception.jsp中顯示異常信息

         能夠用<html:errors>顯示異常信息。

        

    e)國際化資源文件ApplicationResources_zh_CN.properties中加入

         errors.detail={0}

         注:{0}表示接收的第一個參數。

 

2.自動異常處理方式(只能處理帶一個參數的狀況)

  a)在發生異常的地方建立異常信息,並拋出異常

  b)Struts的配置文件struts-config.xml中,相應的action中配置<exception>

  c)異常處理jsp頁面中顯示信息

  d)國際化資源文件ApplicationResources_zh_CN.properties中加入key-value

  此方式比上一種方式(編程式)少了"捕獲異常"的步驟,在strtus-config.xml中的配置也有所不一樣。

  struts-config.xml的配置以下:

   <action-mappings >

              <action

                     path="/org"

                     type="org.springframework.web.struts.DelegatingActionProxy"

                     name="orgForm"

                     scope="request"

                     parameter="method"

              >

               <exception key="errors.detail" type="java.lang.RuntimeException"       path="/org/exception.jsp" />

                <forward name="index" path="/org/index.jsp" />

              </action>

   </action-mappings >

  

  

3.統一的自定義異常處理

多個action使用同一個exception,將exception配置在全局exception中。mapping.findException方法會先到action中找局部exception,若沒有就會找全局exception相對應前面2中方式,這種方式將全部的異常統一處理

   a)自定義的異常類com.hq.exception.SystemException

   b)自定義的異常處理類com.hq.exception.SystemExceptionHandler

   c)struts-config.xml配置全局的exception

   d)在國際資源文件ApplicationResources_zh_CN.properties中加入key-value

   e)在發生異常的地方建立異常信息,並拋出異常

   f)異常處理jsp頁面中顯示信息

  

 

   a)自定義異常類com.hq.exception.SystemException 

       package com.hq.exception;

        

       public class SystemException extends RuntimeException {

              private String key;

              private Object[]values;

             

              public String getKey() {

                     return key;

              }

              public Object[] getValues() {

                     return values;

              }

              public SystemException() {

                     super();

              }

              public SystemException(String message, Throwable throwable) {

                     super(message, throwable);

              }

              public SystemException(String message) {

                     super(message);

              }

              public SystemException(Throwable throwable) {

                     super(throwable);

              }

             

              public SystemException(String key,String message)

              {

                     super(message);

                     this.key=key; 

              }

              public SystemException(String key,Object value,String message)

              {

                     super(message);

                     this.key=key;

                     this.values=new Object[]{value}; 

              }

              public SystemException(String key,Object[] values,String message)

              {

                     super(message);

                     this.key=key;

                     this.values=values;

              }

       }

      

  b)自定義異常處理類com.hq.exception.SystemExceptionHandler

      

      package com.hq.exception;

 

       import javax.servlet.ServletException;

       import javax.servlet.http.HttpServletRequest;

       import javax.servlet.http.HttpServletResponse;

 

       import org.apache.struts.action.ActionForm;

       import org.apache.struts.action.ActionForward;

       import org.apache.struts.action.ActionMapping;

       import org.apache.struts.action.ActionMessage;

       import org.apache.struts.action.ExceptionHandler;

       import org.apache.struts.config.ExceptionConfig;

      

       public class SystemExceptionHandler extends ExceptionHandler {

 

              @Override

              public ActionForward execute(Exception ex, ExceptionConfig ae,

                            ActionMapping mapping, ActionForm formInstance,

                            HttpServletRequest request, HttpServletResponse response)

                            throws ServletException {

                     ActionForward forward=null;

                     ActionMessage error=null;

                    

                     if(ae.getPath()!=null)

                     {

                            forward=new ActionForward(ae.getPath());

                     }else

                     {

                            forward=mapping.getInputForward();

                     }

                    

                     if(ex instanceof SystemException)

                     {

                            SystemException se=(SystemException)ex;

                            String key=se.getKey();

                            if(key==null)

                            {

                                   error=new ActionMessage(ae.getKey(),se.getMessage());

                            }

                            else

                            {

                                   if(se.getValues()!=null)

                                   {

                                          error=new ActionMessage(key,se.getValues());

                                   }

                                   else

                                   {

                                          error=new ActionMessage(key);

                                   }

                            }

                            this.storeException(request, key, error, forward, ae.getScope());

                            return forward;

                     }

                     else

                     {

                            return super.execute(ex, ae, mapping, formInstance, request, response);

                     }                         

              }

       }

      

     c)struts-config.xml配置全局的exception

         <global-exceptions>

         <exception

          key="errors.detail"

          type="com.hq.exception.SystemException"

          path="/common/exception.jsp"

          handler="com.hq.exception.SystemExceptionHandler">

          </exception>

         </global-exceptions>

        上面的key指定properties資源文件中的key值,type指定異常類,handler指定異常的處理類(若沒給出就會採用默認的ExceptionHandler)

 

       d)在國際資源文件ApplicationResources_zh_CN.properties中加入key-value

       errors.org.hasSubOrg={0}】存在{1}個子機構,不容許被刪除!

      

       e)在發生異常的地方建立異常信息,並拋出異常

       public void delOrg(int orgId) {

              System.out.println("delorg");

              Orgnization org=(Orgnization)getHibernateTemplate().load(Orgnization.class, orgId);

              if(org.getChildren().size()>0)

              {

                     //統一異常處理

                     Throw new SystemException("errors.org.hassuborg",new Object[]{org.getName(),org.getChildren().size()},"存在子機構,不容許被刪除");

              }

              getHibernateTemplate().delete(org);

 

       }

      

       f)異常處理jsp頁面中顯示信息

         /common/exception.jsp

<html:errors/>

相關文章
相關標籤/搜索