利用Hessian如何实现Webservice
利用Hessian如何实现Webservice
-
Hessian是 一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的 WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。Hessian官网:http://hessian.caucho.com/Hessian可 通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。也可Spring框架整合,通过它的 DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的 server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,建议采用面向接口编程,Hessian服务通过接口暴露。Hessian处理过程示意图:客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果下面详细介绍最常用的两种方式实现Hessian提供webservice:纯Hessian实现配合Spring框架实现在开始之前当然需要到官网上下载相关的lib包,放入项目的/WEB-INF/lib/下【一】、纯Hessian实现步骤:1.基本代码首先编写一个服务的接口类:HelloHessian.javaJava代码
1. package michael.hessian;
2. import java.util.List;
3. import java.util.Map;
4.
5. /**
6. * @author michael
7. *
8. */
9. public interface HelloHessian {
10.
11. String sayHello();
12.
13. MyCar getMyCar();
14.
15. List myLoveFruit();
16.
17. Map<STRING,&NBSP;STRING> myBabays();
18.
19. }
一个java bean文件MyCar.java:Java代码1. package michael.hessian;
2.
3. import java.io.Serializable;
4.
5. /**
6. * @author michael
7. *
8. */
9. public class MyCar implements Serializable {
10.
11. /**
12. *
13. */
14. private static final long serialVersionUID = 4736905401908455439L;
15.
16. private String carName;
17.
18. private String carModel;
19.
20. /**
21. * @return the carName
22. */
23. public String getCarName() {
24. return carName;
25. }
26.
27. /**
28. * @return the carModel
29. */
30. public String getCarModel() {
31. return carModel;
32. }
33.
34. /**
35. * @param pCarName the carName to set
36. */
37. public void setCarName(String pCarName) {
38. carName = pCarName;
39. }
40.
41. /**
42. * @param pCarModel the carModel to set
43. */
44. public void setCarModel(String pCarModel) {
45. carModel = pCarModel;
46. }
47.
48. /**
49. * @see java.lang.Object#toString()
50. * @return
51. */
52. @Override
53. public String toString() {
54. return "my car name:[" + this.carName + "] model:[" + this.carModel
55. + "].";
56. }
57.
58. }
服务端接口的实现类:HelloHessianImpl.javaJava代码1. package michael.hessian.impl;
2.
3. import java.util.ArrayList;
4. import java.util.HashMap;
5. import java.util.List;
6. import java.util.Map;
7.
8. import michael.hessian.HelloHessian;
9. import michael.hessian.MyCar;
10.
11. /**
12. * @author michael
13. *
14. */
15. public class HelloHessianImpl extends HessianServlet implements HelloHessian {
16.
17. public MyCar getMyCar() {
18. MyCar car = new MyCar();
19. car.setCarName("阿斯顿·马丁");
20. car.setCarModel("One-77");
21. return car;
22. }
23.
24. public Map<STRING,&NBSP;STRING> myBabays() {
25. Map<STRING,&NBSP;STRING> map = new HashMap<STRING,&NBSP;STRING>();
26. map.put("son", "孙吴空");
27. map.put("daughter", "孙小美");
28. return map;
29. }
30.
31. public List myLoveFruit() {
32. List list = new ArrayList();
33. list.add("apple");
34. list.add("kiwi");
35. list.add("orange");
36. return list;
37. }
38.
39. public String sayHello() {
40. return "welcom to Hessian";
41. }
42.
43. }
2.配置文件web.xml修改在web.xml配置文件里增加如下信息:Xml代码1. <servlet>
2. <servlet-name>HelloHessian</< span>servlet-name>
3. <servlet-class>
4. com.caucho.hessian.server.HessianServlet
5. </< span>servlet-class>
6. <init-param>
7. <param-name>home-class</< span>param-name>
8. <param-value>michael.hessian.impl.HelloHessianImpl</< span>param-value>
9. </< span>init-param>
10. <init-param>
11. <param-name>home-api</< span>param-name>
12. <param-value>michael.hessian.HelloHessian</< span>param-value>
13. </< span>init-param>
14. <load-on-startup>1</< span>load-on-startup>
15. </< span>servlet>
16. <servlet-mapping>
17. <servlet-name>HelloHessian</< span>servlet-name>
18. <url-pattern>/HessianService</< span>url-pattern>
19. </< span>servlet-mapping>
20. <servlet-mapping>
3.java客户端验证Java代码1. package michael.hessian.client;
2.
3. import java.net.MalformedURLException;
4. import java.util.Map;
5.
6. import michael.hessian.HelloHessian;
7. import michael.hessian.MyCar;
8.
9. import com.caucho.hessian.client.HessianProxyFactory;
10.
11. /**
12. * @author michael
13. *
14. */
15. public class HessianClientTest {
16.
17. /**
18. * @param args
19. */
20. public static void main(String[] args) {
21. String url = "http://localhost:8082/J2EE_sjsky/HessianService";
22. HessianProxyFactory factory = new HessianProxyFactory();
23. try {
24. HelloHessian hello = (HelloHessian) factory.create(
25. HelloHessian.class, url);
26. System.out.println(hello.sayHello());
27.
28. MyCar car = hello.getMyCar();
29. System.out.println(car.toString());
30.
31. for (Map.Entry<STRING,&NBSP;STRING> entry : hello.myBabays().entrySet()) {
32. System.out.println(entry.getKey() + " " + entry.getValue());
33. }
34.
35. for (String str : hello.myLoveFruit()) {
36. System.out.println(str);
37. }
38.
39. } catch (MalformedURLException e) {
40. e.printStackTrace();
41. }
42.
43. }
44.
45. }
运行结果如下:Java代码1. welcom to Hessian
2. my car name:[阿斯顿·马丁] model:[One-77].
3. daughter 孙小美
4. son 孙吴空
5. apple
6. kiwi
7. orange
【二】、spring+hessian 实现服务端:1.基本代码见上面的demo2.修改配置文件在web.xml,增加内容如下:Xml代码1. <servlet>
2. <servlet-name>springhessian</< span>servlet-name>
3. <servlet-class>
4. org.springframework.web.servlet.DispatcherServlet
5. </< span>servlet-class>
6.
7. <bean name="/helloHessianService"
8. class="org.springframework.remoting.caucho.HessianServiceExporter">
9.
10. <property name="service" ref="helloHessianImpl" />
11.
12. <property name="serviceInterface"
13. value="michael.hessian.HelloHessian" />
14. </< span>bean>
15. </< span>beans>
3.java客户端验证和上面的例子相似,只需要把访问的url替换成新的即可如下:Java代码1. String url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService
运行结果和上面例子一样。4.spring配置客户端增加一个spring的bean配置文件hessian-client.xmlXml代码1. <?xml version="1.0" encoding="UTF-8"?>
2. >
3. <beans>
4. <bean id="helloHessianClient"
5. class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
6. <property name="serviceUrl">
7. <value>
8. http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService
9. </< span>value>
10. </< span>property>
11. <property name="serviceInterface"
12. value="michael.hessian.HelloHessian" />
13. </< span>bean>
14. </< span>beans>
测试代码HessianSpringClient.java:Java代码1. package michael.hessian.client;
2.
3. import java.util.Map;
4.
5. import michael.hessian.HelloHessian;
6. import michael.hessian.MyCar;
7.
8. import org.springframework.context.ApplicationContext;
9. import org.springframework.context.support.ClassPathXmlApplicationContext;
10.
11. /**
12. * @author michael
13. *
14. */
15. public class HessianSpringClient {
16.
17. /**
18. * @param args
19. */
20. public static void main(String[] args) {
21. try {
22. ApplicationContext context = new ClassPathXmlApplicationContext(
23. "hessian-client.xml");
24.
25. HelloHessian hello = (HelloHessian) context
26. .getBean("helloHessianClient");
27.
28. System.out.println(hello.sayHello());
29.
30. MyCar car = hello.getMyCar();
31. System.out.println(car.toString());
32.
33. for (Map.Entry<STRING,&NBSP;STRING> entry : hello.myBabays().entrySet()) {
34. System.out.println(entry.getKey() + " " + entry.getValue());
35. }
36.
37. for (String str : hello.myLoveFruit()) {
38. System.out.println(str);
39. }
40. } catch (Exception e) {
41. e.printStackTrace();
42. }
43.
44. }
45.
46. }
运行结果和上面完全一致。5.com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d异常处理我在spring+hessian整合测试过程中,客户端调用时,发生了异常,而服务端错误内容如下:Java代码1. -- :: org.apache.catalina.core.StandardWrapperValve invoke
2. 严重: Servlet.service() for servlet remoting threw exception
3. com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d
4. at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:)
5. at com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:)
6. at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:)
7. at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:)
8. at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:)
9. at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:)
10. at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:)
11. at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:)
12. at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:)
13. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:)
14. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:)
15. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:)
16. at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:)
17. at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
18. at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
19. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
20. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
21. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:)
22. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:)
23. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:)
24. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:)
25. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:)
26. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:)
27. at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:)
28. at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:)
29. at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:)
30. at java.lang.Thread.run(Thread.java:)
利用Hessian如何实现Webservice的更多相关文章
- 解析利用wsdl.exe生成webservice代理类的详解
利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...
- 第二篇:利用shell脚本执行webservice请求——基于soap
1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...
- 利用JavaScriptSOAPClient直接调用webService --完整的前后台配置与调用示例
JavaScriptSoapClient下载地址:https://archive.codeplex.com/?p=javascriptsoapclient JavaScriptSoapClient的D ...
- 利用CXF框架开发webservice
开发服务端代码 1. web.xml文件中添加cxf的servlet 2. 定义接口 @WebService(targetNamespace="http://UserInfo.ws.com& ...
- svc6 控制台程序利用SoapToolkit3.0调用WebService
1. 首先要安装SoapToolkit3.0安装包并安装(我的安装目录为:C:\Program Files\Common Files) 2. 新建vc控制台程序(空项目),项目名称:WinConsol ...
- 在PHP中利用wsdl创建标准webservice
参照整理: http://bbs.php100.com/read-htm-tid-95228.html http://www.ieliwb.com/wsdl-create-soapdiscovery/ ...
- 利用wsdl2java工具生成webservice的客户端代码
1.JDK环境 2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME ...
- 利用MyEclipse开发一个webservice接口
一直以来对于接口这个东西都很好奇,各种客户也一直在说那个什么什么数据我们提供给你们一个接口就好了,结果还是不是很明白.于是乎就有了下面的小故事,接下来我们就进入正文吧 ---大概可以分为这样的步骤 1 ...
- cxf利用接口规范写法发布webservice
package cn.itcast.cxf; import javax.jws.WebService; @WebService public interface IHelloService { pub ...
随机推荐
- SqlServer正在执行的sql语句
SELECT [Spid] = session_Id ,ecid ,[Database] = DB_NAME(sp.dbid) ,[User] = nt_username ,[Status] = er ...
- Analyzer使用第二Y轴,以及同一分析图不同量值使用不同的图形样式
Analyzer的建立分析图后,图中有两个量值,希望能显示成不同的图形样式,如一个是柱图.一个是线图. 1.设置显示多个量值: 3.设置显示出图例,即表明图中量值内容的说明: 2.右键图例中要修改为不 ...
- 浅谈IT
在没有学计算机应用技术之前我对IT的认知度几乎为零,曾经还天真的认为IT就是白领,只要做上IT行业,以后便可高枕无忧.后来阴差阳错学了这个专业.通过一年的学习,虽然学艺不精但多少对IT行业了解的一知半 ...
- IOS 8 关于 Touch ID
一.什么是Touch ID? Touch ID是在iPhone 5s后的设备上出现的指纹识别.Apple在IOS 8中开放给第三方APP使用. 可以使用 Touch ID 来验证用户的身份,用户经验证 ...
- Leetcode#127 Word Ladder
原题地址 BFS Word Ladder II的简化版(参见这篇文章) 由于只需要计算步数,所以简单许多. 代码: int ladderLength(string start, string end, ...
- NYOJ-85 有趣的数 AC 分类: NYOJ 2014-01-17 21:42 240人阅读 评论(0) 收藏
这道题目就是,找规律,小学奥数,找规律不难吧, #include<stdio.h> int sc(int x); int main(){ int n=0; int num,cs,k; sc ...
- matrix_world_final_2012
B http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98759#problem/B 题意:瓶子侧躺在数轴上,瓶底在xlow,瓶口在xhigh ...
- rivers ioi2005 树形dp
说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕: 题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心. 题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法, ...
- 在C语言中嵌入汇编语言
TMS320C28x编译器允许在C程序中嵌入汇编指令,通过下面声明实现: asm(“assembler text”); 其中assembler text指汇编代码.asm指令一般用来处理C/C++语句 ...
- C#&java重学笔记(泛型)
C#部分: 1.泛型的出现主要用于解决类.接口.委托.方法的通用性,通过定义泛型类.接口.委托.方法,可以让不同类型的数据使用相同运算规则处理数据,方便了开发. 2.利用System.Nullable ...