http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/yangjiang/0502/wsrp.html
楊江 軟件工程師 2005 年 3 月
本文介紹了WSRP 標準,并在兩臺服務器上分別部署遠程 portlet 來驗證通過 WSRP 進行的互操作。
概要 首先隨同本文在IBM WebSphere Portal 5.1服務器上以WSRP協議發布本地Portlet為Remote Portlet,通過WSRP協議消費剛剛發布的Remote Portlet;然后在WSRP參考實現Apache WSRP4J上以WSRP協議發布本地Portlet為Remote Portlet,使用WSRP4J自帶的WSRP Consumer測試剛剛發布的Remote Portlet;最后我們在WebSphere Portal服務器上消費WSRP4J上發布的Remote Portlet以檢驗WSRP在不同應用服務器間的交互性。
引言 OASIS Web Services for Remote Portlets 技術委員會從2002年開始制定WSRP 1.0標準,目的是開發一個允許門戶之間、門戶與其他應用之間,能夠以即插即用的方式進行用戶界面的交互的Web Service標準。
2003年9月3日,OASIS組織發布了WSRP:Web Services for Remote Portlets 1.0標準。WSRP使支持WSRP的容器和符合WSRP的任何門戶之間能夠進行Portlet級別的互操作性。它的定義包括Remote Portlet的一個WSDL(Web Services Description Language ,Web服務描述語言)接口、通過WSDL定義的一套Remote Portlet交互的語義,以及WSRP服務產生的標記片斷的規則。
有了WSRP標準,企業門戶不僅可以混合使用不同廠商的門戶服務器,靈活地部署Portlets,使用WSRP將企業門戶中各個門戶服務器統一起來,充分利用到不同門戶服務器的特有功能和產品特性。企業門戶還可以通過WSRP遠程調用合作伙伴提供的遠程Portlet服務,把合作伙伴的遠程Portlet直接放到本企業的門戶界面中,使得企業和合作伙伴的溝通更加方便快捷。
WSRP給服務供應商帶來了新的商機。服務供應商可以提供Remote Portlet服務,比如天氣預報、股票、新聞、網上定票等服務,企業只需要通過Internet和WSRP協議就可以方便的在企業門戶中使用到這些服務,不需要編寫任何代碼。
在WSRP服務最常見的應用模式中,WSRP 服務是包括表示層與應用程序邏輯的可視的遠程門戶服務;門戶服務器既可以是Remote Portlet的提供者,也可以是Remote Portlet的消費者。門戶服務器可以通過Internet,使用WSRP協議把本地Portlet暴露為Remote Portlet,這樣門戶服務器就是WSRP服務的提供者。門戶服務器也可以通過WSRP通用代理跨過 Internet網絡,使用WSRP協議調用遠程的WSRP服務,這樣門戶服務器就是WSRP服務的消費者。
WSRP提供者也可以把WSRP服務作為Web Service注冊到UDDI服務器上,而WSRP消費者可以到UDDI服務器上查找需要的WSRP服務,進而通過Portlet 代理訪問遠程WSRP服務。
圖1 即插即用的WSRP服務
需要特別指出的是,WSRP服務的消費者也可以是普通的應用程序,通過WSRP協議訪問后臺WSRP Portlet服務,通過COM組件或者ActiveX控件顯示WSRP服務返回的標記片斷。IBM Workplace Client Technology(基于Eclipse Rich Client Platform)中將提供WSRP消費者Plug-in,把Remote Portlet集成到其用戶界面中來。
本文適用于門戶架構師、WebSphere Portal管理員,具有一些 Web Service、WebSphere Portal服務器方面的經驗會有所幫助。
在WebSphere Portal上安裝部署WSRP服務 2002年初,IBM在WebSphere Portal 4.0中提供了其專有技術RPWS,通過Web Service把Portlet發布為Remote Portlet;2004年初,IBM在WebSphere Portal 5.0 Fixpack 2開始提供WSRP的技術預覽;2004年11月,IBM在WebSphere Portal 5.1中提供WSRP的全面支持。
1.安裝Portlet IBM在WebSphere Portal and Lotus Workplace Catalog網站上提供了叫做WebSphere Portal V5.1 Sample Code的應用(Portlet Application),其中有基于Struts框架的使用IBM Portlet API的portlets,也有使用JSR 168 API編寫的portlets。任何人都可以通過IBM Portlet代碼"1wp10004n" 檢索并免費下載這個應用。下面我們在WebSphere Portal上面部署這個Portlet。解壓縮下載的1wp10004n.zip文件,進入1wp10004n\Basic\JSR168目錄,我們會看到jsrHelloJSP.war等4個war文件,這些war文件都是打包的JSR 168 Portlet例子應用。
在WebSphere Portal管理頁面中選擇Portlet 管理-> Web 模塊,選擇"安裝"命令按鈕,選擇jsrHelloJSP.war文件,選擇"下一步"開始安裝即可。在Portlet 管理 ->Portlets可以檢索到剛剛安裝的Hello JSP (JSR 168)。最后我們把這個Portlet放到測試頁面上。結果如圖2。
圖2 Hello JSP(JSR 168)運行結果
2.提供portlet 在WebSphere Portal管理頁面中選擇Portlet 管理-> Web 模塊,搜索標題的開頭為"Hello"的Portlet,在"Hello JSP(JSR 168)"小程序的右邊有五個命令按鈕,選擇最左邊的"提供portlet"按鈕,就可以把這個Portlet發布為Remote Portlet。
圖3提供portlet
在Portlet管理界面中我們看到"成功將portlet Hello JSP(JSR 168)提供為Web服務",并且這個Portlet顯示出"已提供"的標記。
圖4 已提供Portlet
我們剛剛安裝了一個JSR 168 Portlet,通過WSRP把這個portlet提供為Remote Portlet。下面我們將消費這個Remote Portlet。
3.注冊WSRP Producer 在WebSphere Portal管理頁面中選擇Portlet 管理->Web Service,選擇新建Producer。輸入標題,輸入WPS 5.1的WSDL服務定義的URL,比如http://wps51.cn.ibm.com:9081/wps/wsdl/wsrp_service.wsdl
圖5新建Producer
4.消費Remote Portlet 在WebSphere Portal管理頁面中選擇Portlet 管理->Web模塊,選擇"使用"命令按鈕,鼠標左鍵點擊剛注冊的Web Service Provider。
圖 6使用portlet
WebSphere Portal作為WSRP的消費者,通過WSRP協議檢索WSRP提供者提供的Remote Portlet。在圖7我們看到剛剛注冊的"WSRP Producer on WP 5.1"提供了多個Remote Portlet,"選擇"Hello JSP(JSR 168),確認,在圖8中我們看到一個叫做RP[Hello JSP(JSR 168)]的Portlet,我們可以把這個Remote Portlet象本地Portlet一樣部署到測試頁面上,運行結果如圖9所示。
圖 7 選擇Web service
圖 8選擇Web service的結果
圖 9 包含Remote Portlet的測試頁面
安裝JSR 168參考實現Apache Pluto Apache Software Foundation 在2004年12月22日發布了 Java Portlet Specification 1.0參考實現Pluto 1.0.1-rc2版本。版本號中的rc表示release candidate,rc2表示這個版本已經是第二個發布候選版本,離正式版本1.0.1的發布已經很近了。
1 安裝Pluto二進制發行版本 Pluto提供了四種打包方式,其中最簡單的打包方式是和Tomcat 5.5.4(Build Oct 29 2004)捆綁在一起的二進制發行版本,只要在Pluto下載網站下載pluto-1.0.1-rc2.zip文件,解壓縮到指定目錄就可以了。注意:pluto-1.0.1-rc1二進制發行版本采用的是Tomcat 5.0.28。
如果在啟動Tomcat的時候提示啟動系統找不到文件 -Djava.endorsed.dirs=,那么可以在命令行下面執行 set JAVA_HOME=c:\jdk1.5.0
圖 10 Pluto界面
2 安裝Pluto源代碼發行版本 Pluto另外一種常用的發行版本是源代碼發行版本,目前,要在Pluto上自動部署新的portlet,必須使用這種版本。在Pluto下載網站下載pluto-src-1.0.1-rc2.zip文件,參考Pluto安裝指南進行安裝即可。
安裝這種發行版本,事先要下載Tomcat、Marven,在部署的時候要求有Internet連接,部署程序會從Internet上下載需要的java package。
注意,pluto-src-1.0.1-rc2可以使用JDK 1.4.2進行部署,但是不能使用JDK 1.5進行部署。使用JDK 1.5會報如下錯誤:
pluto-src-1.0.1-rc2\portal\src\java\org\apache\pluto\portalImpl\om\common\impl\LanguageImpl.java:58: as of release 1.5, 'enum' is a keyword, and may not be used as an identifier (try -source 1.4 or lower to use 'enum' as an identifier)
3 使用Pluto源代碼發行版本在在Pluto上部署Portlet 設置JAVA_HOME、MAVEN_HOME、PATH等環境變量。
set JAVA_HOME=C:\j2sdk1.4.2 SET MAVEN_HOME=C:\apache\maven-1.0.2 SET PATH=%MAVEN_HOME%\bin;%PATH%
拷貝WebSphere Portal V5.1 Sample Code中的jsrHelloJSP.war到c:\apache目錄。
進入Pluto源代碼發行版本的根目錄,調用maven部署Portlet到Pluto。
CD C:\apache\pluto-src-1.0.1-rc2 maven deploy -Ddeploy=c:\apache\jsrHelloJSP.war
注意:下面的部署新的portlet操作在Pluto
1.0.1-rc2源代碼版本版本中不能工作,但是可以在Pluto運行版本中可以正常工作。
進入Pluto的webapps目錄,我們會看到有個jsrHelloJSP目錄,這里就是部署后的Portlet目錄。
Pluto部署代碼在jsrHelloJSP\WEB-INF\tld目錄下面增加了一個portlet.tld文件,同時在web.xml文件中增加了對做個portlet.tld文件的引用。
<taglib>
<taglib-uri>http://java.sun.com/portlet</taglib-uri>
<taglib-location>/WEB-INF/tld/portlet.tld</taglib-location>
</taglib>
|
我們需要手工刪除部署后的web.xml文件中對于std-portlet.tld的引用內容:
<taglib>
<taglib-uri>http://java.sun.com/portlet</taglib-uri>
<taglib-location>/WEB-INF/tld/std-portlet.tld</taglib-location>
</taglib>
|
部署Portlet到頁面的方法參考Pluto安裝指南即可。需要注意的是Pluto安裝指南中application ID指的就是應用名稱jsrHelloWorld,PortletID指的是web.xml文件中的portlet-guid參數值。
<init-param>
<param-name>portlet-guid</param-name>
<param-value>jsrHelloJSP.Hello JSP Portlet name</param-value>
</init-param>
|
安裝WSRP 參考實現Apache WSRP4J
1 安裝WSRP4J 閱讀WSRP4J安裝文檔,下載Tomcat 5(比如jakarta-tomcat-5.0.30版本),解壓縮到c:\apache\ jakarta-tomcat-5.0.30-wsrp4j。
如果在啟動Tomcat的時候提示啟動系統找不到文件 -Djava.endorsed.dirs=,那么可以在命令行下面執行 set JAVA_HOME=C:\j2sdk1.4.2或者把這一行加入到bin\startup.bat和bin\shutdown.bat里面。
注意:WSRP4J使用的Pluto不是最新的版本,所以WSRP4J要使用JDK 1.4.2,而不是最新的Pluto使用的JDK 1.5。
參考http://ws.apache.org/wsrp4j/contributing/cvs.html,使用cvs client下載WSRP4J源代碼。
set path="C:\Program Files\CVS for NT";%path%
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login
password: anoncvs
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout ws-wsrp4j
|
更改下面三個目錄下面的build.properties.example文件的文件名為build.properties
ws-wsrp4j\build\
ws-wsrp4j\portlets\proxyportlet
ws-wsrp4j\portlets\wsrptest
|
修改上述三個文件build.properties,設置TOMCAT_HOME=C:/apache/ jakarta-tomcat-5.0.30-wsrp4j
安裝WSRP4J到Tomcat 5:
set JAVA_HOME=C:\j2sdk1.4.2
set path=%JAVA_HOME%\bin;%path%
cd ws-wsrp4j\build
install-swing-consumer
install-provider-pluto
|
最后顯示下面字樣,就是已經成功安裝了基于Pluto的WSRP provider,并且安裝了一個測試用Portlet-'wsrptest'。
prepare-producer:
Created dir: C:\Apache\jakarta-tomcat-5.0.30-wsrp4j\webapps\wsrp
…
prepare-provider-pluto:
Copying 13 files to C:\Apache\jakarta-tomcat-5.0.30-wsrp4j\webapps\wsrp
Copying 1 file to C:\Apache\jakarta-tomcat-5.0.30-wsrp4j\webapps\wsrp\WEB-INF\lib
…
BUILD SUCCESSFUL
Total time: 3 seconds
|
2 測試WSRP4J消費者程序 啟動Tomcat,缺省Tomcat監聽8080端口。
set JAVA_HOME=C:\j2sdk1.4.2
Cd C:\apache\jakarta-tomcat-5.0.30-wsrp4j\bin
startup.bat
|
執行腳本C:\apache\ws-wsrp4j\tools\tunnel.bat以啟動Apache Axis TCP Monitor,這個Monitor一般用于web service debug。通常Tomcat監聽8080端口,tunnel腳本缺省監聽8081端口并且向8080端口寫數據。
set CLASSPATH=C:\apache\ws-wsrp4j\driver\SwingConsumer\lib\axis.jar
rem java org.apache.axis.utils.tcpmon [listening_port] [target_host] [target_port]
java org.apache.axis.utils.tcpmon 8081 localhost 8080
|
運行WSRP Consumer(消費程序,調用遠程Remote Portlet),缺省WSRP Consumer通過8081連接WSRP Producer。
cd C:\apache\ws-wsrp4j\driver\SwingConsumer
run.bat
|
圖 11 WSRP4J Consumer
3 在WSRP4J上發布新的Remote Portlet 從%Pluto_Home%\webapps目錄下拷貝testsuite目錄到%WSRP4J_Home%\webapps目錄下。
從%Pluto_Home%\webapps\pluto\WEB-INF\data\portletentityregistry.xml文件中拷貝testsuite.TestPortlet1的定義到%WSRP4J_Home%\webapps\wsrp\WEB-INF\data\portletentityregistry.xml文件中。
<application id="3">
<definition-id>testsuite</definition-id>
<portlet id="1">
<definition-id>testsuite.TestPortlet1</definition-id>
<preferences>
<pref-name>TestName4</pref-name>
<pref-value>TestValue4</pref-value>
<read-only>true</read-only>
</preferences>
</portlet>
</application>
|
你也可以通過Pluto源代碼的maven deploy命令在Pluto上面部署新的Portlet,然后把相應的目錄(比如jsrHelloJSP)拷貝到%WSRP4J_Home%\webapps目錄下,然后編輯相應的WSRP4J portlet注冊文件。
4 為WSRP4J Consumer提供新的WSRP Portlet服務 接下來為WSRP Consumer配置要消費的Remote Portlet的handler、放置Remote Portlet的測試頁面。在driver/SwingConsumer/persistence/portlets目錄下面增加一個文件,org.apache.wsrp4j.consumer.driver.WSRPPortletImpl@WSRP4J_3_1.xml。
<?xml version="1.0"?>
<Portlet>
<portlet-key>
<portlet-handle>3.1</portlet-handle>
<producer-id>1</producer-id>
</portlet-key>
<parent-handle>3.1</parent-handle>
</Portlet>
|
修改driver/SwingConsumer/persistence/pages/org.apache.wsrp4j.consumer.app.driver.PageImpl@WSRP4JTestPortlets.xml文件,
<?xml version="1.0" encoding="UTF-8"?>
<page pageID="1" title="WSRP4J Test"><portlet-key xsi:type="java:org.apache.wsrp4j.consumer.driver.PortletKeyImpl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<portlet-handle>3.1</portlet-handle>
<producer-id>1</producer-id>
</portlet-key></page>
|
重新啟動WSRP服務和WSRP消費者程序,運行結果如下:
圖12 WSRP Consumer測試新增加的Remote Portlet - Pluto testsuite
如果是把jsrHelloJSP portlet發布到WSRP4J上面,運行結果如下:
圖 13 WSRP Consumer測試新增加的Remote Portlet - jsrHelloJSP
WebSphere Portal調用WSRP4J發布的Remote Portlet 現在我們已經有兩個WSRP的支撐環境了,他們都能各自獨立地發布和消費Remote Portlet。現在讓我們測試一下他們的互通性。
1. 注冊WSRP Producer 在WebSphere Portal管理頁面中選擇Portlet 管理->Web Service,選擇"新建Producer"。輸入標題,輸入WSRP4J的WSDL服務定義的URL,比如http://localhost:8081/wsrp/wsdl/wsrp4j_service.wsdl。
圖14 新建Producer
圖15 成功創建Producer
2.消費Remote Portlet 在WebSphere Portal管理頁面中選擇Portlet 管理->Web模塊,選擇"使用"命令按鈕,鼠標左鍵點擊剛注冊的Web Service Provider。 WebSphere Portal作為WSRP的消費者,通過WSRP協議檢索WSRP提供者提供的Remote Portlet。在圖16我們看到WSRP4J提供了多個Remote Portlet,"選擇"Hello JSP portlet (JSR 168) 和WSRP Test Portlet。我們可以把這個Remote Portlet象本地Portlet一樣部署到測試頁面上,運行結果如圖17所示 。
圖 16 選擇Web service
圖17 WebSphere Portal消費WSRP4J提供的Remote Portlet
注意事項: 1.如果需要通過不同的IP地址和端口訪問WSRP4J,需要修改WSRP4J的webapps\wsrp\wsdl\wsrp4j_service.wsdl文件中的主機名和端口號。
2. WebSphere注冊WSRP4J為web service producer后,這個Producer的Registration handle 為192.168.200.132_1107045794015_2(例子)。相應的WSRP4J會產生一個兩個文件登記WebSphere Portal為Consumer,這兩個文件分別是org.apache.wsrp4j.producer.driver.RegistrationImpl@14647882.xml,和org.apache.wsrp4j.producer.provider.driver.ConsumerPortletRegistrationImpl@192.168.200.132_1107045794015_2.xml。
3. WebSphere Portal在"消費"WSRP4J提供的Remote Portlet的時候,WSRP會修改webapps\wsrp\WEB-INF\data\ portletentityregistry.xml文件。
比如這個文件中原始的關于jsrHelloJSP的注冊信息如下:
<application id="5">
<definition-id>jsrHelloJSP</definition-id>
<portlet id="1">
<definition-id>jsrHelloJSP.Hello JSP Portlet name</definition-id>
<preferences>
<pref-name>TestName4</pref-name>
<pref-value>TestValue4</pref-value>
<read-only>true</read-only>
</preferences>
</portlet>
</application>
|
在WebSphere Portal把jsrHelloJSP注冊以后,WSRP4J會復制一份portlet的定義,并且指定新的portlet的id(比如192.168.200.132_1107046841484_0)。結果如下:
<application id="5">
<definition-id>jsrHelloJSP</definition-id>
<portlet id="192.168.200.132_1107046841484_0">
<definition-id>jsrHelloJSP.Hello JSP Portlet name</definition-id>
<preferences>
<pref-name>TestName4</pref-name>
<pref-value>TestValue4</pref-value>
<read-only>true</read-only>
</preferences>
</portlet>
<portlet id="1">
<definition-id>jsrHelloJSP.Hello JSP Portlet name</definition-id>
<preferences>
<pref-name>TestName4</pref-name>
<pref-value>TestValue4</pref-value>
<read-only>true</read-only>
</preferences>
</portlet>
</application>
|
4. 通過WSRP注冊的Portlet的標題是從該Portlet的portlet.xml文件中portlet-info->title標記中獲得的。
<portlet-info>
<title>Hello JSP portlet (JSR 168) Title</title>
<short-title>Hello Title</short-title>
<keywords>WSRP, Hello JSP</keywords>
</portlet-info>
|
結束語 WSRP規范小組和JSR 168 Portlet規范小組聯系非常緊密,最初的WSRP規范中定義的Portlet是要求滿足JSR 168標準的Portlet,支持J2EE/JSR 168規范的門戶服務器很多都宣稱將支持WSRP規范。IBM WebSphere Portal不僅可以把JSR 168 Portlet發布為Remote Portlet,而且也可以把IBM version 4 portlet API編寫的Portlet發布為Remote Portlet。微軟在2004年發布了WSRP Web Part toolkit for SharePoint,以支持SharePoint消費Remote Portlet。
參考資料
關于作者 楊江,IBM Innovation Center高級信息工程師,主要從事WebSphere Portal Server和WebSphere Application Server的技術支持工作,對Linux、Web Service和Web安全有濃厚興趣。您可以通過yjiang@cn.ibm.com和他聯系。 |

|