<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工程: