一、Hessian概述:
Hessian:hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能,相比WebService,Hessian更簡單、快捷。采用的是二進制RPC協定,因為采用了二進制協定,是以它很适合于發送二進制資料,Hessian主要作面向對象的消息通信。Hessian的初衷就是支援動态類型,格式緊湊,跨語言Hessian是使用自己的序列化機制實作的編組和反編組,其支援的資料類型是有限制的,不支援複雜的對象,可以穿透防火牆,在這裡不得不說一下RMI:RMI是一組使用者開發分布式應用程式的API。他使用的是java序列化機制實作調用及傳回值的編組于反編組。它使用Java語言接口定義了遠端對象,它集合了Java序列化和Java遠端方法協定(Java Remote Method Protocol)。他可以被看做是RPC的Java版本,因為傳統的RPC并不能很好的應用于分布式對象系統。而Java RMI則支援存儲于不同位址空間的程式級對象之間彼此進行通信,實作遠端對象之間的無縫遠端調用。他也有它的缺點,他隻能通過RMI協定來進行通路無法通過HTTP協定通路,無法穿透防火牆。
二、簡單執行個體
伺服器端:
jar包(hessian-4.0.37.jar)
設計一個接口,用來給用戶端調用
實作該接口的動能
配置web.xml,配置相應的servlet
對象必須實作Serializable接口
對于複雜對象可以使用Map的方法傳遞
用戶端:
jar包(hessian-4.0.37.jar)
具有和伺服器端結構一樣的接口和實體類。包括命名空間都最好一樣。利用HessianProxyFactory調用遠端接口
1.編寫服務端代碼
package com.hessian.simple.entity;
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.hessian.simple;
import java.util.List;
import java.util.Map;
import com.hessian.simple.entity.User;
public interface IHello {
public String sayHello(String name);
public String getUserList(List<User> users);
public String getUserMap(Map<String, User> maps);
}
package com.hessian.simple.impl;
import java.util.List;
import java.util.Map;
import com.hessian.simple.IHello;
import com.hessian.simple.entity.User;
public class IHelloImpl implements IHello {
public String sayHello(String name) {
return "Hello," + name;
}
public String getUserList(List<User> users) {
StringBuffer stringBuffer = new StringBuffer();
for (User user : users) {
stringBuffer.append("[");
stringBuffer.append(user.getUserName());
stringBuffer.append("--");
stringBuffer.append(user.getPassword());
stringBuffer.append("]");
}
return stringBuffer.toString();
}
public String getUserMap(Map<String, User> maps){
StringBuffer stringBuffer = new StringBuffer();
for(String key : maps.keySet()){
stringBuffer.append("[");
stringBuffer.append(maps.get(key).getUserName());
stringBuffer.append("--");
stringBuffer.append(maps.get(key).getPassword());
stringBuffer.append("]");
}
return stringBuffer.toString();
}
}
配制web.xml
<!-- Hessian -->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>com.hessian.simple.impl.IHelloImpl</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>com.hessian.simple.IHello</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
用戶端測試類
package com.hessian.test;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.caucho.hessian.client.HessianProxyFactory;
import com.hessian.simple.IHello;
import com.hessian.simple.entity.User;
public class ClientTest {
public static String url = "http://127.0.0.1:8080/Hello";
public static void main(String[] args) {
HessianProxyFactory factory = new HessianProxyFactory();
try {
IHello iHello = (IHello) factory.create(IHello.class, url);
System.out.println(iHello.sayHello("tzz"));
User user1 = new User();
user1.setUserName("a1");
user1.setPassword("123456");
User user2 = new User();
user2.setUserName("a2");
user2.setPassword("123456");
List<User> users = new ArrayList<User>();
users.add(user1);
users.add(user2);
System.out.println(iHello.getUserList(users));
Map<String, User> maps = new HashMap<String, User>();
maps.put("user1", user1);
maps.put("user2", user2);
System.out.println(iHello.getUserMap(maps));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}