やっぱりBaseAction

Strutsを使っていたときは、必ずあったBaseAction。仕事としては、前にも書いたかもしれないけど、

  • Template Methodパターンをつかった事前処理と事後処理と例外処理と子Action用のabstractなメソッドの定義
  • 共通メソッドの提供
    • ログ出力メソッドの提供(ログメッセージ以外に出力したいものを共通処理として出す)
    • アプリケーション共通設定値の参照
    • その他共通メソッドの提供

があげられる。他なにかあるかな*1

で、SAStrutsを使うとTemplate Methodパターンはそもそも使えないし、事前事後的なものはAOPで処理するのが普通になる。

後半の共通メソッド提供に関しては「やっぱりBaseAction」かなぁと思ってつくった。やったのは、

  • requestやsessionなどのフィールド宣言
  • 同じくフィールドDI対象であるUserDtoの宣言
  • 共通ログ出力メソッドの提供(ログインIDの自動出力)
  • メッセージ出力用メソッドの提供(sessionには未対応)

こんな感じ(長いです)

/**
 * Action用のスーパークラス<br />
 * <pre>
 * ・ログ出力ヘルパーメソッド
 * ・メッセージ設定用メソッド
 * を提供する。
 * </pre>
 * @author kizashi
 *
 */
abstract public class BaseAction {
    @Resource
    public UserDto userDto;

    @Resource
    protected HttpServletRequest request;
    @Resource
    protected HttpServletResponse response;
    @Resource
    protected HttpSession session;
    @Resource
    protected ServletContext application;

    /**
     * ログ出力用インスタンス
     */
    private Logger logger = Logger.getLogger(this.getClass());
    
    /**
     * アクションメッセージ
     */
    private ActionMessages messages = new ActionMessages();

    /**
     * アクション用デバッグログ出力処理
     * 
     * @param message
     */
    final protected void debug(final String message) {
        log(Level.DEBUG, message);
    }

    /**
     * アクション用インフォログ出力処理
     * 
     * @param message
     */
    final protected void info(final String message) {
        log(Level.INFO, message);
    }

    /**
     * ログ出力時にユーザログインIDもあわせて出力する。
     * 
     * @param logLevel ログレベル
     * @param message メッセージ         
     */
    private void log(Level logLevel, final String message) {
        if (logger.isEnabledFor(logLevel)) {
            String logMessage = "[" + userDto.loginId + "] " + message;
            logger.log(logLevel, logMessage);
        }
    }

    /**
     * メッセージをセットする
     * 
     * @param messageKey メッセージキー
     * @param args メッセージの引数(配列)
     */
    final protected void addActionMessage(String messageKey, String[] args) {
        messages.add(Globals.MESSAGE_KEY, new ActionMessage(messageKey, args));
        ActionMessagesUtil.addMessages(request, messages);
    }

    /**
     * メッセージをセットする
     * 
     * @param messageKey メッセージキー
     * @param arg メッセージの引数(ひとつ)
     */
    final protected void addActionMessage(String messageKey, String arg) {
        addActionMessage(messageKey, new String[] { arg });
    }

    /**
     * メッセージをセットする(引数なし)
     * 
     * @param messageKey メッセージキー
     */
    final protected void addActionMessage(String messageKey) {
        addActionMessage(messageKey, (String[]) null);
    }

    /**
     * エラーメッセージをセットする
     * 
     * @param errorKey エラーメッセージのキー
     * @param args エラーメッセージの引数(配列)
     */
    final protected void addActionMessageAsError(String errorKey, String[] args) {
        messages.add(Globals.ERROR_KEY, new ActionMessage(errorKey, args));
        ActionMessagesUtil.addErrors(request, messages);
    }

    /**
     * エラーメッセージをセットする
     * 
     * @param errorKey エラーメッセージのキー
     * @param arg エラーメッセージの引数(ひとつ)
     */
    final protected void addActionMessageAsError(String errorKey, String arg) {
        addActionMessageAsError(errorKey, new String[] { arg });
    }

    /**
     * エラーメッセージをセットする
     * 
     * @param errorKey エラーメッセージのキー
     */
    final protected void addActionMessageAsError(String errorKey) {
        addActionMessageAsError(errorKey, (String[]) null);
    }

}

sessionにメッセージをセットするのには未対応。引数(SaveType)で対応するか、メソッドの数を増やすか微妙なところ。

アプリケーション共通設定もまだしていない。セオリーは、Pluginを実装したクラスを定義して、そこでconfig.propertiesみたいなのを読み込んで、applicationに設定するって感じなのかな。

こうしたほうがいいとか間違っているとかのご指摘があればコメントくださいm(_ _)m

*1:気づいた人おしえてくださいー