最近接手了一个GWT的小项目,于是对GWT语言做了一些深入了解,GWT是采用java语言编码,通过编译转化为Javascript语言在浏览器中运行,做出来的效果很简洁,框架结构。
GWT的最重要的功能应属他的RPC调用机制,是Ajax技术的扩展,它包括三个部分:远程接口,服务器实现,异步接口文件。
1.远程接口需要继承RemoteService接口,然后在这个接口上添加Java注记(@RemoteServiceRelativePath(“url”)),这个注记的参数指明实现这个接口的Servlet的URL路径,在浏览器端,GWT使用延迟绑定创建这个接口的实现类。
2.GWT-RPC是基于Servlet实现的,在服务器端我们要实现RPC的接口类,并派生于com.google.gwt.user.server.rpc.RemoteServiceServlet类,这个类由GWT提供,派生于HttpServlet类。当浏览器端请求这个Servlet时,它会反射自身,查找实现了客户请求的函数,将浏览器端的请求反序列化并调用找到的函数。函数执行完成后,它将返回值序列化后传递给浏览器端。服务端的实现就是这样的Servlet具体实现远程接口的方法。
3.我们需要通过异步的方式调用浏览器端的远程接口,于是就需要定义一个远程接口的异步版本,远程接口和异步版本放在同一个包中。并且接口名必须为[接口名]Async。RPC接口中每一个函数都需要定义一个相对应的异步函数,异步函数的返回值为null,同时在增加一个额外的AsyncCallback<?>参数,AsyncCallback<?>是泛型类,泛型参数为RPC函数的返回值类型。
举个例子具体说明三个部分是如何整合的
EmployeeService(远程接口)
@RemoteServiceRelativePath("employeeService")
public interface EmployeeService extends RemoteService{
public Boolean checkSex(String sex);
}
/****************
EmployeeServiceAsync(异步接口文件)
public interface EmployeeServiceAnsyc {
public void checkSex(String sex,AsyncCallBack<Boolean> callback);
}
/****************
EmployeeServiceImpl(服务器实现)
public class EmployeeServiceImpl extends RemoteServiceServlet implements EmployeeService{
public Boolean checkSex(String sex){
if("man".equals(sex)){return true;}
else{return false;}
}
}
在web.xml中对Servlet 添加
<servlet>
<servlet-name>emploeeService</servlet>
<servlet-class>com.gwt.server.service.EmployeeServiceImpl</servlet-class>
</servlet>.........
在浏览器端调用的时候,代码如下:
//获取EmployeeServiceAsync对象
EmployeeServiceAsync employeeService = (EmployeeServiceAsync)GWT.create(EmployeeService.class);
//设定ServiceEntryPoint的URL
ServiceDefTarget target = (ServiceDefTarget)employeeService;
target.setServiceEntryPoint(GWT.getModuleBaseURL()+"employeeService.gwt");
employeeService.checkSex("man",new AsyncCallback<Boolean>(){
@Override
public void onFailure(Throwable caught){
//失败
Window.alert("Failed to get response from server :/n"+caught.getMessage());
}
@Override
public void onSuccess(Boolean result){
if(result){
Window.alert("check Sex success ;it is man ! ");
}else{Window.alert("check Sex success ;it is woman ! ");}
}
});
其它内容:
GWT基本控件 http://examples.roughian.com/index.htm#Home
GWT官方文档 http://code.google.com/intl/zh-CN/webtoolkit/
其它GWT开发相关文章
http://www.javaeye.com/topic/128194