loading...
您现在的位置: 北极星首页 > 技术文章 > 常用资料 > 电力信息化 > 遗留Web页与Portlet的页面到页面通信

遗留Web页与Portlet的页面到页面通信

来源:互连网 作者:佚名 发布日期:2008-8-6 13:42:47
关键词:  协作办公 通信 web

级别:中级

HongqingSong,WebSphere顾问,IBM
RichardScott,架构师,eServerSolutionsEnablement,IBMDallas

2005年9月1日

本文描述了两种用于将信息从遗留Web页传递到Portlet的方法。接收Portlet既可以是JSR168Portlet,又可以是IBMAPIPortlet。文中的下载部分包含用于两种场景的示例代码,可供您安装和部署。示例演示了如何使用静态链接(包含预定义数据)和动态字段(承载运行时用户输入)。针对IBMAPIPortlet的解决方案在IBMWebSpherePortalV5.0.X和V5.1.X.Thesolut中都可以工作。针对JSRPortlet的解决方案只能用于WebSpherePortalV5.1.x。

引言

IBM®WebSphere®PortalV5.1.0.1引入了跨页面连接,作为JSR168Portlet间和IBMAPIPortlet间页面到页面通信的方法。然而,我们先前的文章(请参阅参考资料)的读者以及目前的一些项目的需求指出,需要解决另一种页面到页面通信的问题:即遗留Web页(不在门户服务器中运行的页面)和门户页面上的Portlet间的通信。遗留Web页有多种格式,包括静态HTML、CGI、ASP或JSP和Servlet。

因为IBMAPIPortlet是Servlet类的子类,所以它可以直接访问HTTP参数(即HTML表单中的URL参数和数据)。然而,JSR168Portlet只能模拟ServletAPI,而不能直接访问HTTP参数。因此,针对IBMAPIPortlet和JSR168Portlet的解决方案是不同的。

本文是为需要集成遗留Web应用程序和WebSpherePortal应用程序的架构师和开发人员准备的。读者应该具备Portlet开发和Web应用程序开发的基本经验。要获得关于Portlet开发的概述,请参阅IBMRationalApplicationDeveloperV6PortletApplicationDevelopmentandPortalTools(请参阅参考资料)。



回页首

场景介绍

在我们的前两篇文章中,Portlet间的页面到页面通信和WebSpherePortalV5.1.0.1中的JSR168Portlet间的页面到页面通信,我们使用“快速搜索(Quicksearch)”示例演示了用于这样的场景的推荐解决方案。本文使用相同的示例来演示我们用于遗留Web页到Portlet通信场景的解决方案。

WebSpherePortal是一种新的Web技术,在许多企业中可能都存在现有的遗留Web应用程序。将遗留Web应用程序转换成WebSpherePortal应用程序需要花费大量的时间、资源和资金。因此,许多WebSpherePortal应用程序需要与遗留Web应用程序共存和集成。这两种应用程序可能运行在相同或不同的服务器环境中。本文介绍的解决方案在这两种情况下都可以工作。

假定一家公司开发了一个非常好的搜索引擎,并且希望其遗留的Web站点页面能够利用这个新的搜索引擎。为了提供该功能,您需要支持现有的遗留Web页和公司门户中的Portlet间的页面到页面通信

图1展示了遗留站点上的QuickSearch页。它可以是一个独立的页面,也可以是遗留站点的页面上的一个有用部分。

动态用户输入搜索文本,再单击“Submit”按钮,然后SearchResultportlet显示搜索结果。静态用户单击“SearchresourcesforWebSpherePortal”(一个静态链接,它将WebSpherePortal预定义位搜索文本URL参数),然后SearchResultPortlet显示搜索结果。


图1.遗留Web站点上的QuickSearch页面

图2显示用户在QuickSearch遗留页面输入字符串“Userinputdata”并单击“Submit”按钮之后的SearchResultPortlet。SearchResultPortlet接收该字符串,并且在句子“ThesearchtextyouenteredwasXXX”的末尾显示它。


图2.带有动态搜索功能的SearchResultPortlet

图3展示了用户在QuickSearch遗留页面上单击SearchresourcesforWebSpherePortal链接之后的SearchResultPortlet。SearchResultPortlet接收WebSpherePortal作为URL参数,并将其作为句子的一部分进行显示。


图3.带有静态搜索功能的SearchResultPortlet

以下产品用于开发和测试这些示例Portlet:

  • IBMWebSpherePortalV5.1.0.1
  • IBMRationalApplicationDeveloperforWebSphereV6.0(带有WebSpherePortalV5.1测试环境)
  • MicrosoftInternetExplorerV6.0
  • Netscapev7.1
  • MozillaFirefoxV1.0

所有的源代码都包含在下载文件p2p_legacy_code.zip中。



回页首

场景1.IBMAPIPortlet

因为IBMAPIPortlet是Servlet的子类,所以它可以直接访问HTTP参数。这样您便可以使用URL映射和HTTP参数实现遗留Web页和IBMAPIPortlet间的通信

清单1展示了本场景中与使用IBMAPI实现的SearchResultPortlet通信的QuickSearchWeb页的HTML源代码。包含SearchResultPortlet的门户网页的URL为

http://localhost:9081/wps/portal/search_result

,其中search_result是SearchResult门户网页的URL映射名称。

创建该页面的URL映射名称有两个原因:

  1. 对于用户,它比WebSpherePortal生成的缺省URL要友好得多。缺省的URL难以理解,并且与计算机有关(对于同一页面,不同的计算机生成不同的URL)。以下URL是WebSpherePortal为搜索结果页面生成的URL的示例:
    http://localhost:9081/wps/portal/!ut/p/kcxml/04_Sj9SPykssy0xPLMnMz0vM0Y_QjzKLN4g3cQHJgFiWQBaYdoWJGJtCRBBqHOECvh75uan63voB-gW5oaER5Y6KAIhgH-A!/delta/base64xml/L3dJdyEvUUd3QndNQSEvNElVRS82XzBfOUQ!

  2. 将门户应用程序从临时服务器移到生产服务器更加容易,因为您可以将同一URL映射名称用于不同服务器上的页面。但您无法控制WebSpherePortal生成的URL。

请参见WebSpherePortalInformationCenter(参考资料中提供了相关地址),了解如何创建URL映射。在创建了URL映射之后,您可以使用URLhttp://localhost:9081/wps/portal/search_result指向该页面。

在清单1中您将看到,数据p2psampel5_search_text将作为HTTP参数提交给该门户页面。


清单1.p2p_ibm_portlet.html(用于与IBMAPIPortlet通信的QuickSearchWeb页的源代码)
<html><title>Quicksearch</title><body><formmethod="get"action="http://localhost:9081/wps/portal/search_result"><table><tr><tdcolspan="2">Pleaseentersearchtext</td></tr><tr><td><inputtype="text"name="p2psample5_search_text"/></td><td><inputtype="Submit"value="Submit"/></td</tr></table></form><ahref="http://localhost:9081/wps/portal/search_result?p2psample5_search_text=WebSphere Portal">SearchresourcesforWebSpherePortal</a></body></html>

清单2展示了SearchResultPortlet(它是一个IBMAPIPortlet)的源代码段。该Portlet直接从遗留页面检索HTTP参数。


清单2.SearchResultPortlet的doView()方法
publicvoiddoView(PortletRequestrequest,PortletResponseresponse)throwsPortletException,IOException{...//RetrievestheURLparametersubmittedfromthelegacyWebpage.Stringp2psample5_search_text=request.getParameter("p2psample5_search_text");//MakeaviewmodebeanSearchResultPortletViewBeanviewBean=newSearchResultPortletViewBean();viewBean.setSearchText(p2psample5_search_text);request.setAttribute(VIEW_BEAN,viewBean);//InvoketheJSPtorendergetPortletConfig().getContext().include(VIEW_JSP,request,response);...}

要部署此场景的示例代码,请执行以下步骤:

  1. 下载压缩文件p2p_legacy_code.zip
  2. 将p2p_ibm_portlet.html放在Web服务器上。如果使用的是IBMHTTP服务器,则将该文件放在以下目录中:{$httpServer_home}/htdocs/en_US/p2p,其中{$httpServe_home}是IBMHTTP服务器的安装目录。
  3. 启动WebSpherePortal。
  4. 安装P2PSample5.war。
  5. MyPortal下,创建一个名为Searchresult的标签。
  6. Searchresult下,创建一个名为P2PSample的页面。
  7. Searchresult页面上添加SearchResultPortlet。
  8. 创建一个名为“search_result”的URL映射,并将其映射到Myportal-->Searchresult-->P2PSample。
  9. Searchresult页面设置为公共,或启用WebSpherePortal的安全性。(请参考WebSpherePortalInformationCenter)。
  10. 如果搜索页面受到保护,并且WebSpherePortal安全性未启用,则示例将不能工作。缺省情况下,安装WebSpherePortal5.X时不启用安全性。
  11. 要测试示例,请打开浏览器并输入以下URL:http://localhost/p2p/p2p_ibm_portlet.html
  12. 单击“SearchresourcesforWebSpherePortal”链接,或输入一些搜索文本并单击Submit按钮。
    如果搜索结果页面是公共的,则您可以直接看到它。然而,如果搜索结果页面受到保护并且启用了WebSpherePortal安全性,则您需要输入用户名和密码。然后,您可以看到搜索结果页面以及从遗留Web页提交的数据。



回页首

场景2:JSR168Portlet

因为JSRPortlet只模拟ServletAPI,所以它无法直接访问HTTP参数。因而上面的解决方案对JSR168Portlet不起作用。但是WebSpherePortalV5.1有内置的类WebSpherePortalSystemProgrammingInterface(SPI),开发人员可以使用该类来创建指向门户页面的URL,并且将数据传递到该页面上的JSRPortlet。请参阅参考资料,了解关于如何访问SPIJavadoc的信息。

重要:URL的总长度不超过2048个字符。

图1展示了我们针对JSR168Portlet的解决方案。具体过程如下:

  1. 用户输入搜索文本并单击“Submit”。另外,用户可以单击QuickSearch页面上的静态链接。还有一种可选的方式是,将数据以HTTP参数的形式发送到P2PHandler。
  2. P2PHandler获取从Web页发送的HTTP参数。它将这些参数发送到使用ModelSPI创建的P2pUtil.jar中的Java类。
  3. P2PUtil.jar中的Java类创建指向SearchResult门户页面的URL。从遗留Web页发送的参数作为呈现参数包含在该URL中。
  4. P2PHandler获取该URL并重定向到SearchResult门户页面。SearchResultPortlet检索呈现参数,然后执行搜索。


图4:场景2的组件图

清单3展示了QuickSearch遗留页面的HTML源代码。在这个场景中,QuickSearch页面指向p2pHandler.jsp。


清单3.p2p_168_portlet.html(QuickSearch遗留页面的源代码)
<html><title>Quicksearch</title><body><formmethod="get"action="http://localhost:9081/wps/p2p/p2pHandler.jsp"><table><tr><tdcolspan="2">Pleaseentersearchtext</td></tr><tr><td><inputtype="text"name="p2psample4_search_text"/></td><td><inputtype="Submit"value="Submit"/></td</tr></table></form><ahref="http://localhost:9081/wps/p2p/p2pHandler.jsp?p2psample4_search_text=WebSphere Portal">SearchresourcesforWebSpherePortal</a></body></html>

如清单4所示,P2PHandler是使用JSP实现的。它检索HTTP参数,调用P2PUtil.jar中的Java类来构建URL,然后重定向到SearchResult门户页面。


清单4.p2pHandler.jsp
<@pageimport="p2phandler.util.P2PURLGenerator"><//RetrieveHTTPparametersentfromlegacyWebpage.StringsearchStr=request.getParameter("p2psample4_search_text");try{//CallclassesinP2PUtil.jartocreatetheURL.//ParameterssentfromthelegacyWebpageareincludedintheURL.StringtargetURLStr=P2PURLGenerator.generateURLString("p2psample.SearchResult","p2psample4.win.SearchResult","p2psample4_search_text",searchStr);//RedirecttotheSearchResultpageresponse.sendRedirect(targetURLStr);}catch(Exceptione){System.err.println(e.toString());}>

清单5展示了如何使用WebSpherePortalSPI类生成带有呈现参数的URL:


清单5.P2PURLGenerator.java类
publicclassP2PURLGenerator{...publicstaticStringgenerateURLString(StringpageName,//CustomuniquenameofthepagecontainingtheportletStringportletName,//TheuniquenameoftheportletwindowStringparamName,//TheparameternameStringparamValue//Theparametervalue)throwsStateException,NamingException,IOException{finalStateManagermgr=getStateManager();//GettheURLfactoryfinalURLAccessorFactoryURLFactory=(URLAccessorFactory)mgr.getAccessorFactory(URLAccessorFactory.class);//RequestaURL//The3rdargumentspecifieswhethertheURLpointstothe//protected(authenticated)area//Passin"false"ifyourpageisaccessibleforunauthenticatedusersfinalEngineURLURL=URLFactory.newURL(newMyServerContext(),false,true,mgr.newState(),Constants.EMPTY_COPY);//SetthepagethisURLshouldpointtofinalSelectionAccessorFactoryselectionFactory=(SelectionAccessorFactory)mgr.getAccessorFactory(SelectionAccessorFactory.class);//Requesttheselectioncontrollertosetthepage;//passinthestateassociatedwiththecreatedURLfinalSelectionAccessorControllerselectionCtrl=selectionFactory.getSelectionController(URL.getState());//Setthepage;youneedtheuniquename(String)ortheObjectIDofthatpageselectionCtrl.setSelection(pageName);//Disposetheaccessor(avoidsmemoryleak)selectionCtrl.dispose();//SetportletrenderparametersfinalPortletAccessorFactoryportletAccessorFactory=(PortletAccessorFactory)mgr.getAccessorFactory(PortletAccessorFactory.class);//Gettheportletcontrollertosetrenderparameters;//passinthestateassociatedwithrgecreatedURLfinalPortletAccessorControllerportletCtrl=portletAccessorFactory.getPortletController(portletName,URL.getState());//GetthemodifiablerenderparametermapfinalMapparameters=portletCtrl.getParameters();//Settherenderparameterparameters.put(paramName,newString[]{paramValue});//Disposetheaccessor(avoidsmemoryleak)portletCtrl.dispose();//NowconverttheURLtoaString;passinyourwriter.//writeDispose()writestheURLtothegivenwriterand//disposesoftheURLafterwards.//IfyouwanttodisplaythisURLamultipletimesplsusewriteCopy().returnURL.writeDispose(newStringWriter()).toString();}...}

上面的代码表明,您需要知道两件事才能使一个JSRPortlet能够与其他页面上的另一个JSRPortlet通信

  • 目标门户页面的唯一名称。
  • 该页面上的Portlet窗口的唯一名称。

虽然可以在WebSpherePortal管理控制台上定义门户页面的唯一名称,但是您无法定义Portlet窗口的唯一名称。您需要编写XML部署文件,并使用xmlaccess实用工具创建这些唯一名称。

清单6展示了部分p2p_create_page.xml文件(在p2p_legacy_code.zip中),它创建了一个标题为Searchresult且具有唯一名称p2psample.SearchResult的门户页面,并且将具有唯一名称的p2psample4.win.SearchResult放在该页面上。


清单6.p2p_create_page.xml
...<content-nodeaction="locate"objectid="Content.Root.My_Portal"uniquename="wps.MyPortal"/><content-nodecontent-parentref="Content.Root.My_Portal"action="update"active="true"objectid="SearchResult.page"uniquename="p2psample.SearchResult"type="page"skinref="undefined"><supported-markupmarkup="html"update="set"/><localedatalocale="en"><title>Searchresult</title></localedata><componentaction="update"ordinal="100"type="container"orientation="H"><componentaction="update"ordinal="100"type="container"orientation="V"><componentaction="update"ordinal="100"type="control"uniquename="p2psample4.win.SearchResult"><portletinstanceaction="update"objectid="SearchResult.page.portlet1"Portletref="p2p.portlet.SearchResult"/></component></component></component></content-node>...

清单7展示了SearchResultPortlet的源代码,SearchResultPortlet是JSR168Portlet。它从使用URLGenerator类构建的URL中检索呈现参数。


清单7.SearchResultPortlet.java
publicclassSearchResultPortletextendsGenericPortlet{...publicvoiddoView(RenderRequestrequest,RenderResponseresponse)throwsPortletException,IOException{//RetrievetheHTTPparametersentfromthelegacyWebpage.Stringp2psample4_search_text=request.getParameter("p2psample4_search_text");SearchResultPortletViewBeanviewBean=newSearchResultPortletViewBean();viewBean.setSearchText(p2psample4_search_text);request.setAttribute(VIEW_BEAN,viewBean);//SettheMIMEtypefortherenderresponseresponse.setContentType(request.getResponseContentType());//InvoketheJSPtorenderPortletRequestDispatcherrd=getPortletContext().getRequestDispatcher(getJspFilePath(request,VIEW_JSP));rd.include(request,response);}…}

要部署场景2的示例代码,请执行以下步骤:

  1. 解压缩p2p_legacy_code.zip文件。
  2. 将p2p_168_portlet.html复制到Web服务器。如果您使用的是IBMHTTP服务器,则将该文件放入以下文件夹中:
    {$httpServer_home}/htdocs/en_US/p2p

    ,其中{$httpServe_home}是IBMHTTP服务器的安装目录。
  3. 将p2pHandler.jsp复制到以下目录:
    {$was_home}/installedApps/machine_name/wps.ear/wps.war/p2p

  4. 将P2PUtil.jar放入以下目录:
    ${wps_home}/shared/app

    ,其中${wps_home}表示WebSpherePortal安装目录。
  5. 将P2PSample4.war放入${wps_home}/installableApps目录。
  6. ${wps_home}/bin中,创建名为xmlaccess的目录。然后,将p2p_create_page.xml复制到${wps_home}/bin/xmlaccess
  7. 启动WebSpherePortal。
  8. 打开命令提示符,转到${wps_home}/bin/xmlaccess,然后运行以下命令(在一行上):
    ..\xmlaccess.bat–inp2p_create_page.xml–outresult.xml–userwpsadmin–pwdpassword–URLhttp://localhost:9081/wps/config

    使用用于WebSpherePortal服务器的用户名和密码。
  9. 停止WebSphereportal并启动WebSpherePortal。
  10. Myportal下名为Searchresult的页面设置为公共。
  11. 要测试该示例,请在Web浏览器中打开以下URL:
    http://localhost/p2p/p2p_168_portlet.html

  12. 单击SearchresourcesforWebSpherePortal链接,或者输入一些搜索文本并单击Submit。您将看到搜索结果页面包含从遗留QuickSearchWeb提交的数据。



回页首

结束语

使用本文提供的解决方案,您可以启用从遗留Web页到Portlet的通信。您了解了如何将URL映射和HTTP参数用于遗留Web页和IBMAPIPortlet间的通信。对于JSR168Portlet,我们使用通过由WebSpherePortalV5.1.X提供的ModelSPI处理的HTTP参数。另外,对于JSR168Portlets,您可以使用xmlaccess来创建该目标门户页面的唯一名称,以及该页面上的Portlet窗口的唯一名称。要进行从Portlet到遗留Web页的通信,您只需使用GET或POST方法发送带有HTTP参数的数据即可。


『发表/查看该文章的网友评论』


『北极星新闻网邀请您关注2009年全国各电厂最新招聘动向,请点击此链接———北极星电力英才网』

《遗留Web页与Portlet的页面到页面通信》的相关文章

  • ·[常用资料][电力信息化]在IBMWorkplace中部署更新 (2008-08-06,阅50次,作者:佚名)
  • ·[常用资料][电力信息化]访问Notes/Domino数据的定制DXL框 (2008-08-06,阅78次,作者:佚名)
  • ·[常用资料][电力信息化]比较基于服务器的邮件和本地副本 (2008-08-06,阅45次,作者:佚名)
  • ·[常用资料][电力信息化]Web客户端集成到WebSpherePortal (2008-08-06,阅47次,作者:佚名)
  • ·[常用资料][电力信息化]LotusInstantMessaging (2008-08-06,阅19次,作者:佚名)
  • ·[常用资料][电力信息化]定制DominoWebAccess6.5的外观 (2008-08-06,阅53次,作者:佚名)
  • ·[常用资料][电力信息化]构建LotusNotes/Domino日程表应用 (2008-08-06,阅54次,作者:佚名)
  • ·[常用资料][电力信息化]CollaborationServices2.5中的新 (2008-08-06,阅9次,作者:佚名)
  • ·[常用资料][电力信息化]CollaborationServices2.5 (2008-08-06,阅10次,作者:佚名)
  • ·[常用资料][电力信息化]向IBMWorkplaceportlet添加到场提 (2008-08-06,阅7次,作者:佚名)
  • ·[常用资料][电力信息化]InstantMessagingSPI进行翻译 (2008-08-06,阅10次,作者:佚名)
  • ·[常用资料][电力信息化]LEI6技术概览 (2008-08-06,阅23次,作者:佚名)
  • ·[常用资料][电力信息化]在LCLSX中使用文件附件 (2008-08-06,阅21次,作者:佚名)
  • ·[常用资料][电力信息化]IBMWorkplaceDesigner设计团队访 (2008-08-06,阅21次,作者:佚名)
  • ·[常用资料][电力信息化]IBMWorkplaceDesigner简介 (2008-08-06,阅7次,作者:佚名)
  • ·[常用资料][电力信息化]开发包含静态内容和动态内容的高 (2008-08-06,阅25次,作者:佚名)
  • ·[常用资料][电力信息化]使用WebSphere工具开发业务流程门 (2008-08-06,阅15次,作者:佚名)
  • ·[常用资料][电力信息化]CollaborationServices2.5现场展 (2008-08-06,阅8次,作者:佚名)
  • ·[常用资料][电力信息化]ServicesAPI工具包开发应用程序 (2008-08-06,阅5次,作者:佚名)
  • ·[常用资料][电力信息化]WebSpherePortalV5.1.0.1的新功能 (2008-08-06,阅5次,作者:佚名)
  • 电力信息化帖

    论坛技术贴精华