Hessian下载地址:http://hessian.caucho.com/#Java
服务端:
com.caucho.hessian.server.HessianServlet
Web 服务是通过在 Web 服务器上部署 Servlet 来提供的。在 HessianServlet 的初始化配置中,参数 home-api 用来指定该 Web service 能够提供的服务,参数 home-class 用来指定提供具体服务的类,也即实现了 home-api 所指定接口的类。如果需要提供多个服务,可以部署多个 HessianServlet,并指定相应的 home-api 和 home-class 参数。
HessianServlet 是一个普通的 Servlet。主要接收来自 Hessian 客户端的请求,并将来自客户端 InputStream 和 OutputStream 包装成 Hessian 自己的 Input 和 Output,然后调用 HessianSkeleton 类处理客户的请求、并将处理结果返回给客户端。在初始化的过程中,HessianServlet 会根据参数 home-class 创建一个相应的实例,作为背后真正的 Web 服务提供者相应客户端的请求。
HessianSkeleton 解析来自客户端所请求的方法和参数信息,利用 Java 中的反射机制,调用由 HessianServlet 在初始化过程中创建的 Web 服务实例中对应的方法,然后将结果返回给客户端。
web.xml
<servlet>
<servlet-name>Hessian</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-api</param-name>
<param-value>com.dao.BaseService</param-value>
</init-param>
<init-param>
<param-name>home-class</param-name>
<param-value>com.dao.BaseServiceImpl</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Hessian</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
BaseService.java
package com.dao;
public interface BaseService {
public String say(String name);
}
BaesServiceImpl.java
package com.dao;
public class BaseServiceImpl implements BaseService {
public String say(String name) {
return "Hello"+name;
}
}
客户端:
客户端主要使用了 Java 的动态代理机制。当客户端使用 HessianProxyFactory 创建一个实例时,并不是真正创建了一个 Web 服务接口类型的实力,而是创建了一个 Java 代理实例。随后在调用 Web 服务接口的方法时,实现了 InvocationHandler 接口的 HessianProxy 类将方法名称、参数等信息通过 HttpURLConnection 发送给 Web service 服务器,然后处理服务器的响应并将结果返回。
public static void main(String[] args) throws Exception {
String url = "http://127.0.0.1:8080/hessian/hello";
HessianProxyFactory factory = new HessianProxyFactory();
BaseService basic = (BaseService) factory.create(BaseService.class, url);
System.out.println("Hello: " + basic.say("SY"));
}