まずは、DWRのサイトからjarファイルをダウンロードし、/WEB-INF/lib フォルダへ配置してクラスパスを通す。
/WEB-INF/web.xml
<servlet>
<display-name>DWR Servlet</display-name>
<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>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
まずは、DWR Servletのweb.xmlへの設定。
/dwr/* で来たリクエストを同Servletが受けるように設定する。
/WEB-INF/dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://getahead.org/dwr/dwr20.dtd">
<dwr>
<init>
<creator id="s2creator" class="packagename.S2Creator" />
</init>
<allow>
<create creator="s2creator" javascript="ajaxService">
<param name="serviceName" value="ajaxService"/>
</create>
</allow>
</dwr>
指定したCreatorクラスが、Seasar2が管理しているServiceクラスを返すように定義する。
<init>では、creator の id (任意)と class属性は対象クラス名を指定する。
<param>では、S2Creator.javaクラスでDIする name(setterでセットするプロパティ名)とvalue(class名)を指定する。
S2Creator.java
package packagename.creator;
import org.directwebremoting.create.AbstractCreator;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
public class S2Creator extends AbstractCreator {
private String serviceName;
@Override
public Object getInstance() throws InstantiationException {
return SingletonS2ContainerFactory
.getContainer()
.getComponent(serviceName);
}
@Override
public Class<?> getType() {
return SingletonS2ContainerFactory
.getContainer()
.getComponentDef(serviceName)
.getComponentClass();
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
}
dwr.xmlで指定したサービス名で、コンテナからserviceクラスを返す。
AjaxService.java
package packagename.service;
public interface AjaxService {
/**
* @param name
* @return
*/
String hello(String name);
}
実際のServiceが定義されたインタフェースクラス。
AjaxServiceImpl.java
package packagename.service.impl;
import package.name.service.AjaxService;
public class AjaxServiceImpl implements AjaxService {
@Override
public String hello(String name) {
return "Hello " + name + "!!!";
}
}
実際のサーバ処理を行うServiceクラス
index.jsp
<script src="/dwr/interface/ajaxService.js" type="text/javascript"></script>
<script src="/dwr/engine.js" type="text/javascript"></script>
<script src="/dwr/util.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
ajaxService.hello("AJAX", callBack);
});
function callBack(value){
alert(value);
}
</script>
JSP(HTML)で、サーバ側に自動生成されるjsファイルの場所を定義する。
/dwr/interface/ajaxService.js
/dwr/engine.js
/dwr/util.js
dwr.xml で定義したJavaScript名でメソッドを呼べる。
この場合、第1引数は、サーバへのパラメータで、第2引数は非同期でコールバックされるJavascriptの関数名を指定する。
おそらくこれで動作するはずである。
難しく考えていたが、設定が終わればかなり簡単にAjax通信ができるようになる。
DWRの詳細はこちら(DWR)を参照してください。