前回は引数と戻り値に指定された基本的な型のデータがJavaScriptのどのデータ型に対応して変換されるかを説明しました。今回は、引数と戻り値にJavaBeanを使用する方法を紹介します。
Webアプリケーションを開発する際に、DBのレコードの情報持つJavaBeanクラスを定義することがよくあります。DWRでは、そのようなケースに作成したJavaBeanクラスを引数と戻り値のデータ型として使用することが出来ます。今回はユーザ情報を登録する画面と登録したユーザ情報を参照する画面を持つWebアプリケーションを用いて、その方法を紹介していきます。登録されるユーザ情報はDBではなく、セッション中のMapに保存します。以下がWebアプリケーションの画面です。

「ID」「姓」「名」を入力して送信ボタンをクリックすると、「登録しました!」というメッセージがダイアログに表示されます。ユーザを登録したらリンクから「ユーザ情報画面」に遷移します。

「ID」のテキストボックスに登録画面で登録したユーザのIDを入力して、テキストボックスからフォーカスを外すと、「姓」と「名」にそのIDのユーザの姓と名が表示されます。
それではまず、JavaBeanのコードから見ていきます。
「UserBean.java」
package myajax;
public class UserBean {
private String id = null;
private String lastname = null;
private String firstname = null;
public String getId()
{
return id;
}
public void setId(String id)
{
this.id =id;
}
public String getLastname()
{
return lastname;
}
public void setLastname(String lastname)
{
this.lastname = lastname;
}
public String getFirstname()
{
return firstname;
}
public void setFirstname(String firstname)
{
this.firstname = firstname;
}
}
BeanのクラスはBeanConverterによりJavaScriptの連想配列に変換され、Beanのプロパティ名が連想配列の添え字になります。プロパティはJavaBeansの仕様に従ってセッターとゲッターを持つ必要があります。ゲッターは「get」の後ろにプロパティの先頭の文字を大文字にした文字列を足したものをメソッド名とし、プロパティの型と同じ型の戻り値を持ちます。セッターは「set」の後ろにプロパティの先頭の文字を大文字にした文字列を足したものをメソッド名とし、プロパティの型と同じ型の引数を1つもっている必要があります。次に処理クラスをみてみます。
「User.java」
package myajax;
import java.util.HashMap;
import java.util.Map;
public class User {
private Map userMap = null;
public User()
{
userMap = new HashMap();
}
public void addUser(UserBean userBean)
{
userMap.put(userBean.getId(), userBean);
}
public UserBean getUser(String id)
{
return userMap.get(id);
}
}
ユーザ情報はMapに保存しています。登録用のメソッドの引数と、ユーザ情報の取得用メソッドの戻り値に「UserBean」を指定しています。次に「dwr.xml」に設定を追加します。
「dwr.xml」
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="User" scope="session">
<param name="class" value="myajax.User" />
</create>
<convert match="myajax.UserBean" converter="bean"/>
</allow>
</dwr>
createタグに前回までのサンプルでは無かった「scope」という属性が追加されています。これは、「myajax.User」クラスのインスタンスの生存期間を指定するものです。「scope」に指定できる値は、「application」、「session」、「page」、「request」そして、「script」の5つになります。※「script」はDWR2.0から指定可能です。前の4つに関しては、Servlet APIと同じです。ただし、DWRでは「page」と「request」実質的には同じで、いずれも1回のリクエストを処理する間が生存期間になります。「script」はDWR独自の生存期間で、Webページ全体が再表示されない限り、インスタンスは生存し続けます。これはページが参照している「engine.js」に埋め込まれているページのIDにより、実現されています。今回のサンプルではページが2つあり、その2つのページで情報を共有する必要があるため、「session」を指定しています。
convertタグは、作成したBeanクラスをBeanConverterにより、変換処理をさせるために必要な記述です。converter属性には「bean」を指定します。しつこいようですが、これは、コンバーターとして、BeanConverterを使用するという意味です。match属性には変換を行う対処のBeanクラスを指定します。「myajax.*」のようにワイルドカードを指定することも可能です。引数、または戻り値にJavaBeanを使用する場合はconvertタグが指定しないとうまく動作しません。
「userinput.html」
<script type='text/javascript' src='dwr/interface/User.js'></script>
<script type="text/javascript"><!--
function addUser() {
var user = { id : dwr.util.getValue("id"),lastname : dwr.util.getValue("lastname"),
firstname : dwr.util.getValue("firstname") };
User.addUser(user, function(){
alert('登録しました!');
});
}
// --></script>
上記は登録画面のHTMLソースです。JavaBeanはJavaScriptの中では、連想配列を使って記述します。連想配列の添え字がBeanクラスのプロパティ名と対応します。ここでは、dwr.util.getValue()によって取得したテキストボックスの値をBeanのプロパティ名を添え字にして、配列に設定しています。上記のサンプルは以下のように記述しても動作します。
var user = new Object();
user['id'] = dwr.util.getValue("id");
user['lastname'] = dwr.util.getValue("lastname");
user['firstname'] = dwr.util.getValue("firstname");
最後に参照する側のHTMLソースを紹介します。
「userinfo.html」
<script type="text/javascript"><!--
function getUser()
{
User.getUser(dwr.util.getValue("id"),function(bean){
if(bean != null)
{
dwr.util.setValue("id", bean.id);
dwr.util.setValue("lastname", bean.lastname);
dwr.util.setValue("firstname", bean.firstname);
}
else
{
alert('指定されたIDのユーザは登録されていません!');
dwr.util.setValue("lastname", '');
dwr.util.setValue("firstname", '');
}
});
}
// --></script>
getUser()関数は、IDのテキストボックスからフォーカスが外れた場合のイベントハンドラ「onBlur」を処理させています。「bean.id」のようにして連想配列からプロパティを取得しそれを、dwr.util.setValue()で画面に設定しています。これはbean['id']と記述することも可能です。
次回はJavaBean以外の自作クラスを引数と戻り値に使用する方法を紹介します。
ちょっと一休み. Javaキーワード並び替えゲーム
画面に表示される文字列を並び替えるとJavaに関連するキーワードになります。ヒントをたよりに並び替えを行ってエンターを押してください。
ユーザ登録をしてログインするとランキングに参加できます。