buffalo是国内的michal chen所写的一个AJAX远程调用框架,目前版本是1.2.2。知道这东西是从我开始收集有关AJAX的相关资料时从JAVAEYE上看到了推荐,再怎么说也是国产架构,看demo感觉很不错,就下来了开始学学。
Buffalo使用burlap协议。因此Buffalo解析大数据量可能会比较慢,然而可以适用于多种服务器端和客户端,并且burlap协议的完整性和支持的数据类型更加丰富
Buffalo基于prototype,如果你的AJAX应用也是基于prototype,那么可以减少重复加载prototype的带宽,并且获得相当一致的编程概念,而且易学易用。
以上是javaeye给出的推荐理由,我这两天的接触也证明burlap协议确实封装的很好。至于prototype.js,因我对于JS的使用经验有限,不敢妄谈。目前版本的buffalo可以集成spring,这一开始就很吸引我,我们可以搭建一个控制器放在客户端的应用了?(我称它为消失的“控制器”)我们可以把所有的业务逻辑封装在spring组合起来的业务层中,暴露需要远程调用的“服务”给客户端,我们不再需要什么控制器,我们的AJAX引擎起到了同样的作用。那就试试吧, let's go!
1。login.jsp,简单的登陆界面
var springEndPoint=" /remoting/Spring-buffalo";
var buffalo = new Buffalo(springEndPoint);
function doSubmit() {
var name=Buffalo.getElementById("name").value;
var password=Buffalo.getElementById("password").value;
buffalo.remoteCall("userService.login", [name,password], function(reply){
$("form_infomsg").innerHTML=reply.getResult();
})
}
Form demos
//remoting-servlet.xml
你可以把remoting-servlet.xml理解成一个映射文件,客户端通过这来寻找所需要的服务,我们已经在这里注册了服务userService,引用到的javabean的ID为userService
最后一个配置文件:spring的applicationContext.xml
应用所有用到的业务对象都在这里进行组装.
3.JavaBean AND service
接下来,让我们看看UserService这个类,它实现了一个远程调用服务,为了获得HttpSession,它必须继承自BuffaloService(从这个角度看,想实现干净的,完全脱离servlet的框架很难).
/*
* 创建日期 2006-3-23
*
*
*
*/
package com.denny_blue.rhino.service;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import net.buffalo.server.BuffaloService;
import com.denny_blue.rhino.bean.UserBean;
/**
* @author dennis
*
*
*
*/
public class UserService extends BuffaloService{
DataSource dataSource;
public void setDataSource(DataSource dataSource){
this.dataSource=dataSource;
}
public DataSource getDataSource(){
return dataSource;
}
private UserBean getUser(String name){
final UserBean user=new UserBean();
JdbcTemplate jt=new JdbcTemplate(dataSource);
jt.query("select * from rh_user where name=/'"+name+"/'",
new RowCallbackHandler(){
public void processRow(ResultSet rs)throws SQLException{
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
}
}
);
// System.out.println(user.getName()+user.getPassword());
return user;
}
public String login(String name,String password){
UserBean user=getUser(name);
if(user.getName()==null||user.getName().equals(""))
return "用户名错误!!!";
System.out.println(user.getName()+" "+name);
HttpServletRequest request=(HttpServletRequest)getRequest();
HttpSession session=request.getSession();
if(user.getName()!=null&&user.getPassword()!=null&&
!user.getName().equals("")&&!user.getPassword().equals("")){
if((user.getName()).equals(name)&&(user.getPassword()).equals(password)){
session.setAttribute(Constants.USER_KEY,user);
System.out.println("Session Binding.....");
session.setMaxInactiveInterval(100);
return "登陆成功!!";
}
else
return "密码错误,登陆失败!!";
}
return "登陆失败";
}
}
UserBean.java
/*
* 创建日期 2006-3-21
*
*
*
*/
package com.denny_blue.rhino.bean;
/**
* @author dennis
*
*
*
*/
public class UserBean {
private int id;
private String name;
private String password;
//constructor
public UserBean(){}
public UserBean(int id,String name,String password){
this.id=id;
this.name=name;
this.password=password;
}
//getter setter
public void setId(int id){
this.id=id;
}
public int getId(){
return id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setPassword(String password){
this.password=password;
}
public String getPassword(){
return password;
}
}
业务逻辑很简单,查询数据库,进行密码核对,返回登陆成功或者失败的字符串给客户端,登陆成功记录session.要想运行这个例子,必须建立数据库(你可以根据spring配置文件进行相应修改).
看到了吗?我们只需要spring提供服务接口,然后在客户端利用buffalo进行调用,这中间的一切buffalo已经为我们省略了。
在做这个简单例子的时候也遇到过两个问题,不知道是不是版本更迭导致的.一个是如果想使用spring,我的页面只能引入buffalo-1.1.js,新版的好象路径有错误.UserService继承BuffaloService,是旧版本server包中的,我使用1.2的新版本反而不能成功,不知道为何,待我看看源代码再谈.