Top / Java / Direct Web Remoting(DWR)をつかう

概要

DWR(Direct Web Remoting)とは、J2EEサーバ上のJavaプログラムをJavaScript?から呼び出すためのライブラリです。Ajaxのライブラリと説明される事が多いですが、サーバ上のJavaクラスのメソッドをhttp経由で呼び出せる一種のRPCってかんじです。わかりにくいですが、FlexRemoteObject?と似てますね。あっちはFlashからJavaクラスをリモート呼出しします。こっちはJavaScript?からJavaクラスをリモート呼出しします。

ダウンロード

http://getahead.org/dwr/download よりWARをダウンロードします。

インストール

インストールは

  • ダウンロードしたwar内のjarをWEB-INF/libにコピー
  • web.xmlにブリッジとなるServletを設定
  • dwr.xmlにリモート呼び出ししたいJavaクラスを記述してweb.xmlの隣に配置

ってかんじです。

web.xmlには

 <servlet-name>dwr-invoker</servlet-name>
 <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
 <init-param>
   <param-name>debug</param-name>
   <param-value>true</param-value>
 </init-param>
 <init-param>
     <param-name>activeReverseAjaxEnabled</param-name>
     <param-value>true</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
   <servlet-name>dwr-invoker</servlet-name>
   <url-pattern>/dwr/*</url-pattern>
 </servlet-mapping>

などを追加します。

dwr.xmlには

<dwr>
  <allow>
    <create javascript="HelloWorld" creator="new">
      <param name="class" value="nu.mine.kino.services.HelloWorld" />
    </create>
    <convert converter="bean" match="nu.mine.kino.services.Model"/>
  </allow>
</dwr>

など、JavaScript?から呼び出したいビジネスロジックが書いてあるクラス(HelloWorld?)や、引数や戻り値となるオブジェクト(nu.mine.kino.services.Model)を記述しておきます。このようにしておくと、JSPやHTML内で、

<script type="text/javascript" src="dwr/engine.js"> </script>
<script type="text/javascript" src="dwr/util.js"> </script>
<script type="text/javascript" src="dwr/interface/HelloWorld.js"> </script>
<script type="text/javascript">
function show() {
  var input = dwr.util.getValue("input");
  HelloWorld.sayHello(input,callback);
}

function callback(message){
  dwr.util.setValue("result", message);
}
</script>

などのようにさもJavaScript?すなわちクライアントサイドでJavaクラスを呼ぶような記述でサーバのロジックを呼び出すことができるわけです。

上の例だと

dwr/engine.js
dwr/util.js
dwr/interface/HelloWorld.js

は先のブリッジのサーブレットDwrServlet?が勝手に生成して返してくれます。HelloWorld?.jsはサーバ上のビジネスロジックと同じメソッドが定義されているJavaScript?でクライアント側のプロキシとして動作します。

具体的にやってみる。

サーバ側のロジックを HelloWorld?クラスとしました。

package nu.mine.kino.services;

public class HelloWorld {
    // 引数ナシ
    public String sayHello1() {
        System.out.println("sayHello1()");
        return "Hello";
    }

    // 引数がString、戻り値がString
    public String sayHello(String input) {
        System.out.println("sayHello(input)");
        return "Hello " + input + " .";
    }

    // 引数がString[]
    public String[] sayHellos() {
        System.out.println("sayHellos()");
        return new String[] { "Hello World.", "hello world." };
    }

    // 引数がオブジェクト、戻り値がオブジェクト
    public Model getModel(Model model) {
        System.out.println("getModel()");
        System.out.println(model);
        Child[] children = new Child[] { new Child("child1"),
                new Child("child2") };
        Model model2 = new Model("Hoge", children);
        return model2;
    }

    // 戻り値がオブジェクトの配列
    public Model[] getModels() {
        Model model1 = new Model();
        model1.setName("kino");

        return new Model[] { model1, model1 };
    }

}

引数や返り値としてやりとりするモデルクラスを下記のように定義します。

package nu.mine.kino.services;

public class Model implements IModel {
  private String name;
  private Child[] children;
  // setter/getterは省略
}
package nu.mine.kino.services;

import java.io.Serializable;

public class Child implements IModel, Serializable {
  private String name;
  // setter/getterは省略
}

この記事は

選択肢 投票
おもしろかった 21  
そうでもない 12  

Top / Java / Direct Web Remoting(DWR)をつかう

現在のアクセス:13973


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-26 (金) 15:05:40 (21d)