hessian demo和hessian与spring整合demo

/** 
* @version 1.1 
* @author iam00@qq.com 
* @create Mar 18, 2010 
*/ 

  Hessian是一个轻量级的remoting on http工具,使用简单的方法提供了RMI(Remote Method Invocation,远程方法调用)的功能。采用的是二进制RPC(Remote Procedure Call Protocol,远程过程调用协议)协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。 
  在进行基于Hessian的项目开发时,应当注意以下几点: 
  ▲JAVA服务器端必须具备以下几点: 
  •包含Hessian的jar包。 
  •设计一个接口,用来给客户端调用。 
  •实现该接口的功能。 
  •配置web.xml,配好相应的servlet。 
  •对象必须实现Serializable 接口。 
  •对于复杂对像可以使用Map的方法传递。 
  ▲客户端必须具备以下几点: 
  •java客户端包含Hessian.jar的包。 
  •具有和服务器端结构一样的接口。 
•利用HessianProxyFactory调用远程接口。 

下面是一个hessian的简单例子。 

Java服务器端: 

环境:j2sdk1.4.2、Tomcat6.0 
依赖的包:hessian-3.1.6.jar 

新建一个名为HessianServer的web project。将hessian-3.1.6.jar放入WEB-INF/lib文件夹中。 

创建接口: 

Java代码  收藏代码
  1. package server.demo;  
  2.   
  3. public interface DemoApi {  
  4.     public void setName(String name);  
  5.     public String sayHello();  
  6.     public User getUser();  
  7. }  


实现接口: 

Java代码  收藏代码
  1. package server.demo;  
  2.   
  3. public class DemoService implements DemoApi {  
  4.     private String name;  
  5.   
  6.     public String sayHello() {  
  7.         return "Hello "+name;  
  8.     }  
  9.   
  10.     public void setName(String name) {  
  11.         this.name=name;  
  12.         System.out.println("Hello "+name);  
  13.     }  
  14.   
  15.     public User getUser() {  
  16.         return new User("lingling""pass");  
  17.     }  
  18.   
  19. }  


创建User类,注意:一定要implements Serializable。 

Java代码  收藏代码
  1. package server.demo;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class User implements Serializable {  
  6.     String name = "kitty";  
  7.     String password = "nopass";  
  8.   
  9.     public User() {  
  10.         super();  
  11.     }  
  12.   
  13.     public User(String name, String password) {  
  14.         super();  
  15.         this.name = name;  
  16.         this.password = password;  
  17.     }  
  18.   
  19.     public String getName() {  
  20.         return name;  
  21.     }  
  22.   
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.   
  27.     public String getPassword() {  
  28.         return password;  
  29.     }  
  30.   
  31.     public void setPassword(String password) {  
  32.         this.password = password;  
  33.     }  
  34.   
  35. }  


配置web.xml: 

Xml代码  收藏代码
  1. <servlet>  
  2.     <servlet-name>first</servlet-name>  
  3.     <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>  
  4.     <init-param>  
  5.         <param-name>service-class</param-name>  
  6.         <param-value>server.demo.DemoService</param-value>  
  7.     </init-param>  
  8. </servlet>  
  9. <servlet-mapping>  
  10.     <servlet-name>first</servlet-name>  
  11.     <url-pattern>/helloworld</url-pattern>  
  12. </servlet-mapping>  


将项目发布到tomcat服务器上。 

Java客户端: 

环境:j2sdk1.4.2 
依赖的包:hessian-3.1.6.jar 

创建一个名为HessianClient的java project,载入hessian-3.1.6.jar。 

创建与服务器一样的接口及User类,注意它们所在的包路径也要与服务器相同,否则会出现java.lang.ClassNotFoundException。 

接口: 

Java代码  收藏代码
  1. package server.demo;  
  2.   
  3. public interface DemoApi {  
  4.     public void setName(String name);  
  5.     public String sayHello();  
  6.     public User getUser();  
  7. }  


User类: 

Java代码  收藏代码
  1. package server.demo;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class User implements Serializable {  
  6.     String name = "kitty";  
  7.     String password = "nopass";  
  8.   
  9.     public User() {  
  10.         super();  
  11.     }  
  12.   
  13.     public User(String name, String password) {  
  14.         super();  
  15.         this.name = name;  
  16.         this.password = password;  
  17.     }  
  18.   
  19.     public String getName() {  
  20.         return name;  
  21.     }  
  22.   
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.   
  27.     public String getPassword() {  
  28.         return password;  
  29.     }  
  30.   
  31.     public void setPassword(String password) {  
  32.         this.password = password;  
  33.     }  
  34.   
  35. }  


客户端程序: 

Java代码  收藏代码
  1. package client.demo;  
  2.   
  3. import java.net.MalformedURLException;  
  4.   
  5. import server.demo.DemoApi;  
  6.   
  7. import com.caucho.hessian.client.HessianProxyFactory;  
  8.   
  9. public class ClientTest {  
  10.     public static void main(String[] args) throws MalformedURLException,  
  11.             ClassNotFoundException {  
  12.         String url = "http://localhost:9520/HessianServer/helloworld";  
  13.         HessianProxyFactory factory = new HessianProxyFactory();  
  14.         DemoApi api = (DemoApi) factory.create(url);  
  15.         api.setName("test");  
  16.         System.out.println(api.sayHello());  
  17.         System.out.println(api.getUser().getName());  
  18.         System.out.println(api.getUser().getPassword());  
  19.     }  
  20. }  


现在,启动tomcat,运行ClientTest。运行结果: 
Hello test 
lingling 
pass 

现在,在以上基础上将hessian与spring整合。 

Java服务器端(即我们上面建的名为HessianServer的web project): 

环境:j2sdk1.4.2、Tomcat6.0 
依赖的包: 
1. Hessian包:hessian-3.1.6.jar 
2. spring-framework-2.0.2包: 
a) aopalliance.jar 
b) commons-logging.jar 
c) log4j-1.2.14.jar 
d) spring.jar 
e) spring-aop.jar 
f) spring-beans.jar 
g) spring-context.jar 
h) spring-core.jar 
i) spring-jdbc.jar 
j) spring-jms.jar 
k) spring-web.jar 
l) spring-webmvc.jar 

配置web.xml,web.xml中增加: 

Xml代码  收藏代码
  1. <servlet>  
  2.     <servlet-name>remote</servlet-name>  
  3.     <servlet-class>  
  4.         org.springframework.web.servlet.DispatcherServlet  
  5.     </servlet-class>  
  6.     <init-param>  
  7.         <param-name>namespace</param-name>  
  8.         <param-value>classes/remote-servlet</param-value>  
  9.     </init-param>  
  10.     <load-on-startup>1</load-on-startup>  
  11. </servlet>  
  12. <servlet-mapping>  
  13.     <servlet-name>remote</servlet-name>  
  14.     <url-pattern>/remote/*</url-pattern>  
  15. </servlet-mapping>  


写spring的发布hessian服务的配置文件remote-servlet.xml,这个文件就建在工程的src下,即deploy到tomcat后,在WEB-INF/classes目录下。注意:这个文件为什么叫remote-servlet.xml呢?因为我们在web.xml中有配置:<param-value>classes/remote-servlet</param-value>所以文件名为remote-servlet.xml。 
以下是remote-servlet.xml的内容: 

Xml代码  收藏代码
  1. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  2. <beans>  
  3.     <bean id="demoService" class="server.demo.DemoService" />  
  4.     <bean name="/helloSpring"  
  5.         class="org.springframework.remoting.caucho.HessianServiceExporter">  
  6.         <property name="service" ref="demoService" />  
  7.         <property name="serviceInterface" value="server.demo.DemoApi" />  
  8.     </bean>  
  9. </beans>  


好了,现在可以测试一下了。在刚才建的名为HessianClient的java project中修改client.demo.ClientTest.java如下: 

Java代码  收藏代码
  1. package client.demo;  
  2.   
  3. import java.net.MalformedURLException;  
  4.   
  5. import server.demo.DemoApi;  
  6.   
  7. import com.caucho.hessian.client.HessianProxyFactory;  
  8.   
  9. public class ClientTest {  
  10.     public static void main(String[] args) throws MalformedURLException,  
  11.             ClassNotFoundException {  
  12.         // String url = "http://localhost:9520/HessianServer/helloworld";  
  13.         String url = "http://localhost:9520/HessianServer/remote/helloSpring";  
  14.         HessianProxyFactory factory = new HessianProxyFactory();  
  15.         DemoApi api = (DemoApi) factory.create(DemoApi.class, url);  
  16.         api.setName("test");  
  17.         System.out.println(api.sayHello());  
  18.         System.out.println(api.getUser().getName());  
  19.         System.out.println(api.getUser().getPassword());  
  20.     }  
  21. }  


现在,启动tomcat,运行ClientTest。运行结果: 
Hello test 
lingling 
pass 

如果客户端也使用spring呢?现在做一个spring整合hessian的客户端demo。首先载入spring-framework-2.0.2包:
1) aopalliance.jar 
2) commons-logging.jar 
3) log4j-1.2.14.jar 
4) spring.jar 
5) spring-aop.jar 
6) spring-beans.jar 
7) spring-context.jar 
8) spring-core.jar 
9) spring-jdbc.jar 
10) spring-jms.jar 
11) spring-web.jar 
12) spring-webmvc.jar 
在名为HessianClient的java project中src目录下,新建一个remote-client.xml,这个文件可随意命名。remote-client.xml内容为: 

Xml代码  收藏代码
  1. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  2. <beans>  
  3.     <bean id="helloSpring"  
  4.         class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
  5.         <property name="serviceUrl">  
  6.             <value>  
  7.                 http://localhost:9520/HessianServer/remote/helloSpring  
  8.             </value>  
  9.         </property>  
  10.         <property name="serviceInterface">  
  11.             <value>server.demo.DemoApi</value>  
  12.         </property>  
  13.     </bean>  
  14. </beans>  


在刚才建的名为HessianClient的java project中修改client.demo.ClientTest.java如下: 

Java代码  收藏代码
  1. package client.demo;  
  2.   
  3. import java.net.MalformedURLException;  
  4.   
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. import server.demo.DemoApi;  
  9.   
  10. public class ClientTest {  
  11.     public static void main(String[] args) throws MalformedURLException,  
  12.             ClassNotFoundException {  
  13.         // String url = "http://localhost:9520/HessianServer/helloworld";  
  14.         // String url =  
  15.         // "http://localhost:9520/HessianServer/remote/helloSpring";  
  16.         // HessianProxyFactory factory = new HessianProxyFactory();  
  17.         // DemoApi api = (DemoApi) factory.create(DemoApi.class, url);  
  18.   
  19.         ApplicationContext context = new ClassPathXmlApplicationContext(  
  20.                 "remote-client.xml");  
  21.         DemoApi api = (DemoApi) context.getBean("helloSpring");  
  22.         api.setName("test");  
  23.         System.out.println(api.sayHello());  
  24.         System.out.println(api.getUser().getName());  
  25.         System.out.println(api.getUser().getPassword());  
  26.     }  
  27. }  


现在,启动tomcat,运行ClientTest。运行结果: 
Hello test 
lingling 
pass 

至此over~ 
PS:有时候可能因hessian或spring的版本问题使程序不能运行

Hessian入门(集合,对象)

                                                                                                                      By:wtang

  1. 主要是讲述使用Hessian传递集合以及对象.
  2. 传递的对象必须序列化
  3. 相比起Webservice,Hessian无需配置xml   (XXX.aegis.xml) 实体Bean的xml文件

4.    简单 轻量 无需多余配置.

 

 

 

 

开发流程:

1.书写实体Bean[必须序列化]

 

 

 

 

  1. package com.wtang.domain;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class User implements Serializable {  
  6.     private static final long serialVersionUID = 21287917233879L;  
  7.   
  8.     private String userName;  
  9.   
  10.     private String password;  
  11.   
  12.     public String getUserName() {  
  13.         return userName;  
  14.     }  
  15.   
  16.     public void setUserName(String userName) {  
  17.         this.userName = userName;  
  18.     }  
  19.   
  20.     public String getPassword() {  
  21.         return password;  
  22.     }  
  23.   
  24.     public void setPassword(String password) {  
  25.         this.password = password;  
  26.     }  
  27. }  

 

 

2.定义接口

 

  1. package com.wtang.isay;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5. import com.wtang.domain.User;  
  6.   
  7. public interface Isay {  
  8.   
  9.     public String sayHello(List<User> list);  
  10.   
  11.     public String sayHi(Map<String, User> map);  
  12. }  

 

 

3.接口具体实现

 

  1. package com.wtang.isay;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import com.wtang.domain.User;  
  7.   
  8. public class IsayImpl implements Isay {  
  9.   
  10.     public String sayHello(List<User> list) {  
  11.   
  12.         StringBuffer sb = new StringBuffer();  
  13.   
  14.         for (Iterator iterator = list.iterator(); iterator.hasNext();) {  
  15.             User user = (User) iterator.next();  
  16.             sb.append(user.getUserName());  
  17.             sb.append("==");  
  18.             sb.append(user.getPassword());  
  19.             sb.append("==");  
  20.         }  
  21.   
  22.         return sb.toString();  
  23.     }  
  24.   
  25.     public String sayHi(Map<String, User> map) {  
  26.   
  27.         StringBuffer sb = new StringBuffer();  
  28.   
  29.         for (String o : map.keySet()) {  
  30.             sb.append(map.get(o).getUserName());  
  31.             sb.append("==");  
  32.             sb.append(map.get(o).getPassword());  
  33.             sb.append("==");  
  34.         }  
  35.   
  36.         return sb.toString();  
  37.     }  
  38. }  

 

 

 

4.配置Web.xml

 

  1. <servlet>  
  2.     <servlet-name>hi</servlet-name>  
  3.     <servletclass>com.caucho.hessian.server.HessianServlet</servlet-class>  
  4.     <init-param>  
  5.         <param-name>service-class</param-name>  
  6.         <param-value>com.wtang.isay.IsayImpl</param-value>  
  7.     </init-param>  
  8. </servlet>  
  9.   
  10. <servlet-mapping>  
  11.     <servlet-name>hi</servlet-name>  
  12.     <url-pattern>/hi</url-pattern>  
  13. </servlet-mapping>  

 

 

5.客户端调用

 

 

  1. package com.wtang.test;  
  2.   
  3. import java.net.MalformedURLException;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import com.caucho.hessian.client.HessianProxyFactory;  
  9. import com.wtang.domain.User;  
  10. import com.wtang.isay.Isay;  
  11.   
  12. public class Test {  
  13.     public static void main(String[] args) throws MalformedURLException {  
  14.         String url = "http://localhost:8080/HessianCollection/hi";  
  15.   
  16.         HessianProxyFactory factory = new HessianProxyFactory();  
  17.   
  18.         Isay i = (Isay) factory.create(Isay.class, url);  
  19.   
  20.         String result1, result2 = "";  
  21.   
  22.         // List  
  23.         List<User> list = new ArrayList<User>();  
  24.         User user1 = new User();  
  25.         user1.setUserName("chenweitang");  
  26.         user1.setPassword("123");  
  27.   
  28.         User user2 = new User();  
  29.         user2.setUserName("hello");  
  30.         user2.setPassword("world");  
  31.   
  32.         list.add(user1);  
  33.         list.add(user2);  
  34.   
  35.         result1 = i.sayHello(list);  
  36.   
  37.         System.out.println("List结果:" + result1);  
  38.   
  39.         // Map  
  40.         Map<String, User> map = new HashMap<String, User>();  
  41.         map.put(user1.getUserName(), user1);  
  42.         map.put(user2.getUserName(), user2);  
  43.   
  44.         result2 = i.sayHi(map);  
  45.   
  46.         System.out.println("Map结果:" + result2);  
  47.     }  
  48. }  

 

 

结果:

 

List结果:chenweitang==123==hello==world==
Map结果:hello==world==chenweitang==123==

http://blog.csdn.net/chenweitang123/article/details/6334024

 

 

Hessian入门(与Spring集成)

Hessian入门(与Spring集成)

                                                                                                                      By:wtang

说明 :

  1. 讲述如何配置Hessian的服务器端(与Spring集成).
  2. 讲述客户端如何调用

①   使用HessianProxyFactory  Hessian代理工厂直接调用

②   使用HessianProxyFactoryBean Hessian代理工厂Bean来完成接口调用.

 

  1. 讲述如何配置Hessian的服务器端(与Spring集成).

 

 

 

 

 

 

接口定义类: com.wtang.isay. Isay:

 

 

  1. package com.wtang.isay;  
  2.   
  3. public interface Isay {  
  4.     public String sayHello(String arg1,String arg2);  
  5. }  

 

 

接口具体实现类: com.wtang.isay. IsayImpl

 

  1. package com.wtang.isay;  
  2.   
  3. public class IsayImpl implements Isay {  
  4.   
  5.     public String sayHello(String arg1, String arg2) {  
  6.         return "Hello:" + arg1 + arg2;  
  7.     }  
  8. }  

 

配置Web.xml:

 

  1. <servlet>  
  2.     <servlet-name>remote</servlet-name>  
  3.     <!-- 使用Spring的代理Servlet -->  
  4.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  5.     <init-param>  
  6.         <param-name>namespace</param-name>  
  7.         <param-value>classes/remote-servlet</param-value>  
  8.     </init-param>  
  9.     <load-on-startup>1</load-on-startup>  
  10. </servlet>  
  11.   
  12. <servlet-mapping>  
  13.     <servlet-name>remote</servlet-name>  
  14.     <url-pattern>/remote/*</url-pattern>  
  15. </servlet-mapping>  

 

配置remote-servlet.xml[该文件位于src目录下,即编译后存在与classes下]:

 

  1. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  2. <beans>  
  3.     <!-- 接口的具体实现类 -->  
  4.     <bean id="impl" class="com.wtang.isay.IsayImpl" />  
  5.     <!-- 使用Spring的HessianServie做代理 -->  
  6.     <bean name="/helloSpring"  
  7.     class="org.springframework.remoting.caucho.HessianServiceExporter">  
  8.         <!-- service引用具体的实现实体Bean-->  
  9.         <property name="service" ref="impl" />  
  10.         <property name="serviceInterface" value="com.wtang.isay.Isay" />  
  11.     </bean>  
  12.       
  13.     <!-- 可以配置多个HessianServiceExporter代理Bean -->  
  14. </beans>  

 

注:

      这个文件为什么叫remote-servlet.xml呢?

因为我们在web.xml中有配置:<servlet-name>remote</servlet-name>。

所以remote-servlet.xml的文件名必须以

<servlet-name>中配置的servlet-name作为文件名的开头,

且文件名的格式必须是[servlet-name]-servlet.xml格式,否则检测不到。

    即:

<param-value>classes/remote-servlet</param-value>

所以文件名为remote-servlet.xml。

 

 

  1. 讲述客户端如何调用

        ① 使用HessianProxyFactory  Hessian代理工厂直接调用

 即:

       

  1. package com.wtang.test;  
  2.   
  3. import java.net.MalformedURLException;  
  4. import com.caucho.hessian.client.HessianProxyFactory;  
  5. import com.wtang.isay.Isay;  
  6.   
  7. public class NormalClient {  
  8.     public static void main(String[] args) throws MalformedURLException {  
  9.         //Spring Hessian代理Servelet  
  10.         String url = "http://localhost:8080/HessianSpring/remote/helloSpring";  
  11.         HessianProxyFactory factory = new HessianProxyFactory();  
  12.         Isay api = (Isay) factory.create(Isay.class, url);  
  13.   
  14.         System.out.println(api.sayHello("chen", "weitang"));  
  15.     }  
  16. }  

 

 

输出Hello:chenweitang

 

  1. 讲述客户端如何调用

        ② 使用HessianProxyFactoryBean Hessian代理工厂Bean来完成接口调用.

配置客户端 remote-client.xml:

 

  1. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  2. <beans>  
  3.     <!-- 客户端Hessian代理工厂Bean -->  
  4.     <bean id="clientSpring" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
  5.         <!-- 请求代理Servlet路径 -->          
  6.         <property name="serviceUrl">  
  7. <value>http://localhost:8080/HessianSpring/remote/helloSpring</value>  
  8.         </property>  
  9.         <!-- 接口定义 -->  
  10.         <property name="serviceInterface">  
  11.             <value>com.wtang.isay.Isay</value>  
  12.         </property>  
  13.     </bean>  
  14. </beans>  

 

 

调用:

 

  1. package com.wtang.test;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import com.wtang.isay.Isay;  
  6.   
  7. public class SpringClient {  
  8.     public static void main(String[] args) {  
  9.         ApplicationContext contex = new ClassPathXmlApplicationContext(  
  10.                 "remote-client.xml");  
  11.   
  12.         // 获得客户端的Hessian代理工厂bean  
  13.         Isay i = (Isay) contex.getBean("clientSpring");  
  14.         System.out.println(i.sayHello("chen", "weitang"));  
  15.     }  
  16. }  

 

 

输出Hello:chenweitang

 

 

posted on 2012-07-31 09:39  Nolan  阅读(1554)  评论(0)    收藏  举报