前两天,上了EXT官方网站,查找一些关于direct方面的里面,上面只是讲了PHP得应用,关于JAVA的应用,少之又少。一些朋友也提问了,怎么用JSP调用?结果:i don't know。哎,既然在官方没有,那么我想在GG,百度多多少少都有点资料,查找资料花了两天,终于找到一个比较好的办法。只是他没有具体的工程,没办法了。这就要靠自己实践。好。就这样又花了两天,今天,嘻嘻,被我瞎弄,搞出来了,虽然很多东西都不知道为什么,但是还是比较开心*^_^*。废话说了不少,言归正传!
下面是具体的工程步骤:(说明一下,我的客户端是CS,服务端是BS)
首先,我们来搭建WEB服务端的程序:
这时,我们需要下载一个JAR。名为extdirect4j-0[1].3.1-source.jar,目前是最新版吧。因为这个包用到GG一些办法,那么,我们还需要下载gson-1.3.jar。保证没有错误啦。
接下来,这些写一个继承ExtDirectRouter的类,如下面:
package com; import ch.swissdotnet.extdirect4j.AnnotatedAction; import ch.swissdotnet.extdirect4j.ExtDirectRouter; import ch.swissdotnet.extdirect4j.ExtRemoteAction; import ch.swissdotnet.extdirect4j.ExtRemoteMethod; import ch.swissdotnet.extdirect4j.NamedAction; public class MyExtDirectRouter extends ExtDirectRouter { static public class Result { private Long result; private String msg; public Result(Long result, String msg) { this.result = result; this.msg = msg; } } static abstract public class AbstractAction { abstract Long multy(long a, long b); @ExtRemoteMethod(name = "multy1") public Long multy(int a, long b) { return -a * b; } } @ExtRemoteAction(name = "Action", lazyInit = true) static public class TestAction extends AbstractAction { @ExtRemoteMethod public Long multy(long a, long b) { return a * b; } @ExtRemoteMethod(name = "multy2") public Long multy(int a, long b) { return a * b; } @ExtRemoteMethod public Result multy(long a) { return new Result(a * 2, "just a result"); } @ExtRemoteMethod public String sayHello(String value){ return "Hello, "+value; } @ExtRemoteMethod public String getTree(String value){ System.out.println("被调到了"); return "[{"+ "'id':10,"+ "'leaf':false,"+ "'children':[{"+ "'id':11,"+ "'leaf':true,"+ "'children':null,"+ "'text':'S600'"+ "},{"+ "'id':12,"+ "'leaf':true,"+ "'children':null,"+ "'text':'SLK200'"+ "}],"+ "'text':'Benz'"+ "}]"; /*return "text:'Online',"+ "children:[{"+ "text:'Friends',"+ "expanded:true,"+ "children:[{"+ "text:'Jack',"+ "iconCls:'user',"+ "leaf:true"+ "}]"+ "}]";*/ } } @Override protected void configureActions() { this.addAction(new AnnotatedAction(TestAction.class)); //OK //or so.. this.addAction(new AnnotatedAction("com.test.ExtdirectServlet$TestAction")); //OK //or another else way in case we have not an access to action class in compile time //but it is less scaled and has some restrictions this.addAction(new NamedAction("com.test.ExtdirectServlet$TestAction") .addMethod("multy", 1) // OK .addMethod("multy", 2)); //error there is 2 methods called "multy" with 2 arguments; } }
这个类是我偷来的,修改了一下,变成自己的啦。实际上修改,我只是在上面添加了一些办法,比如,我添加了sayHello、getTree的办法。好了,服务端的工程算是建立起来,那么,我们需要测试一下。怎么测?请各位看官耐心看下去咯。
测试办法:主要是测试我们自定义的类。因为ExtDirectRouter是一个继承了HttpServlet,那么MyExtDirectRouter 也算是一个Servlet。那么我们找到WEB文件,找出它的映射地址:比如
<servlet-mapping> <servlet-name>MyExtDirectRouter</servlet-name> <url-pattern>/remote/*</url-pattern> </servlet-mapping>
我们用浏览器打开该Servlet。我的地址为:http://127.0.0.1:8781/test/remote/MyExtDirectRouter.看你的网页显示什么。如果是
Ext.app.MY_REMOTING_API = {"url":"remote/","type":"remoting","actions":{"Action":[{"name":"getTree","len":1},{"name":"multy","len":2},{"name":"multy","len":1},{"name":"multy2","len":2},{"name":"sayHello","len":1},{"name":"multy1","len":2}]}};
恭喜你,你已经成功啦。不行的朋友,回头在跟它死过,还是不行,记得不要找我哦,呵呵,开玩笑的~~
结尾:服务端到此为止。
补充服务端说明:在提交数据到客户端的时候,有可能遇到中文乱码问题,不怕,我们的MyExtDirectRouter是一个Servlet,在它的父类(ExtDirectRouter)里面,有doPost、doGet的办法,主要在这两个办法里面添加
response.setContentType("text/json; charset=utf-8");
编码和数据格式,各位看官自己选择。
客户端的实现:
实现给个效果图,如下: