Struts - <global-exception>カスタム例外ハンドラの例

Struts – カスタム例外ハンドラーの例

このの例をダウンロード–Struts-Global-Exception-Example.zip

Strutsフレームワークでは、デフォルトの従来のHTTPステータス500エラーページの代わりに、<global-exception>を使用してカスタムエラーページを表示します。

struts-global-exception-1

デフォルトのエラーページは見苦しく、まったくプロフェッショナルではありません。 さらに、エラーメッセージは、システム情報をエンドユーザーに漏らすのに十分な説明です。

1. +デフォルトの例外ハンドラー

これは、「struts.config.xml」で宣言されたデフォルトの例外ハンドラーの例を含む<global-exception>で、デフォルトのHTTP500エラーページをカスタムの説明的なエラーページに置き換えます。





    
        //...
    

        
        
    

    
        //...
    

上記では、アクションによってIOExceptionがスローされると、デフォルトのStruts例外ハンドラー「org.apache.struts.action.ExceptionHandler」が呼び出され、error.jspファイルに転送されます。 キーは、メッセージリソースプロパティファイルのキーです。

Common.properties

#common module error message
error.global.mesage =
   Ooooppps... Sometime wraong in this site, please come back later

error.jsp

Struts Global Exception Example

2. +カスタム例外ハンドラー

デフォルトの例外ハンドラーでは、例外の処理方法を制御する方法はありません。 ほとんどの場合、さらに分析するために例外をログに記録する必要があります。 これを行うには、ファイルシステムやデータベースなどの別のデータストアにすべての例外を記録するカスタム例外ハンドラーが必要です。

これは、「java.lang.Exception」を構成して、アクションによってスローされた例外に対して呼び出されるようにするカスタム例外ハンドラーの例です。 カスタム例外ハンドラーを作成するには、「org.apache.struts.action.ExceptionHandler」をサブクラス化し、executeメソッドをオーバーライドする必要があります。

MyCustomExceptionHandler.java

package com.example.common.exception;

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

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.config.ExceptionConfig;

public class MyCustomExceptionHandler extends ExceptionHandler{

  private static final Logger logger =
      Logger.getLogger(MyCustomExceptionHandler.class);

  @Override
  public ActionForward execute(Exception ex, ExceptionConfig ae,
    ActionMapping mapping, ActionForm formInstance,
    HttpServletRequest request, HttpServletResponse response)
    throws ServletException {

    //log the error message
    logger.error(ex);

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




    
        //...
    

        
        
    

    
        //...
    

上記では、アクションによって例外がスローされると、デフォルトの例外ハンドラーではなく、カスタム例外ハンドラーMyCustomExceptionHandlerのexecute()メソッドが呼び出されます。