上一次實踐實作了html form來通路Restlet的PUT和DELETE方法,但傳回資料都是string,僅能作為示範使用。本次實踐将使各方法傳回xml和json格式的資料,友善頁面、程式的讀取和展示。
[b]1.xml庫[/b]
首先是基礎的xml資料格式。Restlet的擴充包org.restlet.ext.xml.jar提供各種xml相關類庫。包中的抽象類XmlRepresentation作為父類提供接口和方法,但不能建立該父類的執行個體,而是需要使用SaxRepresentation和DomRepresentation類的執行個體來執行操作。
将Restlet安裝目錄\Edition Java EE\2.0.10\lib下的org.restlet.ext.xml.jar包加入Build Path。
[b]2.Resource[/b]
修改com.sunny.restlet.order.CustomersResource類,代碼如下:
類中将/customers資源的get和post方法傳回的Representation修改為DomRepresentation,并建立dom檔案來格式化資料。
修改com.sunny.restlet.order.CustomerResource類,代碼如下:
類中将/customer/{custId}的資源的get、put和delete方法傳回的Representation修改為DomRepresentation,并建立dom檔案來格式化資料。
[b]3.測試[/b]
部署程式後,使用浏覽器通路[url]http://localhost:8080/firstSteps/[/url],并将頁面上的五個連結在新頁面中打開通路。
在post.jsp中輸入[name=0, address=0]并送出form,可以看到提示資訊
[list]
[*]<?xml version="1.0" encoding="UTF-8"?>
[*] <customer id="0">
[*] <name>0</name>
[*] <address>0</address>
[*] </customer>
[/list]
說明調用post方法通路/customers傳回xml資料成功,資料被新增。
再次在post.jsp中輸入[name=1, address=1]并送出form,重新整理get customers"連結頁面,可以看到提示資訊
[list]
[*]<?xml version="1.0" encoding="UTF-8"?>
[*] <customers>
[*] <customer id="0">
[*] <name>0</name>
[*] <address>0</address>
[*] </customer>
[*] <customer id="1">
[*] <name>1</name>
[*] <address>1</address>
[*] </customer>
[*] </customers>
[/list]
說明調用get方法通路/customers傳回xml資料成功。
在put.jsp中輸入[id=0, name=00, address=00]并送出form,可以看到提示資訊
[list]
[*]<?xml version="1.0" encoding="UTF-8"?>
[*] <customer id="0">
[*] <name>00</name>
[*] <address>00</address>
[*] </customer>
[/list]
說明調用put方法通路/customer/{custId}傳回xml資料成功,資料被修改。
在get.jsp中輸入[id=0]并送出form,可以看到提示資訊同上。說明調用get方法通路/customer/{custId}傳回xml資料成功。
在delete.jsp中輸入[id=0]并送出form,可以看到提示資訊
[list]
[*]<?xml version="1.0" encoding="UTF-8"?>
[*] <message>success</message>
[/list]
重新整理get customers"連結頁面,可以看到提示資訊
[list]
[*]<?xml version="1.0" encoding="UTF-8"?>
[*] customers>
[*] <customer id="1">
[*] <name>1</name>
[*] <address>1</address>
[*] </customer>
[*] </customers>
[/list]
說明調用delete方法通路/customer/{custId}傳回xml資料成功,資料被删除。
[b]4.使用ClientResource測試[/b]
下面我們使用第五節中用到的ClientResource用戶端方式調用Restlet服務。
修改com.sunny.restlet.order.CustomerResource類,代碼如下:
重新部署firstSteps後,運作Test類,在控制台可以看到輸出資訊
[list]
[*]2013-1-6 16:45:29 org.restlet.engine.http.connector.HttpClientHelper start
[*]資訊: Starting the default HTTP client
[*]<?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>b</name><address>b</address></customer>
[*]<?xml version="1.0" encoding="UTF-8"?><customers><customer id="0"><name>b</name><address>b</address></customer></customers>
[*]2013-1-6 16:45:29 org.restlet.engine.http.connector.HttpClientHelper start
[*]資訊: Starting the default HTTP client
[*]<?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>c</name><address>c</address></customer>
[*]<?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>c</name><address>c</address></customer>
[*]<?xml version="1.0" encoding="UTF-8"?><message>success</message>
[*]<?xml version="1.0" encoding="UTF-8"?><customers/>
[/list]
說明用戶端方式調用成功。
[b]5.json庫[/b]
Json作為現在通用的網際網路資料傳輸格式,Restlet當然要支援的了。Restlet的擴充包org.restlet.ext.json.jar提供各種xml相關類庫。包中的JsonRepresentation類可以作為傳回資料載體使用,其中對多種資料類型提供了支援。
将Restlet安裝目錄\Edition Java EE\2.0.10\lib下的org.restlet.ext.json.jar包和org.json.jar包加入Build Path。
[b]6.Resource[/b]
修改com.sunny.restlet.order.CustomersResource類,代碼如下:
類中将/customers資源的get和post方法傳回的Representation修改為JsonRepresentation。
修改com.sunny.restlet.order.CustomerResource類,代碼如下:
類中将/customer/{custId}的資源的get、put和delete方法傳回的Representation修改為JsonRepresentation。可以看到JsonRepresentation對各資料類型的支援。
[b]7.測試[/b]
重新部署firstSteps後,運作Test類,在控制台可以看到輸出資訊
[list]
[*]2013-1-6 17:32:20 org.restlet.engine.http.connector.HttpClientHelper start
[*]資訊: Starting the default HTTP client
[*]{"address":"b","name":"b"}
[*]{"0":"Customer [name=b, address=b]"}
[*]2013-1-6 17:32:21 org.restlet.engine.http.connector.HttpClientHelper start
[*]資訊: Starting the default HTTP client
[*]{"address":"c","name":"c"}
[*]{"address":"c","name":"c"}
[*]success
[*]{}
[/list]
說明用戶端方式調用資源,傳回json資料成功。
同樣可以通過頁面來通路修改後的程式,但是傳回會是個檔案,下載下傳打開後内容和上面的提示資訊類似。
[b]8.思考[/b]
我們也可以簡單的使用StringRepresentation來達到相同的效果,但是需要自己在代碼中調用Dom4J和JSON類庫來生成json和xml字元串,再使用StringRepresentation将結果傳回。