前回は引数と戻り値にJavaBeanを使用するサンプルを紹介しました。JavaBeanを使用してデータを扱う方法は広く一般的になっていますが、全てのプロパティにゲッターとセッターを用意する必要が有るため、コーディングの量が増えてしまいます。DWRでは一般クラスのインスタンス変数をJavaScriptの連想配列に変換する仕組みが提供されています。今回はそのサンプルを紹介していきます。
今回のサンプルに使用するのは、
前回と同じユーザ情報を登録する画面と登録したユーザ情報を参照する画面を持つWebアプリケーションです。まずユーザ情報を持つ「UserData」クラスのソースを紹介します。
「UserData.java」
package myajax.objectconvert;
public class UserData {
public String id = null;
public String lastname = null;
public String firstname = null;
}
UserDataクラスはJavaBeanではないので、セッターとゲッターを用意する必要はありません。次に処理を行うUserクラスのソースをみてみます。
「User.java」
package myajax.objectconvert;
import java.util.HashMap;
import java.util.Map;
public class User {
private Map userMap = null;
public User()
{
userMap = new HashMap();
}
public void addUser(UserData userData)
{
userMap.put(userData.id, userData);
}
public UserData getUser(String id)
{
return userMap.get(id);
}
}
処理を行うクラスは引数と戻り値の型を変えた以外はJavaBeanの場合と変更はありません。そして「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="OUser" scope="session">
<param name="class" value="myajax.objectconvert.User" />
</create>
<convert match="myajax.objectconvert.UserData" converter="object"/>
</allow>
</dwr>
JavaBeanを使用する場合と同じくconvertタグを記述する必要があります。「match」属性の記述方法はJavaBeanの場合と同じでワイルドカードを使用することも可能です。「converter」属性には「object」を指定します。JavaBean以外の一般クラスのコンバートにはObjectConverterというクラスが使用されます。ObjectConverterの内部ではリフレクションの仕組みを使って、変数を操作しています。
また以下のように記述することによってprivateメンバーについてもJavaScriptからアクセスできるようにすることができます。
<convert match="myajax.objectconvert.UserData" converter="object">
<param name="force" value="true"/>
</convert>
JavaSctiptではJavaBeanもJavaBean以外のクラスも連想配列として扱われるので、記述方法は全く同じです。
「userinput.html(Scriptの部分のみ抜粋)」
<script type="text/javascript"><!--
function addUser() {
var user = { id : dwr.util.getValue("id"),lastname : dwr.util.getValue("lastname"),
firstname : dwr.util.getValue("firstname") };
OUser.addUser(user, function(){
alert('登録しました!');
});
}
// --></script>
「userinfo.html(Scriptの部分のみ抜粋)」
<script type="text/javascript"><!--
function getUser()
{
OUser.getUser(dwr.util.getValue("id"),function(data){
if(data != null)
{
dwr.util.setValue("id", data.id);
dwr.util.setValue("lastname", data.lastname);
dwr.util.setValue("firstname", data.firstname);
}
else
{
alert('指定されたIDのユーザは登録されていません!');
dwr.util.setValue("lastname", '');
dwr.util.setValue("firstname", '');
}
});
}
// --></script>
ObjectConveterはコーディングを省略できるという点では非常に便利です。しかし、メソッドに関しては無視をしているようなのでプロパティに何か処理をする必要がある場合は、BeanConverterを利用した方が良いでしょう。また、このコーディングの仕方はカプセル化の観点から多くの現場では嫌がられてしまうかもしれません。
次回は配列を戻り値として使用する方法を紹介します。
ちょっと一休み. Javaキーワード並び替えゲーム
画面に表示される文字列を並び替えるとJavaに関連するキーワードになります。ヒントをたよりに並び替えを行ってエンターを押してください。
ユーザ登録をしてログインするとランキングに参加できます。