SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

続 Struts 2入門

Struts 2の新たな検証機能「OVal Frameworkプラグイン」

続・Struts2入門(6)

より複雑な入力チェックを実装する方法

 先ほど示しましたリスト5のActionクラスにて、名前(name)のチェックでは指定された文字列(prohibitionNames)を含んではいないかをチェックする機能(リスト中(A)の部分)、パスワード(password)のチェックでは、入力された名前にパスワードが含まれていないかをチェックする機能(リスト中(B)の部分)を実装しています。

 OVal Frameworkには設定のみで書くには困難なチェック内容を、Javaのコードでチェックロジックを記述し実装する機能も設けられており、実装内容の複雑さにあわせて作成方法が2種類用意されています。

  • 単一項目の入力チェックを拡張する @ValidateWithMethod
  • 複数項目に渡るチェックを行う @CheckWith

 これらの利点は、Javaのコードで拡張した入力チェック内容もOVal Frameworkに統合して管理させることができますので、入力チェックの実装箇所を1つのクラスにまとめることができます。

 では、その詳細を説明していきましょう。

(1)単一項目の入力チェックを拡張する @ValidateWithMethod

 単一項目の入力チェックを拡張するのであれば@ValidateWithMethodを使います。サンプルでの適用箇所を以下に示します。

リスト7 SampleModel.java(抜粋)
public class SampleModel {
    …(中略)…
    @ValidateWithMethod(methodName = "isValidName",
      parameterType = String.class , message="usermodel.input.name.prohibit")  // (A)
    private String name

    /** 入力禁止の名前 */
    private String[] prohibitionNames = {"aaa","bbb","ccc","ddd","eee"};
    …(中略)…
    private boolean isValidName(String name) {
        for ( String prohibition:prohibitionNames) {
            // 引数で渡された値が入力禁止の名前に登録されている文字列を含んでいた場合はfalse
            if ( name.contains(prohibition)) {
                return false;
            }
        }
        return true;
    }

 @ValidateWithMethod内で設定するパラメータを表にしたものが次の表です。

表2 @ValidateWithMethod実装パラメータ
名前 説明
methodName String 入力チェック内容を実装しているメソッド名
parameterType Class 入力チェック対象のフィールドのクラス
message String 入力チェックエラーと判定したときに出力されるメッセージ

 また@ValidateWithMethodを利用する場合には次のルールを必ず守ります。

  • @ValidateWithMethodのmethodNameに宣言されたメソッド(以降、チェックメソッド)を使って、入力チェックを実装
  • チェックメソッドは必ずbooleanで結果を返す
  • ランタイム例外を検出した場合でも、想定されるものであればメソッド内で完結する

(2)複数項目に渡るチェックを行う @CheckWith

 入力項目には、複数の項目の関係をみて1つのチェックとするものもしばしば存在します。例えば年月日を別々の入力項目として入力するものや、開始期間~終了期間を入力するもの、同じ項目を入力して欲しくない項目など、複数項目にまたがる入力チェックを使うことがあります。OVal Frameworkには単一項目だけでなく、複数項目の入力チェックもサポートしており、Javaのコードで実装できる仕組みも用意しています。

 では先ほどのサンプルから実装箇所を抜粋し、内容を見てみましょう。

リスト8 SampleModel.java(抜粋)
public class SampleModel {
    …(中略)…
    @CheckWith(value=NameAndPasswordCheck.class ,message="usermodel.input.name.containpassword")  // (B)
    private String password;
    …(中略)…
    private static class NameAndPasswordCheck implements CheckWithCheck.SimpleCheck {
        /**
         * 入力された名前にパスワードが含まれていないかをチェックする。
         * ※CheckWithCheck必須実装メソッド。
         * @param validatedObject チェック対象インスタンス。
         * @param value パラメータ値。
         */
        public boolean isSatisfied(Object validatedObject, Object value) {
            // CheckWithCheckを呼び出しているフィールドに指定された値が空でないかをチェックする。
            // もし空であればチェック対象にしないので、ここではtrueを返してチェックを行わない。
            String nullCheck = (String)value;
            if ( nullCheck == null || nullCheck.equals("")) return true;

            // チェック対象フィールドを取り出す
            String name = ((SampleModel) validatedObject).name;
            String password = ((SampleModel) validatedObject).password;

            // ユーザー名にパスワードを含んでいたら入力チェックエラーとする。
            // 入力チェックエラー=falseを返す。
            return !(name.contains(password));
        }
    }
}

 @CheckWith内で設定するパラメータを表にしたものが次の表です。

表3 @CheckWith実装パラメータ
名前 説明
value Class 入力チェック内容を実装しているインナークラス
message String 入力チェックエラーと判定したときに出力されるメッセージ

 複数項目に対する入力チェックは、インナークラスで実装します。そのインナークラスの実装ルールを次に示します。

  • @CheckWithのvalueに宣言されたインナークラスを必ず作成する
  • インナークラスはCheckWithCheck.SimpleCheckインターフェイスを必ず実装する
  • public boolean isSatisfied(Object validatedObject, Object value)にチェックロジックを実装する
  • ランタイム例外を検出した場合でも、想定されるものであればメソッドないしはインナークラス内で完結する

 ではサンプルを稼動させて確認してみましょう。先ほどと同様、http://127.0.0.1:8080/OValSample/oval/execute.action をブラウザで開き、まずは入力禁止文字列をチェックするロジックを設定した名前にaを3つ以上並べた値を入力し、[送信]ボタンを押します。

図5 サンプル入力画面(名前に禁止文字列を入力した状態)
図5 サンプル入力画面(名前に禁止文字列を入力した状態)

 送信ボタンを押した結果、図6のように@ValidateWithMethodで設定した入力チェックエラーが稼動します。

図6 サンプル入力画面(禁止文字列チェック後の状態)
図6 サンプル入力画面(禁止文字列チェック後の状態)

 続いて@CheckWithの稼動です。パスワードに入力した文字列が名前に含まれてはいないかを確認するロジックを実装しましたので、今回は名前にnamepassword、パスワードにpasswordと入力し、それ以外の項目にも値を入れておいて[送信]ボタンを押します。

図7 サンプル入力画面(名前、パスワード入力後の状態)
図7 サンプル入力画面(名前、パスワード入力後の状態)

 送信ボタンを押した結果、図8のように@CheckWithで設定した入力チェックエラーが稼動します。

図8 サンプル入力画面(名前、パスワード入力チェック後の状態)
図8 サンプル入力画面(名前、パスワード入力チェック後の状態)

まとめ

 今回はOValプラグインの簡単な紹介をしました。既存のValidationよりも記述が減りつつ、機能もさらに拡張されていながらも、従来どおりの実装が可能になっていることがお分かりいただけましたでしょうか。

 次回は、Struts 2のActionクラスに対してSpring Frameworkを利用することが可能になるSpringプラグインの紹介をします。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
続 Struts 2入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5345 2010/08/09 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー