2009年7月7日,
ExtJS 3.0
崭新出炉。其中一个重要功能为
Direct
,提供了客户端平滑访问服务器端方法的机制,类似于RPC。
Direct是后端无关的,允许你选择自己喜欢的后端环境,例如Java、.NET、PHP、Ruby、Perl等。
目前在Java环境的后端实现中, DirectJNgine 最为完整。
工作原理及使用方法:
DJN在应用中注册一个Sevlet,所有客户端与服务器端的通信均通过该Sevlet完成。在web.xml中,注意该Sevlet的配置:
其中,apis参数定义了一组提供给客户端的api,每个api都有自己的名字空间、服务器端实现和客户端接口。分成多个api的目的是使不同模块间代码尽量解耦,在客户端,只提供本模块的api,而不是把所有可用的api都暴露给每个页面。
我们首先可以在服务器端创建一个类,例如com.test.MyAction。这个类提供一组RPC方法。
为使用DJN提供的Annotation,应引入包import com.softwarementors.extjs.djn.config.annotations.*;
代码如下:
如客户端和服务器端的api类名相同,则@DirectAction(action="MyTestAction")一句可省略。
每个方法都应用@DirectMethod进行定义,以便让DJN自动完成api的注册。
写好类之后,应在web.xml中找到apis参数,加入新的api:
test,demo, xx
然后配置xx.classes参数,将完整类名加入。在找到xx.apiFile参数,写一个js脚本的文件名xxApi.js。
这样,在初始化Sevlet时,DJN将根据xx.classes加载所有Action类,并自动生成客户端api接口文件(一个js脚本),存放在xx.apiFile参数所指定的位置。
在客户端,只要将xx.apiFile指定的api脚 本包含进来,就可以直接调用其所声明的方法了。
例如:
Direct是后端无关的,允许你选择自己喜欢的后端环境,例如Java、.NET、PHP、Ruby、Perl等。
目前在Java环境的后端实现中, DirectJNgine 最为完整。
工作原理及使用方法:
DJN在应用中注册一个Sevlet,所有客户端与服务器端的通信均通过该Sevlet完成。在web.xml中,注意该Sevlet的配置:
<!-- DirectJNgine servlet -->
<servlet>
<servlet-name>DjnServlet</servlet-name>
<servlet-class>com.softwarementors.extjs.djn.servlet.DirectJNgineServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>providersUrl</param-name>
<param-value>djn/directprovider</param-value>
</init-param>
<init-param>
<param-name>apis</param-name>
<param-value>
test,
demo
</param-value>
</init-param>
<init-param>
<param-name>demo.apiFile</param-name>
<param-value>demo/Api.js</param-value>
</init-param>
<init-param>
<param-name>demo.namespace</param-name>
<param-value>Ext.app</param-value>
</init-param>
<init-param>
<param-name>demo.classes</param-name>
<param-value>
com.softwarementors.extjs.djn.demo.Poll,
com.softwarementors.extjs.djn.demo.TestAction,
com.softwarementors.extjs.djn.demo.Profile,
com.softwarementors.extjs.djn.demo.FormPostDemo,
com.softwarementors.extjs.djn.demo.DirectStoreDemo
</param-value>
</init-param>
<init-param>
<param-name>test.apiFile</param-name>
<param-value>test/DjnTestApi.js</param-value>
</init-param>
<init-param>
<param-name>test.namespace</param-name>
<param-value>DjnTestApi</param-value>
</init-param>
<init-param>
<param-name>test.classes</param-name>
<param-value>
com.softwarementors.extjs.djn.test.ServerMethodParametersReceptionTest,
com.softwarementors.extjs.djn.test.ServerMethodReturnTest,
com.softwarementors.extjs.djn.test.DirectStoreTest,
com.softwarementors.extjs.djn.test.FormSupportTest,
com.softwarementors.extjs.djn.test.FormUploadSupportTest,
com.softwarementors.extjs.djn.test.ManualFormUploadSupportTest,
com.softwarementors.extjs.djn.test.PollTest
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DjnServlet</servlet-name>
<url-pattern>/djn/directprovider/*</url-pattern>
</servlet-mapping>
其中,apis参数定义了一组提供给客户端的api,每个api都有自己的名字空间、服务器端实现和客户端接口。分成多个api的目的是使不同模块间代码尽量解耦,在客户端,只提供本模块的api,而不是把所有可用的api都暴露给每个页面。
我们首先可以在服务器端创建一个类,例如com.test.MyAction。这个类提供一组RPC方法。
为使用DJN提供的Annotation,应引入包import com.softwarementors.extjs.djn.config.annotations.*;
代码如下:
import com.softwarementors.extjs.djn.config.annotations.*;
@DirectAction(action="MyTestAction")
public class TestAction {
@DirectMethod
public void test()
{
System.out.println("--- Here I am");
}
}
如客户端和服务器端的api类名相同,则@DirectAction(action="MyTestAction")一句可省略。
每个方法都应用@DirectMethod进行定义,以便让DJN自动完成api的注册。
写好类之后,应在web.xml中找到apis参数,加入新的api:
test,demo, xx
然后配置xx.classes参数,将完整类名加入。在找到xx.apiFile参数,写一个js脚本的文件名xxApi.js。
这样,在初始化Sevlet时,DJN将根据xx.classes加载所有Action类,并自动生成客户端api接口文件(一个js脚本),存放在xx.apiFile参数所指定的位置。
在客户端,只要将xx.apiFile指定的api脚 本包含进来,就可以直接调用其所声明的方法了。
例如:
<script type="text/javascript" src="xxApi.js"></script>
<script type="text/javascript">
……
buttons: [{
text: "Test",
handler: function(){
MyTestAction.test();
}
}]
……
</script>
ExtJS已经在很多组件中内置支持Direct,甚至连代码都不必写,直接配置一下即可完成数据通信。如此一来,利用ExtJS,配合Direct开发Ajax应用,就变得无比轻松!