EzServletでサジェスト機能!


今日は、本日はAjaxを利用したEzServletに「サジェスト機能」を追加しましたので簡単に説明したいと思います。
今回は、サジェスト機能とはどんなものなのか?そしてEzServletで利用方法について簡単に説明いたします。
詳細は別途記述しますので、まずはサジェスト機能について...
Googleれば一発で出てきますが、以下のような機能をサジェスト機能といいます。

サジェスト機能」とは?
サジェスト機能は、検索フォームに文字を入力していくと、 途中から文字の入力を補ったり、その言葉を含む関連検索語を表示する機能です。
検索したい単語を忘れた、綴りを忘れたなどの場合にはとても便利な機能です。
中略...
���������ȵ�ǽ

一番身近なサジェスト機能は「Google」検索ではないでしょうか?
検索文字(あ)を入力すると補完機能により、候補となる検索文字列が表示されます。

EzServletでは、この機能を開発者がAjaxを意識(JavaScriptやDHtml等を記述)することなく、実装することが出来ます。以下にEzServletを利用したSuggest機能を実装した画面を紹介します。

上記Suggest機能は「名称」に「いう」が含まれているユーザーをテーブルから検索し、先頭のn件を表示しています。
EzServletでは、開発者がHTMLに特殊なタグを埋め込むことなく、上記機能を実装することが可能です。


コードを書くのはサーバー側(Java)だけでよいのです。
上記機能を実装したサーバーのコードは以下の通りです。たった数行ですよ。。。

public void doSuggest(EzRequest req, EzResponse res, Hoge hoge) {
 // サジェスト要求か確認します。
 if(req.isSuggest()) {
  // サジェスト要求のあった入力項目の入力値を取得します。
  String value = req.getSuggestValue();
  // ユーザーテーブルより、入力値を含む名称を先頭10件取得します。
  _USER US = new _USER();
  List list = EzJDBC.selects(US.name).from(US)
             .where(US.name.like(value)).limit(10).find(User.class);
  // 取得したユーザー名称をSuggestとして設定します。
  for(User user : list) {
   req.suggest(user.name);
  }
 }
}

たったこれだけです。ちょーかんたんでしょ…(^^;)

上記例では利用していませんが、 req.getSuggestName()を呼び出せば、どの項目からのSuggest要求かを判別することが可能です。

EzThreadで簡単マルチスレッド・プログラミング


こんにちは、マルチスレッド・プログラミングって結構敷居たかいよね。
eclipseに語りかけてる高橋です...m(__)m
マルチスレッド・プログラミングとは何ぞやと言う方は、ググる(Google)か下記を参照してください。

【マルチスレッド・プログラミングとは?】
マルチスレッドとは、1つのアプリケーションソフトがスレッドと呼ばれる処理単位を複数生成し、並行して複数の処理を行なうこと。いわばアプリケーションソフト内でのマルチタスク処理。マルチタスクと同じように、CPUの処理時間を非常に短い単位に分割し、複数のスレッドに順番に割り当てることによって、複数の処理を同時に行っているようにみせている。

で、Javaにはマルチスレッド機能であるThreadクラスが存在するわけですが、プログラムを開発する際にマルチスレッドを意識したコードを書くのは意外と煩雑なのです。まず、Threadクラスを継承してrunメソッドに実装コードを書きます。

マルチスレッド・プログラミングのコード例

/** マルチスレッドで処理するプログラム */
public class Hoge extends Thread {
 private String param1;
 private String param2;
 public String result;
 // runメソッド内に記述されるビジネスロジックで利用するパラメータは
 // 別メソッドで定義する必要がある
 public void setParam(String param1, String param2) {
  this.param1 = param1;
  this.param2 = param2;
 }
 // ビジネスロジックコード(このメソッドはThread#start()メソッドから
 // マルチスレッドとして呼び出されます)
 public void run() {
  // 指定されたパラメータ(param1,param2)を結合した結果をresultに格納します。
  this.result = this.param3 + this.param2;
 }
}
/** 呼び出し元プログラム */
public class Main {
 public static void main(String[] args) {
  // スレッドA
  Hoge hoge1 = new Hoge();
  hoge1.setParam("パラメータ1","パラメータ2");
  hoge1.start();
  // スレッドB
  Hoge hoge2 = new Hoge();
  hoge2.setParam("パラメータ3","パラメータ4");
  hoge2.start();
  // スレッドA,Bの処理が完了する前に、この行以下のコードが実行されるため処理が
  // 完了したかを知る仕組みが必要になります。
  // またスレッドA,Bの処理で例外が発生した場合に、それを知る方法と例外をcatchする
  // 仕組みが必要になります
  ...
  System.out.println(hoge1.result);
  System.out.println(hoge2.result);
 }
}

Hoge(スレッドA,B)の処理状況は別スレッドで起動されてる事から、呼び出し元からは判断がつかないため、その仕組みも実装する必要が出てきます。上記コードをみても分かるとおり、Hoge(スレッドA,B)の実行結果の戻り値を呼び出し元に返す仕組みもないため開発者が実装(工夫)する必要があります。
本来の機能とマルチスレッドの機能が混在するため開発するのが、いがいーと面倒なのですね。。。


そんな悩みを解決するのが、新FwのEzThreadクラスです。
EzThreadクラスを利用すれば、通常のJavaクラスがマルチスレッドで実行することが可能になります。
また、マルチスレッドで起動している処理の状況(実行中か、正常終了したか、異常終了したか)の判別も呼び出し元プログラムで確認しすることが出来ます。
では、EzThreadを利用して通常のJavaクラスをマルチスレッドで起動するコードを見てみましょう。。。

EzThreadを利用したマルチスレッド・プログラミングのコード例

/** マルチスレッドで処理されるプログラム */
public class Hoge {
 // ビジネスロジックコード(普通のメソッド)
  public String concat(String param1, String param2) {
  // 指定されたパラメータ(param1,param2)を結合した結果をresultに格納します。
  return this.param3 + this.param2;
 }
}
/** 呼び出し元プログラム */
public class Main {
 public static void main(String[] args) {
  // スレッドA  
  // パラメータ1 : 実行対象となるインスタンス
  // パラメータ2 : 実行するメソッド名
  // パラメータ3以降 : 2のメソッドに受け渡すパラメータ)
  EzThread thread1 = EzThread.execute(new Hoge(),"concat","引数1","引数2");
  // スレッドB  
  EzThread thread2 = EzThread.execute(new Hoge(),"concat","引数1", "引数2");
  // スレッドA,Bが処理中かを確認します。
  while(thread1.isProssessing() || thread2.isProssessing()) {
   // スレッドA,Bが処理中であった場合は、1秒sleepします。
    EzThread.sleep(1000);
  }
  // スレッドAの処理が異常終了したかを確認します。
  if(thread1.isAbnormalEnd()) {
   // 処理が異常終了した時の処理
   System.out.println("スレッドAが異常終了しました");
   Throwable e = thread1.getThrowable();
   e.printStackTrace();
  }
  // スレッドBの処理が異常終了したかを確認します。
  if(thread2.isAbnormalEnd()) {
   // 処理が異常終了した時の処理
   System.out.println("スレッドBが異常終了しました");
   Throwable e = thread2.getThrowable();
   e.printStackTrace();
  }
  // スレッドA,Bが共に正常終了したかを確認します。
  if(thread1.isNormalEnd() || thread2.isNormalEnd()) {
   // スレッドA,Bが共に正常終了した時の処理。
    System.out.println(thread1.getReturn());
    System.out.println(thread2.getReturn());
  }
 }
}

これでokです。上記コードを見ると分かるとおり、ビジネスロジックを記述するHogeクラスは通常のjavaクラスですね。マルチスレッドで実行されることは、まったく意識しないつくりになってます。EzThreadは、呼び出す側のプログラムで利用します。通常のThreadの以下の問題点は、すべてクリアされているのが分かると思います。


【Threadの問題点】
・マルチスレッドで実行するプログラムがPOJOで作成可能
・スレッドの状況(実行中か、正常終了したか、異常終了したか)が呼び出し側で確認可能
・呼び出し側で「戻り値」「例外」の取得が可能


ちょー簡単ですね(^^)
EzThreadを利用すれば、Javaで日次バッチや月次バッチ等を「支店」や「営業所」毎に実行することが簡単にできますね。。。

日本IBM x86で3TBものメモリーを搭載可能な eX5 本日発表!


メモリ3テラって凄すぎ(^^)

         業界最大 3テラ・バイトのメモリー容量を実現した  
                次世代x86サーバーのアーキテクチャー eX5 を発表


eX5は、インテルCPUとの融合により、パフォーマンスや可用性、拡張性、運用効率を飛躍的に向上させるIBMのハイエンド・サーバー向けアーキテクチャー「Enterprise X-Architecture (EXA)」の5世代目で、現時点における業界の常識を超えたx86の新しい世界を創造します。

このeX5により、搭載メモリー容量を従来の6倍(3TB)まで拡張できることで、仮想化によるサーバー統合密度を高め、多種多様な業務を効率よく処理できるクラウド環境を実現できます。

更に、FlexNode機能により、例えば、ワークロードの種類に応じて、2台の2CPUサーバーを1台の4CPUサーバーとして活用したり、またそれを2台に分割して使用する事ができます。これは、昼間は2台の2CPUサーバーでWebのフロントエンド・サーバーとして使用して、夜間は4CPUのバッチ処理に使用するなど柔軟な構成変更が可能になっています。

ITの重要課題が、仮想化、プラットフォーム管理、およびエネルギー効率に加速的にシフトする中、この最新世代テクノロジー eX5が、課題解決のための世界の先駆けとなるでしょう。

IBMは「スマート」な世界での新しいニーズに応え、ビジネスの変化に対する俊敏さ、変化を先取りして変革し続ける柔軟性や先見性を備えた企業基盤「Dynamic Infrastructure(R)(ダイナミック・インフラストラクチャー)」の実現の必要性を提唱しています。

今回発表したeX5は、ダイナミック・インフラストラクチャーを実現する上でIBMの重要な取り組みの一つである「ワークロード最適化」を具現化するテクノロジーです。


http://www-06.ibm.com/systems/jp/x/ex5/

JAVAソース生成plugin vol.3


前回の最後にFormクラスのvalidateメソッドの自動生成について触れましたが、今回はvalidator拡張の種類について説明します。セッティングsheetにより、基本的な妥当性検査用のソースは自動生成されます。
しかしながら、より詳細なチェックを行う場合は、自動生成されたvalidateソースを開発者が拡張する必要があります。EzServletではvalidate拡張用メソッドが用意されていますので、その種類と内容について実際のコードを書きながら説明したいと思います。


1.EzServletの妥当性検査クラス
 EzServletでは妥当性検査用クラスとして、EzValidateUtilクラスが用意されています。
 自動生成されるFromクラスでは、このクラスがstatic importされています。
 EzValidateUtilクラスのstaticメソッドは、以下の5種類のメソッドが存在します。

(1) characterメソッド 文字妥当性チェックを行うメソッドです。
(2) numericメソッド 数値妥当性チェックを行うメソッドです。   
(3) dateメソッド 日付妥当性チェックを行うメソッドです。
(4) timeメソッド 時間妥当性チェックを行うメソッドです。
(5) fileメソッド ファイル妥当性チェックを行うメソッドです。

 セッティングsheetに妥当性検査の設定を行うと上記のいづれかを利用したチェックコードが自動生成されます。
 それでは各メソッドの拡張機能について説明します。


2.各メソッドの拡張機能
 (1) characterメソッド

// 全角文字のみ入力可能なチェックコードは以下の通りです。
character(EzMessage).name(入力項目のプロパティキー).digit(入力文字数).emSize().validate(入力値); 

    拡張機能1:入力必須桁数を指定する方法
    character(...).digit(入力必須桁数,最大入力桁数)

    拡張機能2:プロジェクト禁文字を入力可能にする方法
    character(...).allowedProhibition()

    拡張機能3:入力許可文字を追加する方法
    character(...).include(char)

    拡張機能4:入力禁止文字を追加する方法
    character(...).exclude(char)

    拡張機能5:入力可文字列を限定する方法
    character(...).compareWords(String...)


 (2) numericメソッド   

// 数値(少数含む)入力可能なチェックコードは以下の通りです。
numeric(EzMessage).name(入力項目のプロパティキー).digit(整数桁).scale(少数桁).validate(入力値);  

    拡張機能1:整数入力必須桁数を指定する方法
    numeric(...).digit(入力必須桁数,最大入力桁数)

    拡張機能2:少数入力必須桁数を指定する方法
    numeric(...).scale(入力必須桁数,最大入力桁数)

    拡張機能3:入力可な値の範囲を設定する方法
    numeric(...).range(double, double)

    拡張機能4:入力フォーマットを設定する方法
    numeric(...).format(String) 例:format("0,000.###")

    拡張機能5:0を未入力扱いにする方法
    numeric(...).excludeZero()


 (3) dateメソッド  

// 日付(yyyyMMdd)チェックコードは以下の通りです。
date(EzMessage).name(入力項目のプロパティキー).validate(入力値);  

    拡張機能1:入力フォーマットを設定する方法
    date(...).format(String) 例:format("yyyy/MM/dd")

    拡張機能2:年月(yyyyMM)の妥当性検査をする方法
    date(...).yearMonth()


 (4) timeメソッド   

// 時間(hhmmss)チェックコードは以下の通りです。
time(EzMessage).name(入力項目のプロパティキー).validate(入力値); 

    拡張機能1:入力フォーマットを設定する方法
    time(...).format(String) 例:format("hh:mm:ss")

    拡張機能2:時分(hhMM)の妥当性検査をする方法
    time(...).hourMinutes()


 (5) fileメソッド   

// UploadFileのチェックコードは以下の通りです。
file(EzMessage).name(入力項目のプロパティキー).validate(java.io.File);  

    拡張機能1:Upload可能なファイルサイズ(Byte)を指定する方法
    file(...).size(long)

    拡張機能2:UPLOAD可ファイル拡張子を指定する方法
    file(...).includeExtentions(String...)


これらの拡張機能によって、かなりの妥当性検査は網羅することが出来るかと思います。
現在は、もう一つだけメソッド(条件付必須)を追加する予定ですが、拡張機能にこんなのがあると良い(便利)とおもうものがありましたら気軽に言ってください。
前向きに検討しようと思います。


尚、条件付必須は以下のようにする予定です。
character(...).ifRequiredrequiredIf(boolean)


【追記】
条件付必須のチェックメソッドrequiredIf(boolean)が完成しましたので、利用方法を説明します。
下記のvalidateコードがを例に説明したいと思います。

// 「メールアドレス」項目に対して「半角」チェックをないます。
character(ezMessage).name(VC.MAIL).digit(100).alphabet().number().validate(this.mail);
// 「携帯メールアドレス」項目に対して「半角」チェックをないます。
character(ezMessage).name(VC.TEL_MAIL).digit(100).alphabet().number().validate(this.telMail);

上記validateコードに「メールアドレスに入力が無い場合は、携帯メールアドレスを入力必須」にするチェックを追加すると以下のようになります。

// 「メールアドレス」項目に対して「半角」チェックをないます。
character(ezMessage).name(VC.MAIL).digit(100).alphabet().number().validate(this.mail);
// 「携帯メールアドレス」項目に対して「半角」チェックをないます。
character(ezMessage).name(VC.TEL_MAIL).digit(100).alphabet().number()
.requiredIf(this.mail.equals("")).validate(this.telMail);

これだけでok...簡単ですね(^^)

5.JAVAソース生成plugin vol.2


こんにちは、今回は前回説明した「JAVAソース生成」pluginの続きで、自動生成されたリソースの内容について説明したいと思います。pluginによって生成されるリソースは「From」「Action」「properties」の3つであることは前回説明しました。今回はその中のFormクラスの詳細について説明いたします。


1.HTMLの入出力項目を格納するForm.javaソース
Fromクラスの構成は以下のようになります。
前回の説明でも利用しましたSample.htmlを例に説明します。実際のFromクラスのソースは、ここにあります。

// Sample.htmlのFormクラス
public class SampleForm {

 / 入出力用プロパティー(input系タグやtg:outタグの値を格納するフィールド)
 public String name
 ...
 public List resultList = new ArrayList();

  // インナークラス(tg:loopタグの1行分の情報を格納するクラス)
  // 上記resultListに格納されます。
  public static class Result { ... }

  // 定数クラス(tg:labelのname属性やselectタグ等の選択値)
  public static class VC { ... }

  // 妥当性チェックメソッド(validateメソッド)
  public boolean validate() { ... }
}

画面の入出力項目や定数および妥当性検査を行うFormクラスの構成は上記の通りです。
これらの内容は開発者がマニュアルで記述しても問題はありませんが、決まりきった作業であり、上記ソースの内容はhtmlまたはセッティングsheet(xls)に1度記述した内容になります。と考えればDRY(Don't Repeat Yourself)の精神からすれば、マニュアルで記述するのはナンセンスということで、自動生成の対象となっています。ここで問題になるのが、ソース自動生成のジレンマがあります。

自動生成は、何らかの元ネタとなるリソース(今回でいえばhtml,セッティングsheet)を読み込み、その情報からソースを自動生成することになります。
自動生成されたソースをそのまま利用できれば問題はないのですが、開発者が拡張する場合が多いのが事実です。また拡張は容易に行えなければなりません。
しかし、自動生成する元ネタに変更が発生した場合(例えばHTMLの項目が追加になったとか)に、再度自動生成すると開発者が拡張した内容を上書きして
しまっては、元も子もありません。今回の自動生成pluginは、この問題も解決した方法を提供しています。以前にも紹介した、この機能です。


自動生成されたソースコードには「/* TRYGEN_SOURCE_REPLACE_BEGIN */」と「/* TRYGEN_SOURCE_REPLACE_FINAL */」が記述されます。自動生成pluginは「/* TRYGEN_SOURCE_REPLACE_BEGIN */」から「/* TRYGEN_SOURCE_REPLACE_FINAL */」に囲まれたソースのみを置き換えます。つまり、開発者が拡張したコード(自動生成されたコードを拡張した場合も含む)を「TRYGEN_SOURCE_REPLACE_...」コメント外に記述しておくことにより、再度自動生成した場合でも拡張コードは保護されます。


以下に実際に「TRYGEN_SOURCE_REPLACE_...」が含まれたソースをサンプルとして記述します。
説明の便宜上インナークラスと定数クラスは省きます。


public class SampleForm {
 public int count1; ... 1
 /* TRYGEN_SOURCE_REPLACE_BEGIN */
 public int count2; ... 2
 public String name;
 ...
 public List resultList = new ArrayList();
 /* TRYGEN_SOURCE_REPLACE_FINAL */
 public int count3; ... 3

 // validate
 public boolean validate() {
  // チェック結果を保持する属性の宣と初期化をないます。
  EzMessage ezMessage = new EzMessage(PROPERTY);
  // 「ユーザーID」項目に対して「英数」チェックをないます。
  character(ezMessage).name(VC.USERID).digit(20).alphabet().number()
  .validate(this.userid);
  ...
 }
 public void testMethod() { ... 4
  System.out.println("テスト");
 }
}

上記の場合、1,3,4に記述されたコードは、再度ソースを自動生成しても保護されます。対して2に記述されたコードは、
置き換えコメント「TRYGEN_SOURCE_REPLACE_...」に囲まれた位置ですので、再度、自動生成を行うと置き換えられます。

上記ソースで気になる点はvalidateメソッドです。自動生成されたコードは「validate」メソッドを「TRYGEN_SOURCE_REPLACE_...」コメント外に作成
します。つまり、自動生成を再度行っても「validateメソッド」の内容は書き換わらないと言うことになります。
この理由は、validateメソッドの内容は、ここで説明下通りセッティングsheetで設定されますが、この内容すべてが網羅できているわけではありません。
妥当性検査には、文字、数字、レングス、必須といった単純なチェック以外にも、値の範囲であったり、最小値、最大値のチェックなどがあるかと思います。


これらのチェックは、自動生成後にチェック内容を拡張する必要が発生します。
例えば上記例でいえば「ユーザーID項目の英数チェック」に加えて「-(ハイフン)のみ入力可能」にする拡張を入れた場合は以下のようになります。

// 「ユーザーID」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.USERID).digit(20).alphabet().number()
.include('-').validate(this.userid);

この様な拡張は、開発者が自動生成されたコードに設定を付加することで可能になるため、再度ソースを自動生成した場合にコードが上書きされてしまうと折角
の拡張が無意味になってしまうため、validateメソッドは「TRYGEN_SOURCE_REPLACE_...」コメント外に生成されます。
しかし、このままではhtmlに入力項目等が追加された場合、validateメソッドに追加項目の内容が反映されません。
そこで、このpluginでは入力項目が追加され、その項目にvalidateの設定がされていた場合は、既存のvalidateソースに追加項目の妥当性チェックを追加するようになっています。仮に以下のvalidateメソッドが存在していた場合を想定して説明します。

// 「ユーザーID」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.USERID).digit(20).alphabet().number()
.include('-').validate(this.userid);
// 「メールアドレス」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.MAIL).digit(100).alphabet().number()
.include('@','-','.').validate(this.mail);

上記validateメソッドは、「ユーザーID」と「メールアドレス」の順番で妥当性チェックを行っているソースですが、画面に「ユーザーID」と「メールアドレス」の間に
「パスワード」項目が追加され場合は、pluginにより以下のようにコードを再生性します。

// 「ユーザーID」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.USERID).digit(20).alphabet().number()
.include('-').validate(this.userid);
// 「パスワード」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.PASSWORD).digit(20).alphabet().number()
.validate(this.password);
// 「メールアドレス」項目に対して「英数」チェックをないます。
character(ezMessage).name(VC.MAIL).digit(100).alphabet().number()
.include('@','-','.').validate(this.mail);

既存のコードは、そのままにチェックする順番を守った上で、追加された項目「パスワード」をvalidateメソッドに追加します。
この機能により、開発者の拡張コードは保護された状態で何度でも自動生成を行うことが可能になります。

5.JAVAソース生成plugin


こんにちは、今回はEzServletのpluginの1つでものある「JAVAソース生成」pluginについて説明したいと思います。これでEzServletのpluginは最後です...やっとです><
セッティングsheet生成pluginで作成されたExcelシート(入力値妥当性チェックの設定等を行った)を元に、MVCモデルのFromクラスとActionクラスのjavaソースとpropertiesを自動生成します。


では早速利用方法について説明します。
今回利用するサンプルは前回説明したセッティングsheet()を利用します。
1.対象となるExcelを選択します。


2.すかさず「U」ボタンを押下します。


3.選択したパッケージに「SampleForm.java」「SampleAction.java」「SampleAction.properties」
 が作成されます。

4.SampleForm.javaを開きます。

package jp.co.dsc.sample.list;

import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;

import are.trygun.framework.util.message.EzMessage;

import static are.trygun.framework.util.validate.EzValidateUtil.*;
/**
 * <p>SampleForm画の入出力情報をマッピングするクラスです</p>
 *
 * @author xxxx
 * @version 1.00 2010/02/17
 * @since 1.00
 *
 */
public class SampleForm implements Serializable {
   /** serial version id */
   private static final long serialVersionUID = 1L;
   /** PROPERTYファイルのパスを保持する属性です。*/
   public static final String PROPERTY =  SampleAction.class.getName();
   /* TRYGEN_SOURCE_REPLACE_BEGIN */
   /** 出力目「errors」の情報を保持する属性です。*/
   public String[] errors;
   /** 入力目「氏名」の情報を保持する属性です。*/
   public String name;
   /** 入力目「ユーザーID」の情報を保持する属性です。*/
   public String userid;
   /** 入力目「メールアドレス」の情報を保持する属性です。*/
   public String mail;
   /** 入力目「住所」の情報を保持する属性です。*/
   public String address;
   /** 示・示フラグ「display」の情報を保持する属性です。*/
   public boolean display = flase;
   /** 繰りし目のクラス「Result」を保持するList属性です。*/
   public List<Result> resultList = new ArrayList<Result>();

   /**
    * <p>Result画の入出力情報をマッピングするクラスです</p>
    */
   public static class Result implements Serializable {
      /** serial version id */
      private static final long serialVersionUID = 1L;
      /* TRYGEN_SOURCE_REPLACE_BEGIN */
      /** 出力目「name」の情報を保持する属性です。*/
      public String name;
      /** 出力目「userid」の情報を保持する属性です。*/
      public String userid
      /** 出力目「mail」の情報を保持する属性です。*/
      public String mail;
      /* TRYGEN_SOURCE_REPLACE_FINAL */
   }
   /* TRYGEN_SOURCE_REPLACE_FINAL */

   /**
    * <p>SampleForm画のプロパティーキーや定数の管理をう内クラスです</p>
    */
   public static class VC implements Serializable {
      /** serial version id */
      private static final long serialVersionUID = 1L;
      /* TRYGEN_SOURCE_REPLACE_BEGIN */
      /** 入力目「氏名」の目名のプロパティーキーを保持する属性です。*/
      public static final String NAME = "label.name";
      /** 入力目「ユーザーID」の目名のプロパティーキーを保持する属性です。*/
      public static final String USERID = "label.userid";
      /** 入力目「メールアドレス」の目名のプロパティーキーを保持する属性です。*/
      public static final String MAIL = "label.mail";
      /** 入力目「住所」の目名のプロパティーキーを保持する属性です。*/
      public static final String ADDRESS = "label.address";
      /* TRYGEN_SOURCE_REPLACE_FINAL */
   }

   /**
    * <p>画入力値の検をないます。</p>
    * @return boolean 検結果の成否
    */
   public boolean validate() {
      //   チェック結果を保持する属性の宣と初期化をないます。
      EzMessage ezMessage = new EzMessage(PROPERTY);
      // 「氏名」目に対して「全」チェックをないます。
      character(ezMessage).name(VC.NAME).digit(20).emSize().validate(this.name);
      // 「ユーザーID」目に対して「数」チェックをないます。
      character(ezMessage).name(VC.USERID).digit(20).alphabet().number().validate(this.userid);
      // 「メールアドレス」目に対して「半」チェックをないます。
      character(ezMessage).name(VC.MAIL).digit(100).alphabet().number().sign().kana().validate(this.mail);
      //  エラーメッセージをセットします。
      this.errors = ezMessage.getMessage();
      //   検結果の成否をします。
      return ezMessage.isSuccess();
   }
}


5.SampleAction.javaを開きます。

package jp.co.dsc.sample.list;

import are.trygun.framework.container.servlet.EzRequest;
import are.trygun.framework.container.servlet.EzResponse;
import are.trygun.framework.util.message.EzMessage;

/**
 * <p>SampleFormの画制御(コントロール)をうクラスです</p>
 *
 * @author xxxxx
 * @version 1.00 2010/02/17
 * @since 1.00
 *
 */
public class SampleAction {
   /**
    * <p>SampleFormの初期示求があった場合に呼び出されるメソッドです。</p>
    * @param request リクエスト
    * @param response レスポンス
    * @param sampleForm
    */
   public void index(EzRequest request, EzResponse response, SampleForm sampleForm) {
      //   EzSessionに格納されているBeanを削します。
      request.getSession().removePage();
      //   EzResponseに示するHTMLのBeanをセットします。
      response.to(sampleForm);
   }

   /**
    * <p>「○○」ボタン押下時に呼び出されるメソッドです。</p>
    * @param request リクエスト
    * @param response レスポンス
    * @param sampleForm
    */
   public void doSearch(EzRequest request, EzResponse response, SampleForm sampleForm) {
      //   画入力値をsampleFormにmappingします。
      request.bind(sampleForm);
      //   入力値の検をないます。
      response.continuation(sampleForm.validate());
      //   チェック結果を保持する属性の宣と初期化をないます。
      EzMessage ezMessage = new EzMessage(SampleForm.PROPERTY);

      //   ビジネスロジックを呼び出します(START)

      //   ビジネスロジックを呼び出します(E N D)

      //  EzResponseに示するHTMLのBeanをセットします。
      response.to(sampleForm);
   }


   /**
    * <p>「○○」ボタン押下時に呼び出されるメソッドです。</p>
    * @param request リクエスト
    * @param response レスポンス
    * @param i 択されたボタンのResultクラスのインデックス
    * @param sampleForm
    */
   public void doDetails(EzRequest request, EzResponse response, int i, SampleForm sampleForm)  {
      //   画入力値をsampleFormにmappingします。
      request.bind(sampleForm);
      //   チェック結果を保持する属性の宣と初期化をないます。
      EzMessage ezMessage = new EzMessage(SampleForm.PROPERTY);

      //   ビジネスロジックを呼び出します(START)

      //   ビジネスロジックを呼び出します(E N D)

      //  EzResponseに示するHTMLのBeanをセットします。
      response.to(sampleForm);
   }

   /* TRYGEN_SOURCE_REPLACE_BEGIN */
   /* TRYGEN_SOURCE_REPLACE_FINAL */
}


6.SampleAction.propertiesを開きます。

# --------------------------------------------------
# 「SampleForm」Beanの定
# --------------------------------------------------
# ラベル「サンプル一照会」 
label.title=サンプル一照会
# ラベル「氏名」 
label.name=氏名
# ラベル「ユーザーID」 
label.userid=ユーザーID
# ラベル「メールアドレス」 
label.mail=メールアドレス
# ラベル「住所」 
label.address=住所
# ラベル「検索」 
label.search=検索
# ラベル「細」 
label.details=詳細

各リソースの詳細説明は次回に…(^^;)