0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

📘 Vol.9.4:【Struts2】条件付きチェック/複数フィールド連動チェック編 〜 if文+validate()の活用で実現する柔軟な入力バリデーション 〜

Posted at

🧭 はじめに

前回(Vol.9.3)では、XMLによるバリデーション定義と input 遷移の基本パターンを紹介しました。
今回はもう一歩踏み込んで、以下のようなケースに対応する方法を解説します:

  • 条件付きバリデーション(例:チェックボックスONのときだけ必須)

  • 複数フィールドの連携チェック(例:パスワードと確認用パスワードの一致)

これらのチェックは、Struts2の Javaコード側(validate()メソッド を活用することで柔軟に実現可能です!


✅ よくある実務シナリオとその実装方法

1. 条件付きバリデーション(例:ある項目がONのときだけ他を必須)

@Override
public void validate() {
    if ("1".equals(isReceiveMail) && (email == null || email.isEmpty())) {
        addFieldError("email", "メールアドレスは必須です(受信希望の場合)");
    }
}
  • 状況に応じて入力必須かどうかを制御できます。

  • XMLではこうした「動的判定」が難しいため、validate() 側が最適。


2. 複数フィールドの連動チェック(例:パスワード確認)

@Override
public void validate() {
    if (password != null && !password.equals(confirmPassword)) {
        addFieldError("confirmPassword", "パスワードが一致しません");
    }
}
  • こちらもXMLでは不可能な処理です。

  • 「単一項目ではなく、複数項目をまたぐチェック」は Java 側で対応しましょう。


💡 実際のプロジェクトでの活用例(GitHub)

🔗 LoginAction.java(GitHub) の validate 実装(57〜76行目

ここでは、正規表現を含む複雑な条件を validate() 内で実装しています。

✅ XMLで対応できない条件は、Javaの validate() に柔軟に分担させる
= いわゆる “ハイブリッド運用” が実務的でおすすめです!

📝 補足Tips:共通化はすべき?

  • validate() は画面ごとに個別実装されることが一般的です。

  • BaseAction などで共通化しようとしても、画面によって項目名・ルールが異なるため難しいケースが多いです。

  • 逆に「共通チェック」だけを別メソッド化して呼び出すスタイルはアリ。


📚 まとめ

チェック種別 XMLで可能 Javaで可能 備考
単純な必須チェック XMLがシンプル
正規表現チェック △(一部不可) regexパターンによっては不可
条件付きチェック × Java一択
複数フィールド連携 × Java一択

🧭 次回予告:Vol.9.5

次回は、入力チェックエラーの表示デザイン
ユーザ体験を高めるための <s:fielderror> カスタマイズ について紹介予定です!

🔗 関連リンク


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?