DWRでjavascriptからjavaにObjectを渡す方法
今日バイトでやったことをまとめる。DWRでクライアント(javascript)からサーバー(java)にJavaオブジェクトを渡す方法が分からなかった。オブジェクトを渡すていってもフィールド値をもったクラスのことで、値がjava側に行ってくれればいい。でまず考えたのは以下の3つぐらいで、
- JSONで渡してjava側でクラスにデコードする
- javascriptで連想配列で渡してjava側でクラスのフィールドに詰めなおす
- javascriptで配列かなんかで渡したものがjava側でオブジェクトで受け取れないか
まず、1と2を考えやってみたけどうまくいかず、もっと調べたら3ができることが分かった.
javascriptでjavaフィールド名と同じ名前で連想配列を作ってjavaに渡せばオブジェクトを生成してくれる。
(例)
ajax通信で通るオブジェクトはconvertにすべて定義しておく。ここでconverter値はJavaBeanの場合は"bean"、それ以外は"object"としておくこと。またprivateフィールドにアクセスした場合はparamを"true"にしておく。
- サーバー(javascript)
渡したいオブジェクト(ここではTestBean)と同じ名前で連想配列を作ってDWRで渡す。
var feeld = {name:'taizou',from:'japan',age:'23',stay:'tokyo'}
Test.getProfile(feeld , function( beck_data ){
//beck_dataでなにかやる
});
- クライアント(javascript)
渡したい対象物。
class TestBean{
private String name;
private String from;
private int age;
private String stay;
////各自のプログラムを書く
}
サーバー側の処理。
class DWRTest{
public Object getProfile( TestBean bean ){
/////受け取ったbeanでなにかする
}
}
てかこんなことがDWRでできないんだったら使う意味がないか。DWRでは連想配列はクラスとみなしてコンバートしてくれるらしく,JSONを渡すと区別がつかないのかな?
javascriptでは下の2つたとも連想配列だが、2番目の連想配列はJSON形式にもなる。
{name:"taizou",from:"japan",age:"23",stay:"tokyo"}
{"name":"taizou","from":"japan","age":"23","stay":"tokyo"}
ここれ辺がjava側でJSONがデコードできなかった原因かもしれない。(単にJSONICの使い方が間違ってるのかも。。。。)
(参考サイト)
DWRでリッチなWebページを作る!(5) - 引数と戻り値にJavaBean以外のクラスを使用する