2010年7月21日星期三

Jquery也玩转远程service的方法调用,同时支持ajax的注解配置

Jquery也玩转远程service的方法调用,同时支持ajax的注解配置: "相信用过国人开发的buffalo框架,都能够体会到它的精简之处,完全隐蔽了servlet和controller直接调用。



不过可惜它的前台dom处理能力实在太弱,相比jquery相差太远,至于jquery对dom的处理能力我就不在细说。正因为之前使用buffalo一段时间,感觉它在前台调用远程service还是比较的方便,所以就想能不能把jquery和buffalo结合起来了,那样不是爽呆了。最好把buffalo的xml配置都用注解来替换,哇塞,那样不是无敌了。



呵呵!经过熟读buffalo的源代码,结合spring强大的注解能力,终于实现以下的应用,在几个项目中运用感觉超爽。好了,闲话少说了,接下来贴一些主要的代码,具体应用通过附件下载源码。



1、web.xml配置ajax的入口servlet




<servlet>
<servlet-name>ajax</servlet-name>
<servlet-class>net.ajax.web.servlet.AjaxApplicationServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ajax</servlet-name>
<url-pattern>/ajax/*</url-pattern>
</servlet-mapping>




2、spring的applicationContext.xml配置注入ajax注解代理工厂bean


<!-- ajax远程调用配置注解 -->
<bean id="ajax" class="net.ajax.annotation.AjaxAnnotationServiceFactoryBean" />




3、通过spring让ajax具有注解注入的能力



先定义个注解接口:


package net.ajax.annotation;

import java.lang.annotation.Annotation;

public interface Ajax
extends Annotation
{

public abstract String value();
}


根据注解初始化ajax注解工厂


public class AjaxAnnotationServiceFactoryBean
implements Ordered, FactoryBean, InitializingBean, DisposableBean, BeanPostProcessor
{

public AjaxAnnotationServiceFactoryBean()
{
ajaxConfigurer = null;
log.debug("init constructor");
ajaxConfigurer = new AjaxServiceConfigurer();
ajaxConfigurer.setServices(new HashMap());
}

private void addBuffaloBean(String ajaxServiceName, Object bean)
{
ajaxConfigurer.getServices().put(ajaxServiceName, bean);
log.info((new StringBuilder("Add a ajax service :")).append(ajaxServiceName).toString());
}

private boolean isExcludedClass(String className)
{
if(excludedClassesRegexPatterns == null)
return false;
String as[];
int j = (as = excludedClassesRegexPatterns).length;
for(int i = 0; i < j; i++)
{
String regex = as[i];
Pattern pattern = Pattern.compile(regex);
if(pattern.matcher(className).find())
return true;
}

return false;
}

public void setExcludedClassesRegexPatterns(String excludedClassesRegexPatterns[])
{
this.excludedClassesRegexPatterns = excludedClassesRegexPatterns;
}

public Object getObject()
throws Exception
{
return ajaxConfigurer;
}

public Class getObjectType()
{
return net/ajax/service/AjaxServiceConfigurer;
}

public boolean isSingleton()
{
return true;
}

public void afterPropertiesSet()
throws Exception
{
}

public void destroy()
throws Exception
{
if(ajaxConfigurer != null)
ajaxConfigurer.setServices(null);
ajaxConfigurer = null;
}

public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException
{
return bean;
}

public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException
{
if(bean.getClass().isAnnotationPresent(net/ajax/annotation/Ajax))
{
log.debug((new StringBuilder("find a ajax bean:")).append(beanName).toString());
Ajax ajax = (Ajax)bean.getClass().getAnnotation(net/ajax/annotation/Ajax);
addBuffaloBean(ajax.value(), beanName);
}
return bean;
}

public int getOrder()
{
return 1000;
}

private static final Logger log = Logger.getLogger(net/ajax/annotation/AjaxAnnotationServiceFactoryBean);
public AjaxServiceConfigurer ajaxConfigurer;
private String excludedClassesRegexPatterns[];

}




4、远程service类


@Service
@Ajax("remoteHandleService")
public class RemoteHandleService {
/**
* log4j 记录器
*/
private static final Logger log = Logger
.getLogger(RemoteHandleService.class);

/**
* 有参数传入
* @param m
* @return
*/
public Map<String, String> getMapInfo(Map<String, String> m) {
log.info("参数name的值:" + m.get("name") + ",密码为:" + m.get("password"));
Map<String, String> map = new HashMap<String, String>();
map.put("name", "张三");
map.put("sex", "男");
map.put("age", "25");
return map;
}

/**
* 无参数传入
*
* @return
*/
public String getStringInfo() {
return "操作成功";
}




5、前台jquery调用远程service方法




// ajax调用
$(document).ready(function() {

/**
* ajax直接调用远程service方法
*
* 方法传入参数只能是数组(比如:[{a:a,b:b..},{}...])或者json格式(不如:{a:a,b:b})
*/
$('#ajax').click(function() {
var json = {
name : '李四',
password : '123456'
};
// $.remoteCall('remoteHandleService.getStringInfo', {},
// function(data){
// alert(data);
// });
$.remoteCall('remoteHandleService.getMapInfo', json, function(
data) {
var str = '';
for (var i in data)
str += i + ':' + data[i] + ' ';
alert('服务器返回的信息为:' + str);
});
});
});




其中remoteHandleService.getStringInfo的调用基本是模仿的buffalo的封装,拼装url直接提交到我们在web.xml配置的AjaxApplicationServlet去处理,最终通过反射调用remoteHandleService类的getStringInfo方法,获取返回值封装成json对象返回。这个里面唯一和buffalo的区别就是buffalo采用的bulap协议,而我这边的封装是直接json。具体的处理大家看源代码吧。





好了收工,以上就是整个应用的简要说明,感兴趣可以下载附件,不过看完之后还是希望继续更贴。呵呵!















作者: ibadboy


声明: 本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!




已有 0 人发表回复,猛击->>这里<<-参与讨论





JavaEye推荐






"

没有评论:

发表评论