<1>Java 部分:
1.写Spring服务接口以及实现类,这里暂且叫为TadgetManager,TadgetManagerImpl。这些都是我自己实现的暴露
TadgetManager:
2.配置spring mvc和spring hessian组件,配置使用还是比较方便。暴露java服务:
1. spring 配置文件 tadgets-service.xml:
//这里是我们的tadgetManager接口服务实现类bean名称
<bean id="tadgetManager"
class="org.springframework.remoting.caucho.TadgetManagerimpl">
</bean>
//把我们的bean放到spring hessian服务bean把
<bean id="tadgetManagerService"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service">
<ref bean="tadgetManager" />
</property>
<property name="serviceInterface">
<value>com.luodongfu.test.service.TadgetManager</value>
</property>
</bean>
//对外服务请求拦截器,类似java sevlet类
<bean id="publicUrlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/ldfTest=tadgetManagerService
</value>
</property>
</bean>
2. web.xml:记得在我们的j2ee工程里面 web.xml配置请求URL拦截器,就是我们上面配置的publicUrlMapping
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/ ldfTest </url-pattern>
</servlet-mapping>
<2>PHP部分:
[B]3. 建立Hessian返回结果的php DO类:
[B]1. 建立Hessian返回结果的php DO类:
<一> DbRoute:DbRoute.class.php 分库技术使用到
class DbRoute
2. {
3. protected $userId;
4. protected $itemId;
5. protected $xid;
6. protected $routingStratery;
7.
8. public function getItemId()
9. {
10. return $this->itemId;
11. }
12. public function getRoutingStratery()
13. {
14. return $this->routingStratery;
15. }
.................................
BaseDO:BaseDO.class.php,对应com.taobao.common.dao.persistence.BaseDO的java类:
class BaseDO
{
protected $dbRoute;
function __construct()
{
$this->dbRoute = new DbRoute ( );
}
public function getDbRoute()
{
return $this->dbRoute;
}
//数组循环遍历设置dbRoute中各个属性值
public function setDbRoute($dbRoute)
{
foreach ( $dbRoute as $key => $value )
{
$this->dbRoute->__set( $key, $value );
}
}
}
BaseTadgetsDO:BaseTadgetsDO.class.php,对应com.luodongfu.test.domain. BaseTadgetsDO 的java类:
class BaseTadgetsDO extends BaseDO
{
protected $id;
[B]19. 省略各个get,set属性函数这里
protected $catalogId;
protected $tadgetCode;
protected $isvId;
protected $title;
protected $description;
protected $detailRef;
。。。。。。。。。。。。。。。。。。。。。。。。。。。
public function getAppkey()
{
return $this->appkey;
}
public function getCatalogId()
{
return $this->catalogId;
}
public function getDescription()
{
return $this->description;
}
省略各个get,set属性函数这里
TadgetsDO类,对应com.luodongfu.test. TadgetsDO的java类
class TadgetsDO extends BaseTadgetsDO
{
protected $isv;
public function __construct()
{
parent::__construct ();
}
public function getIsv()
{
return $this->isv;
}
public function setIsv($isv)
{
$this->$isv = $isv;
}
public function __set($propName, $propValue)
{
if ("dbRoute" == $propName && count ( $propValue ) > 0)
{
$this->setDbRoute ( $propValue );
} else
{
$this->$propName = $propValue;
}
}
public function __get($propName)
{
return $this->$propName;
}
public function __toString()
{
}
}
4.建立对phphessian客户端对Top服务封装,终于到我们的最重点考察类,呵呵,这里需要详细注释了:
LdfPhpHessianClient,LdfPhpHessianClient.class.php:
require_once 'lib/HessianClient.php';
class LdfPhpHessianClient
{
private $serviceUrl; //hessian服务地址URL
private $proxy; //HessianClient实例,反射机制代理类
private $result; // hessian结果
//构造函数,地球人都知道,呵呵
public function __construct($serviceUrl)
{
//检验hessian服务地址URL
$this->initUrl ( $serviceUrl );
//初始化HessianClient实例,注意这里的&传址调用哦,没有这个&就挂掉哦
$this->proxy = &new HessianClient ( $this->serviceUrl );
}
//小试一把,调用Top TadgetManager中getTadgetById服务来看看个究竟
public function getTadgetById($tadgetId)
{
//检查参数,初始化失败就抛出异常去
if (! isset ( $this->proxy ))
{
throw new NullPointException ( "The hessianClient object is not initial.", Constants::EXCEPTION_NULL_POINT );
}
//检查参数,Null值就异常
if (empty ( $tadgetId ) && ! is_numeric ( $tadgetId ))
{
throw new NullPointException ( "The parameter tadgetId is null or is not a number.", Constants::EXCEPTION_NULL_POINT );
}
//先把结果清空一下,如果是局部变量就不用了
unset($this->result);
//开始调用服务getTadgetById,可能出现异常哦,注意
try {
$this->result = $this->proxy->getTadgetById ( $tadgetId );
}catch(TopException $e)
{
//异常直接返回,打印简单日志
echo "TopException".$e->printStack();
return null;
}
//如果有结果,开始转换结果
if (isset($this->result))
{
//转换结果
return $this->convertObjectValues (new TadgetsDO(),$this->result );
}
return null;
}
//使用反射机制从服务端返回的数组中一个一个调用setXXXXX($obj)函数
private function convertObjectValues($returnObject, $valueObject)
{
//对返回数组的对象反射类
$object = new ReflectionClass ( $returnObject );
//遍历数组中的索引,找到TadgetsDO对应的setXXX($XX)函数
foreach ( $valueObject as $key => $value )
{
//得到setXXX函数名
$methodName = "set" . ucfirst ( $key );
//从TadgetsDO实例中反射一把看看有没有这个函数methodName
$method = $object->getMethod ( $methodName );
//没有该函数就直接返回
if (! $method)
{
continue;
}
//判断函数如果是public和非抽象则调用,和java反射机制一样,呵呵
if ($method->isPublic () && ! $method->isAbstract ())
{
$method->invoke ( $returnObject, $value );
}
}
//其实还有另外一种调用方法不用反射机制,如下调用
/* foreach ( $valueObject as $key => $value )
{
$returnObject->__set ( $key, $value );
}
不过你先要在TadgetsDO类中增加如下方法哦:
public function __set($propName, $propValue)
{
$this->$propName = $propValue;
}
*/
return $returnObject;
}
public function getServiceUrl()
{
return $this->serviceUrl;
}
public function setServiceUrl($serviceUrl)
{
$this->serviceUrl = $serviceUrl;
}
//判断tophessian服务url是否为空
private function initUrl($serviceUrl)
{
if (! isset ( $serviceUrl ))空抛异
{
throw new NullPointException ( "The hessian service url is null.", Constants::EXCEPTION_NULL_POINT );
}
$this->setServiceUrl ( $serviceUrl );
}
public function __autoload()
{
}
}
1. 开始看看我们的结果,终于熬到头了:
2. <?php
//引入我们自己建立类,类似java中的import或.net中的using用法
include_once 'LdfPhpHessianClient.class.php';
3. $testurl = 'http://127.0.0.1/top/tadgetTest';
//创建我们LdfPhpHessianClient实例
4. $LdfPhpHessianClient = new LdfPhpHessianClient ($testurl);
//小试我们的tadget
5. $result=$LdfPhpHessianClient->getTadgetById(22);
//打印tadget内部结果看看
6. print_r($result);
8. $LdfPhpHessianClient = null;
?>
运行结果:
1. [B]使用zend studio for eclipse 6.1建立php工程:
- 大小: 66.6 KB
- 大小: 113.9 KB
- 大小: 54.8 KB
- 大小: 64.3 KB
- 大小: 76.6 KB
- 大小: 170.1 KB
- 大小: 170.1 KB
分享到:
相关推荐
- Java客户端会通过Hessian库与服务器端建立连接,调用服务端暴露的方法。 - 客户端代码需要知道服务器的URL以及要调用的服务接口。Hessian库会自动处理序列化和反序列化,使得客户端可以像调用本地方法一样调用...
基于java实现hessian进行服务器之间数据交互demo项目 实现功能: 1.基于spring 2.5.6+hessian3.1.6带有签名安全机制 2.基于servlet代理机制实现HessianServlet,进行简单IP地址校验功能!
标题 "外部接口调用 使用spring4+hessian4实例" 提供了一个关于如何使用Spring4框架与Hessian4库实现远程服务调用的具体实践。在这个场景中,Hessian4被用作一个轻量级的RPC(远程过程调用)协议,它允许应用程序在...
Hessian是由Caucho公司开发的一种高效的二进制RPC(远程过程调用)协议,它能够使Java对象像本地方法一样在不同的服务器之间进行调用,极大地提高了远程服务调用的效率。 Hessian基于HTTP协议,其主要优点在于轻量...
在本文中,我们将深入探讨如何使用Spring4框架与Hessian4库进行远程服务调用,即所谓的外部接口调用。这种技术允许不同应用程序之间通过网络高效地交换数据和执行服务,尤其是在分布式系统中非常常见。 首先,让...
2. **配置Hessian服务**: 在Spring的配置文件中,使用`<bean>`标签定义HessianExporter,暴露服务接口。 ```xml <bean id="helloHessianExporter" class="org.springframework.remoting.caucho.HessianExporter">...
Spring Hessian是一个基于Java的RPC框架,它允许远程方法...总结来说,Spring Hessian是实现轻量级远程服务调用的一种有效方式。通过理解并掌握其配置、工作原理和优化技巧,开发者可以构建高效、可靠的分布式系统。
本案例主要关注如何将Spring与Hessian进行集成,实现远程服务调用,从而提高系统的分布式能力。 首先,我们要理解Spring的核心概念。Spring通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-...
通过这样的整合,开发者可以利用Spring的强大功能来管理服务生命周期,同时利用Hessian的高效通信能力实现远程服务调用。这在分布式系统中是非常常见的实践,能够提高系统的可扩展性和灵活性。因此,对于Java开发者...
使用eclipse maven工程搭建hessian远程服务demo 分服务端的整合和客户端 建议阅读相关博客http://blog.csdn.net/heisemuyangquan/article/details/79460528
Spring Web Flow(SWF)是一个强大的MVC框架,用于构建具有复杂导航逻辑的Web应用程序,而Hessian则是一种轻量级的二进制RPC协议,能够有效地减少网络传输的数据量,提高服务调用的效率。这两者的结合可以为大型...
在Spring框架中集成Hessian是为了实现远程方法调用(Remote Method Invocation, RMI),这是一种轻量级的序列化协议,可以高效地传输Java对象。Hessian使得服务提供者和服务消费者之间能够通过网络进行快速的数据...
4. 在客户端,通过Spring的`HessianClientInterceptor`或者直接使用`HessianProxyFactory`来创建Hessian代理,调用远程服务。 5. 配置服务器端(如Tomcat)以部署Spring应用上下文和Hessian服务。 6. 运行并测试服务...
在Spring中,Hessian通常用来实现远程服务调用。通过AOP,我们可以对Hessian服务进行拦截,添加如日志、性能监控等额外功能。以下是一个基本的步骤: 1. **创建Hessian服务**:首先,我们需要定义一个服务接口和其...