m-namikiの日記

おもしろき こともなき世を おもしろく

遷移先を動的に変更

例えば新規登録と編集で、同じ入力画面を使いたいけど、入力画面からの遷移先を新規登録の場合と編集の場合で変更したい場合など。取り敢えず意図していたことは出来たのでメモ。

// EmployeeAction.java
/** 新規登録画面表示 */
public ActionResult create() {
    // セッションにモード(新規登録)を格納
    sessionScope.put("mode", "create");
    return new Forward("/employee/employeeEdit.html");
}
/** 編集画面表示 */
public ActionResult edit() {
    // セッションにモード(編集)を格納
    sessionScope.put("mode", "edit");
    employeeDxo.convert(userService.selectByEmployeeNo(this.employeeNo, this);
    return new Forward("/employee/employeeEdit.html");
}
<!-- employeeEdit.mayaa -->
<m:beforeRender>
  var confirmPath = '';
  if (session.mode == 'create') {
    confirmPath = 'createConfirm';
  } else if (session.mode == 'edit') {
    confirmPath = 'editConfirm';
  }
</m:beforeRender>

<!-- 遷移先の指定 -->
<t:form m:id="inputForm"
    action="${request.getContextPath()}/employee/${confirmPath}"
    method="POST" value="${action}"/>

<!-- 表示の制御 -->
<m:with m:id="employeeNo">
  <m:if test="${session.mode == 'create'}">
    <t:input type="text" name="employeeNo" maxlength="20" size="20"/>
  </m:if>
  <m:if test="${session.mode == 'edit'}">
    <m:write value="${action.employeeNo}"/>
    <t:input type="hidden" name="employeeNo"/>
  </m:if>
</m:with>

の方が遷移先を動的に変更する場合。新規登録と編集の場合で入力チェック項目を換えたいので、それぞれ新規登録確認(EmployeeAction#createConfirm())と編集確認(EmployeeAction#editConfirm())に遷移させるようにした。で遷移先のメソッド名を決定して、内で書き換える。
下の方のは、新規登録画面ではテキストボックスを表示するが、編集画面では変更されては困るようなキー項目について、値を表示するだけにして実際の値はhiddenで保持するようにした。
同じことをやるにしても、もっと他に良い方法があるはずなんだけど。うーん。