`
larlf
  • 浏览: 105639 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

来看看我新发明的车轮子

阅读更多
AJAX技术得到广泛的应用,相关的架构也泛滥成灾,再有人提起新的AJAX架构,相信有另外很多人会不屑一顾——看哦,又一个在重复发明车轮子的人。

其实也谈不上重复发明,XMLHttpRequest、JSON、Annotation这些技术都是现成的,它们之间有各种不同的组合应用的方法。我只是希望能按新的思路,组合出一个架构来以简单的方式应用在我的项目中。

以下是其中一些比较有代表性的代码,不知道是否能够吸引你?

一、使用Annotation标记以AJAX方式调用的方法

业务对象中的方法如果想暴露在Ajax调用的范围内,可以如下方式说明:

	@Ajax
	static public int length(String[] a)
	{
		return a.length;
	}


在@Ajax上还可以指定调用方法的方式,默认的是新建一个对象调用,当前还支持以静态方式调用和采用对象池的方式,如:

	@Ajax(type=Ajax.RunType.POOL)


二、在页面中以“类名.js”的方式进行引用

	<SCRIPT LANGUAGE="JavaScript">
		$include("ajax/com.opesoft.fw.ajax.TestBO.js");
	</SCRIPT>


其实这个语句就相当于

	<script type="text/javascript" src="/ajax/com.opesoft.fw.ajax.TestBO.js" /></script>


直接用引用的URL对应到要访问的类上,省去了配置文件(约定取代配置,呵呵,借用了一下思路)。

三、JS里的同一方法支持同步和异步两种方式

标准的AJAX当然应该是异步来进行同后台数据交换的,但是相信很多程序,特别是需要应用到旧的系统框架中的程序还是用返回值的方式处理起来更为舒服。在本架构中生成的JS方法可以根据传入的参数不同,以两种不同的方式进行调用。

同步方式:
var num=TestBO.add(5,7);


异步方式:

function show(data,args)
{
	……
}

TestBO.add(5,7,show,'需要传递的信息');


前两个参数对应的是Java方法中的参数,第三个参数是回调函数,如果没有的指定这个参数的话,就认为是同步方式调用。

第四个参数:args存在的理由是:有时我们经常希望能把当前一些状态传入到回调函数中去,这里就可以把这些值放在这个参数里,它们作为第二个参数传给从后台获取数据结束后调用的方法。

四、强大的对象转换

数据传递部分是在JSON的基础上进行了一些封装,能支持调用Java端方法的参数是比较复杂的类型或Bean对象。如传递一个字符串的数组:

TestBO.length(new Array('a','b','c'))


如果参数是一个Java对象,JS端代码:

var user=JavaClass("com.opesoft.fw.core.utils.User");
//其实这句在这里可以简单地写成:var user={};
user.name="Larlf.Wang";
TestBO.getName(user);


数据对象的结构可以在JSON<>Java中相互转换,具体思路可以参见我Blog中的文章:http://larlf.iteye.com/blog/88983

在附件中是一个简单的演示,解压到Tomcat5.5下就可以看到了。

今年流行大奔的轮子,不巧的是我们家只有一辆自行车,那我是否就要找个大奔的轮子套上捌捌扭扭地骑着?我还是认为适合自己的才是最好的,这也许就是为什么总有人重复发明车轮子的原因。
分享到:
评论
6 楼 fkpwolf 2007-10-30  
Annotation的想法倒是不错
个人觉得可以借鉴EJB 3里面的一些方法
5 楼 dengyin2000 2007-10-27  
larlf 写道
开发中就参考了DWR、JSON-RPC等AJAX架构,自觉相比还是有点区别的。文中说的很明白,技术上的确没有什么新的东西,实现功能的代码也不会是从头写的,只是想以一种更简洁的方式在项目中进行应用。

比如说JSON-RPC,我就不太喜欢它这样的使用方式:

<jsp:useBean id="JSONRPCBridge" scope="session"
     class="com.metaparadigm.jsonrpc.JSONRPCBridge" />
<jsp:useBean id="hello" scope="session"
     class="com.metaparadigm.jsonrpc.test.Hello" />
<% JSONRPCBridge.registerObject("hello", hello); %>


我们在项目中整合了jsonrpc 和  spring(在一个filter中初始化)。 根本就不需要这个。  我们用的不是jsp。
4 楼 fyting 2007-10-27  
我晕啊,没看仔细,还以为是纯客户端的js程序,还在想annotation如何实现出来,就是这个: @Ajax
3 楼 birdjavaeye 2007-10-25  
看了你blog中的bean与json的转换,没有看源码,提一个重要问题,不知你怎么处理的
BeanA a = new BeanA();
BeanB b = new BeanB();
a.setWife(b);
b.setHusband(a);

这样的情况类似hibernate中的many to one以及双向关联,要能正确处理:
BeanA a2 = (BeanA)JsonUtils.json2Object
    (JsonUtils.object2JsonString(a));  
assertSame(a2, a2.getWife().getHusband());  

如果采用JSON作字符串格式,这方面相当不好处理
你可以看一下Objot、PHPRPC、Buffalo的源码,都抛弃了JSON,才能快速方便地处理这种情况

当然不处理也可以,就是限制了能传输的数据格式,而且写@Ajax方法时要特别小心不能返回这样的bean
2 楼 larlf 2007-10-25  
开发中就参考了DWR、JSON-RPC等AJAX架构,自觉相比还是有点区别的。文中说的很明白,技术上的确没有什么新的东西,实现功能的代码也不会是从头写的,只是想以一种更简洁的方式在项目中进行应用。

比如说JSON-RPC,我就不太喜欢它这样的使用方式:

<jsp:useBean id="JSONRPCBridge" scope="session"
     class="com.metaparadigm.jsonrpc.JSONRPCBridge" />
<jsp:useBean id="hello" scope="session"
     class="com.metaparadigm.jsonrpc.test.Hello" />
<% JSONRPCBridge.registerObject("hello", hello); %>
1 楼 dengyin2000 2007-10-25  
恩  确实是轮子。 看看JSONRPC-JAVA.

相关推荐

Global site tag (gtag.js) - Google Analytics