Struts1.Xパーソナライズ異常学習
1.独自のパーソナライズされた例外クラスを作成します.このクラスには、メンバー変数errorCodeを含めることができる.propertiesプレースホルダのargs配列を埋め込む必要があるObject配列タイプメンバー変数.彼らのget()メソッドを定義します.4つのコンストラクション関数を定義します.1つ目のコンストラクション関数は空、2つ目のコンストラクション関数はerrorCode、Object配列を持つコンストラクションメソッド、3つ目はerrorCodeパラメータを持つコンストラクションメソッド、4つ目はerrorCodeパラメータを持つコンストラクションメソッド、1つのObjectタイプパラメータ(非配列)を持つコンストラクションメソッドです.後者の2つの構築方法の実装では、2番目の宣言された構築方法を直接呼び出すことができる.
ErrorCodeExceptionクラス:
2.対応するExceptionHandlerクラスを作成し、既存のExceptionHandlerから継承する.execute()メソッドを書き換えます.
ErrorCodeExceptionHandlerクラス:
package wiki.struts; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.Globals; 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; import org.apache.struts.util.ModuleException; public class ErrorCodeExceptionHandler extends ExceptionHandler { public ActionForward execute( Exception ex, ExceptionConfig ae, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws ServletException { if(!(ex instanceof ErrorCodeException)){ return super.execute(ex, ae, mapping, formInstance, request, response); } ActionForward forward = null; ActionMessage error = null; String property = null; //Build the forward from the exception mapping if it exists //or from the form input if (ae.getPath() != null) { forward = new ActionForward(ae.getPath()); } else { forward = mapping.getInputForward(); } //Figure out the error if (ex instanceof ModuleException) { error = ((ModuleException) ex).getActionMessage(); property = ((ModuleException) ex).getProperty(); } else { //deal with the exception,if the instance of //exception is ErrorCodeException. ErrorCodeException ece = (ErrorCodeException)ex; error = new ActionMessage(ece.getErrorCode(), ece.getArgs()); property = error.getKey(); } this.logException(ex); //Store the exception request.setAttribute(Globals.EXCEPTION_KEY, ex); this.storeException(request, property, error, forward, ae.getScope()); return forward; } } 3.struts-configを構成する.xmlのkey値は任意に指定でき、typeは独自のパーソナライズされた例外クラス、handlerは2で記述されたExceptionHandlerクラスである.
ErrorCodeExceptionクラス:
package wiki.struts;
public class ErrorCodeException extends RuntimeException {
//define the error code,
//it is related to the properties file.
private String errorCode;
//if you want to dynamic fill with the args,use it object array.
private Object[] args;
public ErrorCodeException(){}
//if not need to fill with the args in the properties.
public ErrorCodeException(String errorCode){
this(errorCode,null);
}
//if you want to fill with the args in the properties.
public ErrorCodeException(String errorCode,Object args0){
this(errorCode,new Object[]{args0});
}
public ErrorCodeException(String errorCode,Object[] args){
this.errorCode = errorCode;
this.args = args;
}
public String getErrorCode() {
return errorCode;
}
public Object[] getArgs() {
return args;
}
}
2.対応するExceptionHandlerクラスを作成し、既存のExceptionHandlerから継承する.execute()メソッドを書き換えます.
ErrorCodeExceptionHandlerクラス:
package wiki.struts; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.Globals; 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; import org.apache.struts.util.ModuleException; public class ErrorCodeExceptionHandler extends ExceptionHandler { public ActionForward execute( Exception ex, ExceptionConfig ae, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws ServletException { if(!(ex instanceof ErrorCodeException)){ return super.execute(ex, ae, mapping, formInstance, request, response); } ActionForward forward = null; ActionMessage error = null; String property = null; //Build the forward from the exception mapping if it exists //or from the form input if (ae.getPath() != null) { forward = new ActionForward(ae.getPath()); } else { forward = mapping.getInputForward(); } //Figure out the error if (ex instanceof ModuleException) { error = ((ModuleException) ex).getActionMessage(); property = ((ModuleException) ex).getProperty(); } else { //deal with the exception,if the instance of //exception is ErrorCodeException. ErrorCodeException ece = (ErrorCodeException)ex; error = new ActionMessage(ece.getErrorCode(), ece.getArgs()); property = error.getKey(); } this.logException(ex); //Store the exception request.setAttribute(Globals.EXCEPTION_KEY, ex); this.storeException(request, property, error, forward, ae.getScope()); return forward; } } 3.struts-configを構成する.xml
<exception key="error.exception"
type="wiki.struts.ErrorCodeException"
handler="wiki.struts.ErrorCodeExceptionHandler"
path="/login_error.jsp"
/>