Velocityの$resultについて知る方法

AipoのVelocity内には、$resultという変数が多数存在している。 そしてそのような変数は往々にしてプロパティやメソッドを伴って記述されている。 これらはJavaファイル内のものを指しているということしか分からず、どの部分を指すのかという詳細までは分からない。 それを知るためには、まず$resultが何を示しているのかを知る必要がある。

まずその$resultが存在するvmファイルと対応する〜Screen.javaファイルを探す。

大体vmファイル内の最初の方に$templateへの引数として記述されていると思うので確認する。

見つかったら、そのクラスのdoOutputメソッドを確認する。

例としてScheduleDetailScreen.javaを用いる

  /**
   *
   * @param rundata
   * @param context
   * @throws Exception
   */
  protected void doOutput(RunData rundata, Context context) throws Exception {
    try {
      ScheduleSelectData detailData = new ScheduleSelectData();
      detailData.initField();
      detailData.doViewDetail(this, rundata, context);

      String entityid =
        rundata.getParameters().getString(ALEipConstants.ENTITY_ID);
      context.put(ALEipConstants.ENTITY_ID, entityid);

      String ignore_viewdate =
        rundata.getParameters().getString(IGNORE_VIEWDATE);
      if (ignore_viewdate != null && ignore_viewdate.equals("true")) {
        rundata.getParameters().remove(IGNORE_VIEWDATE);
        context.put(IGNORE_VIEWDATE, "true");
      } else {
        context.put(IGNORE_VIEWDATE, "false");
      }
      String layout_template = "portlets/html/ajax-schedule-detail.vm";
      setTemplate(rundata, context, layout_template);
    } catch (Exception ex) {
      logger.error("[ScheduleDetailScreen] Exception.", ex);
      ALEipUtils.redirectDBError(rundata);
    }
  }

doOutputメソッドの中に、以下のような引数の中にthisを含むようなメソッドが存在する。 thisを追う理由は後述する。

      ScheduleSelectData detailData = new ScheduleSelectData();
      detailData.doViewDetail(this, rundata, context);

そのメソッドが存在するファイルに移動し、メソッドの詳細を確認する。

  /**
   * 詳細表示します。
   *
   * @param action
   * @param rundata
   * @param context
   * @return TRUE 成功 FASLE 失敗
   */  
public boolean doViewDetail(ALAction action, RunData rundata, Context context) {
    try {
      init(action, rundata, context);
      doCheckAclPermission(
        rundata,
        context,
        ALAccessControlConstants.VALUE_ACL_DETAIL);
      doCheckAttachmentAclPermission(
        rundata,
        context,
        ALAccessControlConstants.VALUE_ACL_EXPORT);
      action.setMode(ALEipConstants.MODE_DETAIL);
      M2 obj = selectDetail(rundata, context);
      if (obj != null) {
        data = getResultDataDetail(obj);
      }
      action.setResultData(this);
      action.putData(rundata, context);
      return (data != null);
    } catch (ALPermissionException e) {
      ALEipUtils.redirectPermissionError(rundata);
      return false;
    } catch (ALPageNotFoundException e) {
      ALEipUtils.redirectPageNotFound(rundata);
      return false;
    } catch (ALDBErrorException e) {
      ALEipUtils.redirectDBError(rundata);
      return false;
    }
  }

このメソッド内でthisを用いているsetResultDataの詳細は以下の通りである。

  /**
   * 
   * @param obj
   */
  @Override
  public void setResultData(Object obj) {
    result = obj;
  }

thisを追っていた理由は、result = thisであったためである。 この場合thisはScheduleSelectDataであり、resultがScheduleSelectDataであるということがわかる。 つまり$result.○○はScheduleSelectDataに存在する○○メソッドということになる。 また$result.○○.△△のように何個もつながっている場合があるが、これはJavaのメソッドチェーンと同じ原理である。

詳しくはメソッドチェーンより。

これが理解できればVelocityの理解はぐっと深まるはず。

出典:https://hacknote.jp/archives/1226/