想来想去还是把hessian的应用放到SOA栏目中来吧
hessian实现了远程调用,不需要学习WEB service的一些规范就可以直接上手, 它一个轻量级的Java远程访问的解决方案。Hessian很像WebService,只不过它不使用SOAP协议,而是使用它自己的binary协议
使用它只需要3个关键的类
1、stub(存根) 也就是服务器端和客户端的公共接口
2、服务器端对该接口的实现类serviceimpl
3、服务器端的sevlet ,hessian帮我们实习了个HessianServlet,当然我们可以直接让我们的serviceimpl继承HessianServlet
下面举例,例子在网络上,官方文档上都有的
stub
/**
* @author 付志超
* @time Sep 26, 2008 2:35:54 PM
*/
/**
*
*/
package com.alimama.function;
import com.alimama.bean.Student;
public interface SayHello {
public String sayHello(String name);
public Student getStudent() ;
}
serviceimpl
/**
* @author 付志超
* @time Sep 26, 2008 2:36:58 PM
*/
package com.alimama.function.impl;
import com.alimama.bean.Student;
import com.alimama.function.SayHello;
import com.caucho.hessian.server.HessianServlet;
public class SayHelloImpl extends HessianServlet implements SayHello {
public String sayHello(String name) {
return "hello "+name;
}
@Override
public Student getStudent() {
Student s=new Student();
s.setName("付志超");
s.setSchool("武汉理工大学");
return s;
}
}
本例中需要传输的序列化的bean
/**
* @author 付志超
* @time Sep 26, 2008 3:42:47 PM
*/
package com.alimama.bean;
import java.io.Serializable;
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = -9006571629757493042L;
private String name;
private String school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String toString() {
return name+" "+school;
}
}
最后是web.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>hello</servlet-name> <servlet-class> com.alimama.function.impl.SayHelloImpl </servlet-class> </servlet> <servlet> <servlet-name>Test</servlet-name> <servlet-class>com.alimama.function.impl.Test</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> </web-app>
当然如果我们的 serviceimpl没有实现 HessianServlet
那么web.xml应该修改成为:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <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.alimama.function.impl.SayHelloImpl</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>com.alimama.function.SayHello</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
记住 Student一定要实习可序列化接口
最后是我们的客户端的调用
/**
* @author 付志超
* @time Sep 26, 2008 2:57:27 PM
*/
package com.alimama.test;
import java.net.MalformedURLException;
import com.alimama.function.SayHello;
import com.caucho.hessian.client.HessianProxyFactory;
public class HessianClientTest {
public static void main(String[] args) {
String url="http://127.0.0.1:8080/testHessian/hello";
HessianProxyFactory factory=new HessianProxyFactory();
try {
SayHello say=(SayHello) factory.create(SayHello.class, url);
System.out.println(say.sayHello("abc"));
System.out.println(say.getStudent());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
启动服务器,然后执行上面的客户端,就会看到输出
hello abc
付志超 武汉理工大学
还有点要注意 如果用最新的版本的 hessian-3.1.6.jar hessian-3.2.0.jar 都出现问题 无法获得 出现IO异常
但是使用一个 hessian-3.0.20.jar 的老包 是没问题的
=====
OK 以后在进一部使用hessian了