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文件夹中。
创建接口:
- package server.demo;
- public interface DemoApi {
- public void setName(String name);
- public String sayHello();
- public User getUser();
- }
实现接口:
- package server.demo;
- public class DemoService implements DemoApi {
- private String name;
- public String sayHello() {
- return "Hello "+name;
- }
- public void setName(String name) {
- this.name=name;
- System.out.println("Hello "+name);
- }
- public User getUser() {
- return new User("lingling", "pass");
- }
- }
创建User类,注意:一定要implements Serializable。
- package server.demo;
- import java.io.Serializable;
- public class User implements Serializable {
- String name = "kitty";
- String password = "nopass";
- public User() {
- super();
- }
- public User(String name, String password) {
- super();
- this.name = name;
- this.password = password;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
配置web.xml:
- <servlet>
- <servlet-name>first</servlet-name>
- <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
- <init-param>
- <param-name>service-class</param-name>
- <param-value>server.demo.DemoService</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>first</servlet-name>
- <url-pattern>/helloworld</url-pattern>
- </servlet-mapping>
将项目发布到tomcat服务器上。
Java客户端:
环境:j2sdk1.4.2
依赖的包:hessian-3.1.6.jar
创建一个名为HessianClient的java project,载入hessian-3.1.6.jar。
创建与服务器一样的接口及User类,注意它们所在的包路径也要与服务器相同,否则会出现java.lang.ClassNotFoundException。
接口:
- package server.demo;
- public interface DemoApi {
- public void setName(String name);
- public String sayHello();
- public User getUser();
- }
User类:
- package server.demo;
- import java.io.Serializable;
- public class User implements Serializable {
- String name = "kitty";
- String password = "nopass";
- public User() {
- super();
- }
- public User(String name, String password) {
- super();
- this.name = name;
- this.password = password;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
客户端程序:
- package client.demo;
- import java.net.MalformedURLException;
- import server.demo.DemoApi;
- import com.caucho.hessian.client.HessianProxyFactory;
- public class ClientTest {
- public static void main(String[] args) throws MalformedURLException,
- ClassNotFoundException {
- String url = "http://localhost:9520/HessianServer/helloworld";
- HessianProxyFactory factory = new HessianProxyFactory();
- DemoApi api = (DemoApi) factory.create(url);
- api.setName("test");
- System.out.println(api.sayHello());
- System.out.println(api.getUser().getName());
- System.out.println(api.getUser().getPassword());
- }
- }
现在,启动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中增加:
- <servlet>
- <servlet-name>remote</servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <init-param>
- <param-name>namespace</param-name>
- <param-value>classes/remote-servlet</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>remote</servlet-name>
- <url-pattern>/remote/*</url-pattern>
- </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的内容:
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="demoService" class="server.demo.DemoService" />
- <bean name="/helloSpring"
- class="org.springframework.remoting.caucho.HessianServiceExporter">
- <property name="service" ref="demoService" />
- <property name="serviceInterface" value="server.demo.DemoApi" />
- </bean>
- </beans>
好了,现在可以测试一下了。在刚才建的名为HessianClient的java project中修改client.demo.ClientTest.java如下:
- package client.demo;
- import java.net.MalformedURLException;
- import server.demo.DemoApi;
- import com.caucho.hessian.client.HessianProxyFactory;
- public class ClientTest {
- public static void main(String[] args) throws MalformedURLException,
- ClassNotFoundException {
- // String url = "http://localhost:9520/HessianServer/helloworld";
- String url = "http://localhost:9520/HessianServer/remote/helloSpring";
- HessianProxyFactory factory = new HessianProxyFactory();
- DemoApi api = (DemoApi) factory.create(DemoApi.class, url);
- api.setName("test");
- System.out.println(api.sayHello());
- System.out.println(api.getUser().getName());
- System.out.println(api.getUser().getPassword());
- }
- }
现在,启动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内容为:
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="helloSpring"
- class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
- <property name="serviceUrl">
- <value>
- http://localhost:9520/HessianServer/remote/helloSpring
- </value>
- </property>
- <property name="serviceInterface">
- <value>server.demo.DemoApi</value>
- </property>
- </bean>
- </beans>
在刚才建的名为HessianClient的java project中修改client.demo.ClientTest.java如下:
- package client.demo;
- import java.net.MalformedURLException;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import server.demo.DemoApi;
- public class ClientTest {
- public static void main(String[] args) throws MalformedURLException,
- ClassNotFoundException {
- // String url = "http://localhost:9520/HessianServer/helloworld";
- // String url =
- // "http://localhost:9520/HessianServer/remote/helloSpring";
- // HessianProxyFactory factory = new HessianProxyFactory();
- // DemoApi api = (DemoApi) factory.create(DemoApi.class, url);
- ApplicationContext context = new ClassPathXmlApplicationContext(
- "remote-client.xml");
- DemoApi api = (DemoApi) context.getBean("helloSpring");
- api.setName("test");
- System.out.println(api.sayHello());
- System.out.println(api.getUser().getName());
- System.out.println(api.getUser().getPassword());
- }
- }
现在,启动tomcat,运行ClientTest。运行结果:
Hello test
lingling
pass
至此over~
PS:有时候可能因hessian或spring的版本问题使程序不能运行
Hessian入门(集合,对象)
By:wtang
- 主要是讲述使用Hessian传递集合以及对象.
- 传递的对象必须序列化
- 相比起Webservice,Hessian无需配置xml (XXX.aegis.xml) 实体Bean的xml文件
4. 简单 轻量 无需多余配置.
开发流程:
1.书写实体Bean[必须序列化]
- package com.wtang.domain;
- import java.io.Serializable;
- public class User implements Serializable {
- private static final long serialVersionUID = 21287917233879L;
- 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;
- }
- }
2.定义接口
- package com.wtang.isay;
- import java.util.List;
- import java.util.Map;
- import com.wtang.domain.User;
- public interface Isay {
- public String sayHello(List<User> list);
- public String sayHi(Map<String, User> map);
- }
3.接口具体实现
- package com.wtang.isay;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import com.wtang.domain.User;
- public class IsayImpl implements Isay {
- public String sayHello(List<User> list) {
- StringBuffer sb = new StringBuffer();
- for (Iterator iterator = list.iterator(); iterator.hasNext();) {
- User user = (User) iterator.next();
- sb.append(user.getUserName());
- sb.append("==");
- sb.append(user.getPassword());
- sb.append("==");
- }
- return sb.toString();
- }
- public String sayHi(Map<String, User> map) {
- StringBuffer sb = new StringBuffer();
- for (String o : map.keySet()) {
- sb.append(map.get(o).getUserName());
- sb.append("==");
- sb.append(map.get(o).getPassword());
- sb.append("==");
- }
- return sb.toString();
- }
- }
4.配置Web.xml
- <servlet>
- <servlet-name>hi</servlet-name>
- <servletclass>com.caucho.hessian.server.HessianServlet</servlet-class>
- <init-param>
- <param-name>service-class</param-name>
- <param-value>com.wtang.isay.IsayImpl</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>hi</servlet-name>
- <url-pattern>/hi</url-pattern>
- </servlet-mapping>
5.客户端调用
- package com.wtang.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.wtang.domain.User;
- import com.wtang.isay.Isay;
- public class Test {
- public static void main(String[] args) throws MalformedURLException {
- String url = "http://localhost:8080/HessianCollection/hi";
- HessianProxyFactory factory = new HessianProxyFactory();
- Isay i = (Isay) factory.create(Isay.class, url);
- String result1, result2 = "";
- // List
- List<User> list = new ArrayList<User>();
- User user1 = new User();
- user1.setUserName("chenweitang");
- user1.setPassword("123");
- User user2 = new User();
- user2.setUserName("hello");
- user2.setPassword("world");
- list.add(user1);
- list.add(user2);
- result1 = i.sayHello(list);
- System.out.println("List结果:" + result1);
- // Map
- Map<String, User> map = new HashMap<String, User>();
- map.put(user1.getUserName(), user1);
- map.put(user2.getUserName(), user2);
- result2 = i.sayHi(map);
- System.out.println("Map结果:" + result2);
- }
- }
结果:
List结果:chenweitang==123==hello==world==
Map结果:hello==world==chenweitang==123==
http://blog.csdn.net/chenweitang123/article/details/6334024
Hessian入门(与Spring集成)
Hessian入门(与Spring集成)
By:wtang
说明 :
- 讲述如何配置Hessian的服务器端(与Spring集成).
- 讲述客户端如何调用
① 使用HessianProxyFactory Hessian代理工厂直接调用
② 使用HessianProxyFactoryBean Hessian代理工厂Bean来完成接口调用.
- 讲述如何配置Hessian的服务器端(与Spring集成).
接口定义类: com.wtang.isay. Isay:
- package com.wtang.isay;
- public interface Isay {
- public String sayHello(String arg1,String arg2);
- }
接口具体实现类: com.wtang.isay. IsayImpl
- package com.wtang.isay;
- public class IsayImpl implements Isay {
- public String sayHello(String arg1, String arg2) {
- return "Hello:" + arg1 + arg2;
- }
- }
配置Web.xml:
- <servlet>
- <servlet-name>remote</servlet-name>
- <!-- 使用Spring的代理Servlet -->
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>namespace</param-name>
- <param-value>classes/remote-servlet</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>remote</servlet-name>
- <url-pattern>/remote/*</url-pattern>
- </servlet-mapping>
配置remote-servlet.xml[该文件位于src目录下,即编译后存在与classes下]:
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <!-- 接口的具体实现类 -->
- <bean id="impl" class="com.wtang.isay.IsayImpl" />
- <!-- 使用Spring的HessianServie做代理 -->
- <bean name="/helloSpring"
- class="org.springframework.remoting.caucho.HessianServiceExporter">
- <!-- service引用具体的实现实体Bean-->
- <property name="service" ref="impl" />
- <property name="serviceInterface" value="com.wtang.isay.Isay" />
- </bean>
- <!-- 可以配置多个HessianServiceExporter代理Bean -->
- </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。
- 讲述客户端如何调用
① 使用HessianProxyFactory Hessian代理工厂直接调用
即:
- package com.wtang.test;
- import java.net.MalformedURLException;
- import com.caucho.hessian.client.HessianProxyFactory;
- import com.wtang.isay.Isay;
- public class NormalClient {
- public static void main(String[] args) throws MalformedURLException {
- //Spring Hessian代理Servelet
- String url = "http://localhost:8080/HessianSpring/remote/helloSpring";
- HessianProxyFactory factory = new HessianProxyFactory();
- Isay api = (Isay) factory.create(Isay.class, url);
- System.out.println(api.sayHello("chen", "weitang"));
- }
- }
输出Hello:chenweitang
- 讲述客户端如何调用
② 使用HessianProxyFactoryBean Hessian代理工厂Bean来完成接口调用.
配置客户端 remote-client.xml:
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <!-- 客户端Hessian代理工厂Bean -->
- <bean id="clientSpring" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
- <!-- 请求代理Servlet路径 -->
- <property name="serviceUrl">
- <value>http://localhost:8080/HessianSpring/remote/helloSpring</value>
- </property>
- <!-- 接口定义 -->
- <property name="serviceInterface">
- <value>com.wtang.isay.Isay</value>
- </property>
- </bean>
- </beans>
调用:
- package com.wtang.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.wtang.isay.Isay;
- public class SpringClient {
- public static void main(String[] args) {
- ApplicationContext contex = new ClassPathXmlApplicationContext(
- "remote-client.xml");
- // 获得客户端的Hessian代理工厂bean
- Isay i = (Isay) contex.getBean("clientSpring");
- System.out.println(i.sayHello("chen", "weitang"));
- }
- }
输出Hello:chenweitang
浙公网安备 33010602011771号