一年前我做的项目中遇到了要给其他的几个系统提供接口实现远程调用,数据是二进制数据。那么用哪个好呢?
xfire?cxf?hessain?
XFire是codeHaus组织提供的一个开源框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简
单的方式发布成Web服务,这种处理方式不仅充分发挥了POJO的作用,简化了Java应用转化为Web服务的步骤和过程,
也直接降低了SOA的实现难度,为企业转向SOA架构提供了一种简单可行的方式。
CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、
DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或
者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache
顶级项目。
Hessian是一个使用二进制Web服务协议的框架,它的好处在于免除了一大堆附加的API包,方便,简单,快速等特点。
例如XML的处理之类的jar包,这也就是为什么说它是一个轻量级的Web服务实现框架的原因,这个原因还在于手机上的应
用程序可以通过Hessian提供的API很方便的访问Hessian的Web服务。
我的项目中需要传输二进制数据,所以我选择了hessian。
个人总结了下hessian的使用:
两种方式:1、接口的实现类继承HessianServlet,web.xml中将接口的实现类做成servlet。
2、接口的实现类无需继承HessianServlet,web.xml文件中直接引入HessianServlet,传入init-param指明传入的接口及实现类即可。
方法1是继承hessianservlet在程序里写死谁为服务接口和实现类,比较呆板,降低了可重用性不够灵活。
方法2是配置文件中指明哪个为接口哪个是需要传入的实现类,比较灵活。
具体的例子如下:
客户端的接口:
package com.future.client;
public interface BasicAPI {
public String hello();
}
客户端调用服务端:
package com.future.client;
import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
public class TestHessian {
public static void main(String[] args) {
String url = "http://localhost:8080/HessianRemotingOnHttp2/xu";
HessianProxyFactory factory = new HessianProxyFactory();
try {
BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class,url);
System.out.println("hello()"+basic.hello());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端接口:
package com.future.server;
public interface BasicAPI {
public String hello();
}
服务端的实现类:
package com.future.server;
import javax.jws.WebService;
import com.caucho.hessian.server.HessianServlet;
@WebService
public class BasicService extends HessianServlet implements BasicAPI{
private String _greeting = "Hello,world";
public void setGreeting(String greeting)
{
_greeting = greeting;
}
public String hello() {
// TODO Auto-generated method stub
return _greeting;
}
}
配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>HessianServlet</servlet-name>
<servlet-class>com.future.server.BasicService</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HessianServlet</servlet-name>
<url-pattern>/xu</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
以上是我提到的第二种方式。为了方便大家所以我选择了网上流行的例子,便于大家浏览。
第二种方式:
服务端接口:
package study.hessian;
public interface IBasic {
public String hello();
public Person getPerson();
}
服务端实现类:
package study.hessian;
public class BasicService implements IBasic {
private String hello= "Hello, 徐士刚";
public String hello()
{
return hello;
}
public Person getPerson() {
Person person = new Person();
person.setColor("red");
person.setLength("176cm");
person.setName("徐士刚");
return person;
}
}
服务端model:
package study.hessian;
import java.io.Serializable;
public class Person {
private static final long serialVersionUID = 3276641446246664L;
private String name;
private String length;
private String color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
客户端接口如下:
package com.future.client;
public interface IBasic {
public String hello();
public Person getPerson();
}
客户端model:
package com.future.client;
import java.io.Serializable;
public class Person implements Serializable{
private static final long serialVersionUID = 3276641446246664L;
private String name;
private String length;
private String color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
客户端调用服务端:
package com.future.client;
import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
public class TestHessian {
public static void main(String[] args) {
String url = "http://localhost:8080/HessianRemotingOnHttp3/hello";
HessianProxyFactory factory = new HessianProxyFactory();
try {
IBasic basic = (IBasic) factory.create(IBasic.class,url);
System.out.println("hello()"+basic.hello());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意以上url为
String url = ("http://" + request.getServerName() + ":"+ request.getServerPort() +
request.getContextPath() + "/hello"); 相信大家肯定知道的。
Hessian与Spring整合
Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可
以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务,web.xml只是定义了“请求转发器”,该
转发器将匹配/remoting/*的请求截获,转发给context的bean处理。而HessianServiceExporter提供bean服务。
所以Hessian与Spring整合主要就是一下两个工作:
1:通过DispatcherServlet来拦截URL请求。
2:HessianServiceExporter提供bean服务,Spring使用HessianServiceExporter,将一个常规bean导出成Hessian服务。
下面我就把我在做实例的一些相关步骤描述如下:
web.xml的详细配置
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
配置remoting-servlet.xml文件
<!-- 定义普通bean实例-->
<bean id="hello" class="jzh.demospring.impl.Hello"/>
<!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务-->
<bean name="/HessianRemoting" class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- 需要导出的目标bean-->
<property name="service" ref="hello"/>
<!-- Hessian服务的接口-->
<property name="serviceInterface" value="jzh.demospring.IHello"/>
</bean>
客户端定义一个remoting-client.xml文件
<bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <property name="serviceUrl">
<value>http://localhost:8080/HessianSpring/remoteing/HessianRemoting</value>
</property>
<property name="serviceInterface">
<value>jzh.demospring.IHello</value>
</property>
</bean>
客户端调用。
try
{
ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml");
IHello hello =(IHello)context.getBean("myServiceClient");
System.out.println(hello.sayHello());
}
catch (Exception e)
{
e.printStackTrace();
}
以上是本人粗浅的介绍,希望大家多多指正,共同进步,这里谢过了!!!