自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

小試Hessian實(shí)現(xiàn)Webservice

開(kāi)發(fā) 后端
Hessian是一個(gè)輕量級(jí)的remoting on http工具,采用的是Binary RPC協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù),同時(shí)又具有防火墻穿透能力。

Hessian是一個(gè)輕量級(jí)的remoting on http工具,采用的是Binary RPC協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù),同時(shí)又具有防火墻穿透能力。Hessian一般是通過(guò)Web應(yīng)用來(lái)提供服務(wù),因此非常類(lèi)似于平時(shí)我們用的WebService。只是它不使用SOAP協(xié)議,但相比webservice而言更簡(jiǎn)單、快捷。

Hessian官網(wǎng):http://hessian.caucho.com/

Hessian可通過(guò)Servlet提供遠(yuǎn)程服務(wù),需要將匹配某個(gè)模式的請(qǐng)求映射到Hessian服務(wù)。也可Spring框架整合,通過(guò)它的DispatcherServlet可以完成該功能,DispatcherServlet可將匹配模式的請(qǐng)求轉(zhuǎn)發(fā)到Hessian服務(wù)。Hessian的server端提供一個(gè)servlet基類(lèi), 用來(lái)處理發(fā)送的請(qǐng)求,而Hessian的這個(gè)遠(yuǎn)程過(guò)程調(diào)用,完全使用動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)的,,建議采用面向接口編程,Hessian服務(wù)通過(guò)接口暴露。

Hessian處理過(guò)程示意圖:

客戶端——>序列化寫(xiě)到輸出流——>遠(yuǎn)程方法(服務(wù)器端)——>序列化寫(xiě)到輸出流 ——>客戶端讀取輸入流——>輸出結(jié)果

下面詳細(xì)介紹最常用的兩種方式實(shí)現(xiàn)Hessian提供webservice:

純Hessian實(shí)現(xiàn)

配合Spring框架實(shí)現(xiàn)

在開(kāi)始之前當(dāng)然需要到官網(wǎng)上下載相關(guān)的lib包,放入項(xiàng)目的/WEB-INF/lib/下

【一】、純Hessian實(shí)現(xiàn)步驟:

1.基本代碼

首先編寫(xiě)一個(gè)服務(wù)的接口類(lèi):HelloHessian.java

Java代碼

  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 myBabays();     
  18.     
  19. }   

 

一個(gè)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. }   

 

服務(wù)端接口的實(shí)現(xiàn)類(lèi):HelloHessianImpl.java

Java代碼

  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 myBabays() {     
  25.         Map map = new HashMap();     
  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>HelloHessianservlet-name>    
  3.         <servlet-class>    
  4.             com.caucho.hessian.server.HessianServlet     
  5.         servlet-class>    
  6.         <init-param>    
  7.             <param-name>home-classparam-name>    
  8.             <param-value>michael.hessian.impl.HelloHessianImplparam-value>    
  9.         init-param>    
  10.         <init-param>    
  11.             <param-name>home-apiparam-name>    
  12.             <param-value>michael.hessian.HelloHessianparam-value>    
  13.         init-param>    
  14.         <load-on-startup>1load-on-startup>    
  15.     servlet>    
  16.     <servlet-mapping>    
  17.         <servlet-name>HelloHessianservlet-name>    
  18.         <url-pattern>/HessianServiceurl-pattern>    
  19.     servlet-mapping>    
  20.     <servlet-mapping>    

 

 

3.java客戶端驗(yàn)證

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 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. }    

 

運(yùn)行結(jié)果如下:

Java代碼

  1. welcom to Hessian     
  2. my car name:[阿斯頓·馬丁] model:[One-77].     
  3. daughter   孫小美     
  4. son   孫吳空     
  5. apple     
  6. kiwi     
  7. orange   

 

【二】、spring+hessian 實(shí)現(xiàn)服務(wù)端:

1.基本代碼見(jiàn)上面的demo

2.修改配置文件

在web.xml,增加內(nèi)容如下:

Xml代碼

  1. <servlet>    
  2.         <servlet-name>springhessianservlet-name>    
  3.         <servlet-class>    
  4.             org.springframework.web.servlet.DispatcherServlet     
  5.         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.     bean>    
  15. beans>  

3.java客戶端驗(yàn)證

和上面的例子相似,只需要把訪問(wèn)的url替換成新的即可如下:

Java代碼

  1. String url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService   

 

運(yùn)行結(jié)果和上面例子一樣。

4.spring配置客戶端

增加一個(gè)spring的bean配置文件hessian-client.xml

Xml代碼

  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.             value>    
  10.         property>    
  11.         <property name="serviceInterface"    
  12.             value="michael.hessian.HelloHessian" />    
  13.     bean>    
  14. beans>    

測(cè)試代碼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 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. }   

 

運(yùn)行結(jié)果和上面完全一致。

5.com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d異常處理

我在spring+hessian整合測(cè)試過(guò)程中,客戶端調(diào)用時(shí),發(fā)生了異常,而服務(wù)端錯(cuò)誤內(nèi)容如下:

Java代碼

  1. 2011-4-25 16:14:44 org.apache.catalina.core.StandardWrapperValve invoke     
  2. 嚴(yán)重: 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:2882)     
  5.     at com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2830)     
  6.     at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1362)     
  7.     at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:272)     
  8.     at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:249)     
  9.     at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:221)     
  10.     at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:67)     
  11.     at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:147)     
  12.     at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)     
  13.     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:819)     
  14.     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)     
  15.     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399)     
  16.     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:364)     
  17.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)     
  18.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)     
  19.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)     
  20.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)     
  21.     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)     
  22.     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)     
  23.     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)     
  24.     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)     
  25.     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)     
  26.     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)     
  27.     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)     
  28.     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)     
  29.     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)     
  30.     at java.lang.Thread.run(Thread.java:619)   

經(jīng)查資料發(fā)現(xiàn)原始是hessian和spring的版本不兼容引起的,重新下載hessian-3.1.6.jar導(dǎo)入項(xiàng)目,一起運(yùn)行正常,測(cè)試完全通過(guò)。

【編輯推薦】

  1. 高手Java核心技術(shù)學(xué)習(xí)筆記
  2. 告訴你怎樣學(xué)Java才是硬道理
  3. 如何獲取Sun推出的Java認(rèn)證
  4. 共同學(xué)習(xí)Java環(huán)境變量
  5. JAVA環(huán)境變量的設(shè)置
責(zé)任編輯:金賀 來(lái)源: ITEYE博客
相關(guān)推薦

2009-02-04 17:39:14

ibmdwWebSphereDataPower

2010-08-13 10:56:58

FlexWebservice

2021-05-20 07:56:35

Bean容器Spring

2011-07-07 15:32:07

2014-06-06 13:42:26

iOS 8QR CodeWWDC2014

2012-05-03 10:24:02

ApacheMINAJava

2011-04-01 11:16:06

hessian

2021-01-08 09:07:19

Scrapy框架爬蟲(chóng)

2009-08-13 15:16:00

Eclipse建立We

2017-05-04 21:15:30

Android分辨率

2022-08-06 08:41:18

序列化反序列化Hessian

2024-06-12 07:48:24

C#WebService.NET

2010-12-06 09:10:02

LightSwitch

2010-04-10 16:56:20

云安全掃描工具惡意攻擊

2021-03-08 08:21:19

詞云數(shù)據(jù)可視化大數(shù)據(jù)

2009-06-18 10:19:00

Spring集成XFiWebService

2011-11-29 10:23:47

JSPaxiswebservice

2010-03-05 17:25:07

sharepoint

2012-02-24 10:48:56

語(yǔ)盒開(kāi)源

2009-08-06 16:44:03

C#創(chuàng)建WebServ
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)