JIRAに挙がってる改良提案
これ実装してほしい!
https://issues.apache.org/struts/browse/WW-1866
一覧画面の各レコードに更新ボタンがあって、そこから
入力画面 → 確認画面 → 完了画面
と遷移していくといった、いわゆるマスタメンテ系の機能ではよくあるパターン。
こういうのは、Struts1の頃は
・入力画面表示Action
IDを受け取り、修正対象レコードを取得(IDが必須)
・確認画面表示Action
入力値の検証(ActionFormのvalidationを行う)
・完了画面表示Action
てな具合にそれぞれ個別にActionクラスを作成していました。
それをStruts2で1個のActionクラスで済ませられないかなーと考えた時に、現状だとResultアノテーションをActionクラス単位にしか設定できなくてうまくいかないのですね。
具体的には、
public class UserUpdateAction extends ActionSupport { private String id; private User user; @Validations(requiredStrings={@RequiredStringValidator(fieldName="id", message="不正")}) public String edit(){ //受け取ったIDから対象レコードを取得し、入力画面へ return "edit"; } @Validations(visitorFields={@VisitorFieldValidator(fieldName="user", message="")}) public String confirm(){ //確認画面へ return "confirm"; } @Validations(visitorFields={@VisitorFieldValidator(fieldName="user", message="")}) public String update(){ //更新処理を行い、完了画面へ return "updateCommit"; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
上記のようなActionクラスを作成し、前々回出てきたvalidateAnnotatedMethodOnlyをtrueにして
入力画面表示時はIDの入力チェックを、確認画面表示時はActionFormの入力チェックを行うようにします。でも、いずれの入力チェックエラーの場合も、結果コードは"input"となります。なので
・入力画面時にIDが渡ってこなかった場合は一覧画面へ
・確認画面時にActionFormの入力チェックエラーとなった場合は入力画面へ
といった設定ができないのです。
まあ、IDの入力チェックをStruts2のValidationの機構に任せずに自力でやるなりすればいいのかもしれませんが。。。