第2回「Strutsフレームワークの『枠組み』を学ぶ」で紹介したアクションフォームBeansクラスBeginFormを読まれた方は、「アクションフォームBeansは、単なるプライベート変数とアクセサメソッドの集合ではないのか」と思われたかもしれません。確かに、ただ単にデータの授受だけに限定すれば、アクションフォームBeansは「単なるプライベート変数とアクセサメソッドとの集合」にすぎません。そして、リクエストパラメータさえ決まれば、自動的に生成できてしまうたぐいのものです。「このようなものに」人間の手をいちいち煩わせなければならないのはナンセンスですし、人間の手を介することでかえって間違いや不整合を引き起こすもとにもなります。
そこで、Struts1.1から導入されたのが、DynaActionFormの概念です。DynaActionFormを利用することで、コンフィグレーションファイルに一連のリクエストパラメータ名とデータ型を定義するだけで、リクエストパラメータの定義をいちいちアクションフォームBeansクラスとして記述する必要がなくなります。
以下では、前回ご紹介したグリッド表内から個別詳細画面にリンクする際に引き渡されるリクエストパラメータ(クエリ情報"isbn")をDynaActionFormで定義してみることにしましょう。
struts-config.xml |
<?xml version="1.0" encoding="Shift_JIS" ?> |
実に単純だとは思いませんか。DynaActionFormを使用する場合の一般的な構文は、以下のとおりです。
<form-bean name="アクションフォームBeans名" |
DynaActionFormを使用する場合には、<form-bean>要素のtype属性には、固定値として“org.apache.struts.action.DynaActionForm”を指定しています。
<form-property>要素には、DynaActionFormを介して受け渡ししたいリクエストパラメータの値を指定します。<form-bean>要素配下に、パラメータ数に応じて、複数個列記することができます。name属性とtype属性は必須で、type属性に指定可能なデータ型には、各データ型に関する配列(例:String[])、Mapインターフェイスの実装クラス(例:HashMap)、Listインターフェイスの実装クラス(例:ArrayList)などのほか、下表のようなものがあります。
java.lang.BigDecimal | java.lang.BigInteger | boolean(java.lang.Boolean) | |
---|---|---|---|
byte(java.lang.Byte) | char(java.lang.Character) | java.lang.Class | |
double(java.lang.Double) | float(java.lang.Float) | int(java.lang.Integer) | |
long(java.lang.Long) | short(java.lang.Short) | java.lang.String | |
java.sql.Date | java.sql.Time | java.sql.Timestamp | |
また、今回は省略していますが、パラメータに初期値を与えたいという場合には、次のようにinitial属性で指定することも可能です。
<form-property name="isb" type="java.lang.String" initial="X-XXXXX-XX" /> |
配列値を指定する場合は、各要素を「'」で囲み、要素間を「,」で区切ります。initial属性が省略された場合にはnull(数値の場合は0)が初期値として与えられます。また、配列型に対してサイズだけを指定しておきたい場合には、size属性を使用します。
<form-property name="author" type="java.lang.String[]"
size="3" /> |
次に、コンフィグレーションファイルで指定したDynaActionFormの内容を、アクションクラスから引用してみることにしましょう。まずは、具体的なコードを概観してください。
下記のコードは、新規登録・更新・削除の処理を行います。
BookUpdateViewProcess.java (コンパイル結果は「/WEB-INF/classes/struts」に保存) |
package struts; |
書籍情報一覧のコードは、前回作成したものに対して以下のように追記を行っています。
BookInfo.java (前回からの追記分のみ。コンパイル結果は「/WEB-INF/classes/struts」に保存) |
package struts; |
大まかなロジックの流れはコード中のコメントを参照していただくとして、ここではDynaActionFormの内容を取得する部分に注目してみることにしましょう。
DynaActionFormの具体的なインスタンス(オブジェクト)を取得するには、executeメソッドの引数として渡されたActionFormクラスfmを、まずDynaBeanクラスにキャスティングしておく必要があります。
DynaBean objFrm=(DynaBean)fm; |
これを行っておかないと、コンフィグレーションファイルで設定した個別のプロパティにアクセスすることができないので注意が必要です。DynaBeanは、org.apache.commons.beanutilsパッケージであらかじめ用意されたプロパティを動的に取得するための汎用クラスです。
キャスティングによってDynaBeanオブジェクトを取得したら、後はgetメソッドで個別のプロパティにアクセスすることができます。ただし、getメソッドの戻り値型はObjectクラスです。使用する際は、必ず事前に適切な型にキャスティングしておくのを忘れないようにしてください。
(String)(objFrm.get("isbn")) |
Copyright © ITmedia, Inc. All Rights Reserved.