热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

小试Hessian实现Webservice

2019独角兽企业重金招聘Python工程师标准Hessian是一个轻量级的remotingonhttp工具,采用的是BinaryRPC协议,所以它很适合于发送

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

package michael.hessian;     
import java.util.List;     
import java.util.Map;     /**    * @author michael    *     */    
public interface HelloHessian {     String sayHello();     MyCar getMyCar();     List myLoveFruit();     Map myBabays();     }

一个java bean文件MyCar.java:

Java代码

package michael.hessian;     import java.io.Serializable;     /**    * @author michael    *     */    
public class MyCar implements Serializable {     /**    *     */    private static final long serialVersionUID = 4736905401908455439L;     private String carName;     private String carModel;     /**    * @return the carName    */    public String getCarName() {     return carName;     }     /**    * @return the carModel    */    public String getCarModel() {     return carModel;     }     /**    * @param pCarName the carName to set    */    public void setCarName(String pCarName) {     carName = pCarName;     }     /**    * @param pCarModel the carModel to set    */    public void setCarModel(String pCarModel) {     carModel = pCarModel;     }     /**    * @see java.lang.Object#toString()    * @return    */    @Override    public String toString() {     return "my car name:[" + this.carName + "] model:[" + this.carModel     + "].";     }     }

服务端接口的实现类:HelloHessianImpl.java

Java代码

package michael.hessian.impl;     import java.util.ArrayList;     
import java.util.HashMap;     
import java.util.List;     
import java.util.Map;     import michael.hessian.HelloHessian;     
import michael.hessian.MyCar;     /**    * @author michael    *     */    
public class HelloHessianImpl extends HessianServlet implements HelloHessian {     public MyCar getMyCar() {     MyCar car = new MyCar();     car.setCarName("阿斯顿·马丁");     car.setCarModel("One-77");     return car;     }     public Map myBabays() {     Map map = new HashMap();     map.put("son", "孙吴空");     map.put("daughter", "孙小美");     return map;     }     public List myLoveFruit() {     List list = new ArrayList();     list.add("apple");     list.add("kiwi");     list.add("orange");     return list;     }     public String sayHello() {     return "welcom to Hessian";     }     }

2.配置文件web.xml修改

在web.xml配置文件里增加如下信息:

Xml代码

    HelloHessianservlet-name>        com.caucho.hessian.server.HessianServlet     servlet-class>        home-classparam-name>    michael.hessian.impl.HelloHessianImplparam-value>    init-param>        home-apiparam-name>    michael.hessian.HelloHessianparam-value>    init-param>    1load-on-startup>    servlet>        HelloHessianservlet-name>    /HessianServiceurl-pattern>    servlet-mapping>    

3.java客户端验证

Java代码

package michael.hessian.client;     import java.net.MalformedURLException;     
import java.util.Map;     import michael.hessian.HelloHessian;     
import michael.hessian.MyCar;     import com.caucho.hessian.client.HessianProxyFactory;     /**    * @author michael    *    */    
public class HessianClientTest {     /**    * @param args    */    public static void main(String[] args) {     String url = "http://localhost:8082/J2EE_sjsky/HessianService";     HessianProxyFactory factory = new HessianProxyFactory();     try {     HelloHessian hello = (HelloHessian) factory.create(     HelloHessian.class, url);     System.out.println(hello.sayHello());     MyCar car = hello.getMyCar();     System.out.println(car.toString());     for (Map.Entry entry : hello.myBabays().entrySet()) {     System.out.println(entry.getKey() + "   " + entry.getValue());     }     for (String str : hello.myLoveFruit()) {     System.out.println(str);     }     } catch (MalformedURLException e) {     e.printStackTrace();     }     }     }

运行结果如下:

Java代码

welcom to Hessian     
my car name:[阿斯顿·马丁] model:[One-77].     
daughter   孙小美     
son   孙吴空     
apple     
kiwi     
orange

【二】、spring+hessian 实现服务端:

1.基本代码见上面的demo

2.修改配置文件

在web.xml,增加内容如下:

Xml代码

    springhessianservlet-name>        org.springframework.web.servlet.DispatcherServlet     servlet-class>                bean>    
beans>

3.java客户端验证

和上面的例子相似,只需要把访问的url替换成新的即可如下:

Java代码

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

运行结果和上面例子一样。

4.spring配置客户端

增加一个spring的bean配置文件hessian-client.xml

Xml代码

xml version="1.0" encoding="UTF-8"?>    
>    
                http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService     value>    property>        bean>    
beans>

测试代码HessianSpringClient.java:

Java代码

package michael.hessian.client;     import java.util.Map;     import michael.hessian.HelloHessian;     
import michael.hessian.MyCar;     import org.springframework.context.ApplicationContext;     
import org.springframework.context.support.ClassPathXmlApplicationContext;     /**    * @author michael    *     */    
public class HessianSpringClient {     /**    * @param args    */    public static void main(String[] args) {     try {     ApplicationContext context = new ClassPathXmlApplicationContext(     "hessian-client.xml");     HelloHessian hello = (HelloHessian) context     .getBean("helloHessianClient");     System.out.println(hello.sayHello());     MyCar car = hello.getMyCar();     System.out.println(car.toString());     for (Map.Entry entry : hello.myBabays().entrySet()) {     System.out.println(entry.getKey() + "   " + entry.getValue());     }     for (String str : hello.myLoveFruit()) {     System.out.println(str);     }     } catch (Exception e) {     e.printStackTrace();     }     }     }

运行结果和上面完全一致。


转:https://my.oschina.net/ydsakyclguozi/blog/387356



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 1.WebServicea.定义:WebService是一种跨编程语言和跨操作系统平台的远程调用技术b.三大技术:XMLXSD,SOAP, ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
author-avatar
小花姐姐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有