服务Service- 本地服务和远程
一、简介
-
Local Service:本地服务
即Service和Client在同一进程内(即同一application内),Service的生命周期服从进程的生命周期。 -
Remote Service:远程服务
即Service作为后台服务,不仅被同一进程内的activity使用,也可被其他进程所使用。 -
RPC:
远程通信有几种选择(RPC,Webservice,RMI,JMS),这里我们说的是RPC(Remote Procedure Call Protocol),RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.methodname”形式。优点是跨语言跨平台,C端、S端有更大的独立性,缺点是不支持对象,无法在编译器检查错误,只能在运行期检查。
二、GWT 本地接口定义及实现
2.1 本地接口定义
/**工厂接口 */
public interface ClientFactory{
public String getAppStr();
}
2.2 本地接口实现
/**工厂接口实现 */
public class ClientFactoryImpl implements ClientFactory{
@Override
public String getAppStr() {
return "HELLO WORLD!";
}
}
2.3 接口配置
gwt.xml中必须配置接口及实现类位置:
<!-- 如果接口与实现类在同一个工程,inherits 可不用配置 -->
<inherits name='com.ezinterface.EZInterface' />
<replace-with class="com.math.client.ClientFactoryImpl ">
<when-type-is class="com.ezinterface.client.ClientFactory"></when-type-is>
</replace-with>
2.4 接口调用
使用GWT.create得到代理类,就可以使用了。传入接口实现,返回接口。
public ClientFactory localService= GWT.create(ClientFactoryImpl .class);
三、GWT RPC 开发
Ajax是谷歌GWT的特色,不使用GWT的ajax功能,就没必要使用GWT。GWT的ajax开发步骤比较复杂。
GWT有两个源代码包,一个客户端包,一个服务端包。
3.1 远程接口定义
客户端包放两个接口,一个服务接口,一个异步服务接口。服务端包写实现类。
1、 服务接口必须加注解,必须继承RemoteService。
/**远程接口 */
@RemoteServiceRelativePath("testInterface ")
public interface TestInterface extends RemoteService{
public String getTestInterfaceStr(String param);
}
2、异步服务接口,类名必须是服务接口+Async。异步服务接口的方法返回值必须是void,前几个方法参数和服务接口相同,最后加一个异步回调参数。
public interface TestInterfaceAsync {
void getTestInterfaceStr(String param, AsyncCallback<String> callback);
}
3.2 远程接口实现
实现类是一个servlet,必须继承RemoteServiceServlet。
public class TestInterfaceImpl extends RemoteServiceServlet implements TestInterface {
@Override
public String getTestInterfaceStr(String param){
return param+" Hello world! ";
}
}
3.3 接口配置
配置web.xml与 gwt.xml
- gwt.xml中必须配置servlet,path与@RemoteServiceRelativePath注解的路径一致。
<inherits name='com.math.test.Test' />
2 web.xml中配置servlet,如果是servlet 3.0以上,可以不使用web.xml配置,直接使用注解配置。
servlet的路径分为两段,第一段是所在gwt.xml的路径,第二段是@RemoteServiceRelativePath的路径。如:
<servlet>
<servlet-name>testInterface </servlet-name>
<servlet-class>com.math.server.TestInterfaceImpl </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> testInterface </servlet-name>
<url-pattern>/Test/testInterface </url-pattern>
</servlet-mapping>
3.4 客户端接口调用
使用GWT.create得到代理类,就可以使用了。传入服务接口,返回异步服务接口。
TestInterfaceAsync testService = GWT.create(TestInterface.class);