简介: 新版基于 JSR 286 的 Web Content Viewer portlet 是 IBM® WebSphere® Portal V6.1.5 的一部分,其中增加了大量新功能,而且有许多优势。如果您想从一个外部应用程序发送参数到 portlet,新版和旧版的差异非常大。本文向您介绍如何轻松地发送参数到新 portlet,以及存在差异的原因。 本文来自于 IBM WebSphere Developer Technical Journal。
新旧对抗
新 Web Content Viewer portlet 的第一版于 2009 年 1 月在 IBM® Lotus® and WebSphere® Portal Business Solutions Catalog 中提供。升级版在 2009 年底发布,其中包括 IBM WebSphere Portal V6.1.5 功能部件包。除了许多新功能之外,升级版也是以 Java Portlet Specification JSR 286 第 2 版为基础的。尽管这包含了许多新功能,但较之早期的 Web Content Viewer(基于 IBM Portlet API 的)也有一个缺点:传递一个参数到查看器 portlet 变得有点复杂。在这篇专栏文章中,您将会有意外的收益。
旧 Web Content Viewer portlet 是如何工作的
在 IBM Portlet API 版本的查看器中,您只需要简单地向正在寻找页面的 URL 中添加一个查询参数,该页面上所有的 IBM portlet 将收到该参数,然后您配置 portlet 来监听广播并创建一个如下格式的 URL:
清单 1
http://[PORTAL_HOST]/[PORTAL_CONTEXT_ROOT]/[PORTAL_PAGE_URL_MAPPING]/?WCM_GLOBAL_CONTEXT= /[LIBRARY]/[SITE]/[SITE_AREA_PATH]/[CONTENT] |
例如:http://mysystent/wps/portal/home?WCM_GOBAL_CONTEXT=/mynewslib/usnews/news1。
这个 portlet 用起来很简单,但是它也有以下缺点:
让我们看看在 JSR 286 新时代查看器是如何工作的。
基于 JSR 286 的 Web Content Viewer portlet 是如何工作的
在新的查看器中,您可以在 WebSphere Portal 中使用 URI 分解器框架来从外部系统寻找网页或内容项。URI 分解器框架是一个普通的框架,也可用来促进定制 URI 模式。Web Content Management 定义模式 wcm: 如下:
wcm:path:LIBRARY/SITE_AREA_PATH/CONTENT [[& page=unique_name | object_id] &mapping=mapping | ¤t=true]
这意味着您可以提供路径给内容,选择提供下面之一:
如果您不能提供上述任何一个,WebSphere Portal 自动尝试寻找正确的页面。只有当您正在使用 Web Content Pages 时该方法才有效,在这个 Web Content Pages 中您可以将 Web Content Management 网站区域(site area )映射到门户页面,以便于 WebSphere Portal 意识到它们之间的关联。
因此,现在您如何获取一个完整的 URL 呢?有两个不同的选择:
我们来看一个 Web Content Management Web Content library 设置样例,包含以下内容:
图 2 是欧洲页面属性的高级部分,其中显示了到 NewsEurope Web Content Management 网站区域的映射。
我们也将定义一个 URL 将 /coolCars 映射到 Products/Cars 页面,这样 URL 将会链接到 http://host_name/wps/portal/Products/Cars。
以下是一些样例 URL:
http://host_name/wps/mypoc?urile=wcm%3Apath%3A/Web+Content/NewsUS/News1
这个 URL 通知门户使用库路径 Web Content/NewsUS/News1 呈现内容项。WebSphere Portal 将查阅映射到 NewsUS 网站区域(Company News/US)的 Web Content Page,重定向到那个页面,然后将该页面的上下文设置为内容项库路径。
这个 URL 通知 WebSphere Portal 用和之前 URL 一样的方式来呈现内容项,但是不进行动态页面查阅来重定向到页面 /Products/Cars,该页面被映射到 URL /coolCars,如图 3 所示。
http://host_name/wps/portal/Company+News/Europe?urile=wcm%3Apath%3A/Web+Content/NewsUS/News2¤t=true
这个 URL 通知 WebSphere Portal 选择页面 /Company News/Europe 并显示该页面上的内容项 Web Content/NewsUS/News2。注意如果没有参数 current=true,WebSphere Portal 将重定向到页面 /Company News/US,因为这就是那个映射到 NewsUS 网站区域的页面。
图 4. 使用友好的 URL 路径 Company News/Europe 访问页面并呈现 USNews 网站区域
在目标页面上至少必须有一个 JSR 286 web 内容查看器 portlet,而且必须被配置来接收来自其他 portlets 和自身 portlets 的链接,如图 5 所示。
图 5. 配置来接收来自其他 portlet 链接的 JSR 286 Web Content Viewer Portlet
portlet
为什么这些用于访问新查看器端口的 URL 没有上文指出的简易架构那么漂亮,而包含所有这些特殊字符呢?接下来我们将讨论这个问题。
URL 和 URI 编码规则
您可能知道有效的 URL 需要遵守 RFC 1738 定义的特定的编码规则,必须替换保留字,例如 “ ”(空格)或 “:”。在上述例子中,“ ”(空格)被 “+” 替换,“:”被" %3A 替换。
还有一个细节我们没有解释,“urile” 来自之前的模式。实际上,您有两个选择:您可以指定 “uri” 或者是 “urile”。 不同之处是如果您使用 uri 模式,除了要遵守 URL 编码规则之外,您还要遵守 URI 编码规则,因此 URL 是:
http://host_name/wps/portal/Company+News/NewsEurope?urile=wcm%3Apath%3A/Web+Content/NewsUS/News2¤t=true
像这样使用 “uri” 模式:
http://host_name/wps/portal/Company+News/NewsEurope?uri=wcm%253Apath%253A%2FWeb%2BContent%2FNewsUS%2FNews2%26current%3Dtrue
关于如何编码 URI 特殊字符的更多信息,见 RFC 3986 。因为手工构造这些 URL 比较困难,WebSphere Portal 提供了一个简化的 URI 版本,仅仅需要进行 URL 编码而不是使用 urile 模式进行 URI 编码。
为什么 JSR 286 解决方案是与众不同的
Java Portlet Specification V 2.0 (JSR 286) 定义了所谓的呈现参数,这些参数被提供给每个请求的 portlet。例如,当用户按下浏览器的重新加载按钮时,portlet 再一次获取相同的呈现参数,并能够呈现相同的视图。这意味着 portlet 不再需要在会话中存储导航状态信息,基于 portlets 的 IBM Portlet API 就是最好的例子。
有两个不同类型的呈现参数:私有参数,它们对页面上的每个 portlet 窗口都是私有的;公共参数,它们是共享的。公共参数使您可以在旧的 IBM Portlet API 中向 URL 添加一个查询参数,并可以用 portlets 在页面上接收。旧 IBM Portlet API 查询参数解决方案有两个弊端:
为了克服这些限制,JSR 286 规范定义了公共参数并使用了 QName 命名模式来命名参数,QName 命名模式在 XML 文档中很著名(见 Namespaces in XML 1.0)。WebSphere Portal 将参数名和参数值作为 URL 其中一部分存储在页面上,以至于那些 URL 是可设置标签的(bookmark-able),并避免了使用一个会话。因为您可能有许多公共和私有呈现参数需要存储在 URL 中,需要保证 URL 不太长。WebSphere Portal 通过压缩编码进行这些操作,看起来像这样:
清单 2
http://sh1.svl.ibm.com:10046/wps/myportal/Home/Company-News/us/! ut/p/b1/hc7LDoIwEIXhZ_EBzExppbIcSxSUi4AidGNIvAQiaiLB6NOLxo0LddbffzKgIRcmsyRyxiEDfSzacl805 elYHCAHreU6Sv3YkbGBkzGZ6LrWwHFtwRElZG25vT4zbX5nZgfyDqgJOUJ6iEOaPoGwpnMaMCT2r19BhmKdVMOzf2 sy767aRXWPsKkiI6jU7WJH1yZYzDdpvByRvULy6q7Rn7OhP1Pd7CzkPFQME-MNfr31AvjlCCFwTvUWat36513i9qn XewCN50jf/#Z7_QVMRH7R20GFA60II95HID43007 |
如果一个特定参数太大,将被存储在会话中,并且只有引用键被存储在 URL 中。这有助于将 URL 保持在 2k 之下,2k 是许多浏览器或 HTTP 基础设施组件(例如 proxies)强制限制的。
该解决方案的弊端是您现在不再可以手动创建参数,这是因为编码原因。因此,Portal 为您提供上述机制,在门户 URL 的末端添加一个简单 URI。现在两全其美了:您可以利用 JSR 286 公共呈现参数定义的导航状态模式,并且您也可以轻松地在一个指定 URL 中设置参数。
结束语
当您将一个呈现 portlet 的 Web Content Management 从旧的 Web Content Viewer 迁移到基于 JSR 286 的新版本时,您将获得许多新功能,像书签设置功能,可以在 URL 中存储选择的上下文,然而,您似乎也失去了一个从外部应用程序向 Web Content Management 所呈现的 portlet 发送参数的简单方法。这篇专栏文章描述了一个简单的方法,通过使用一个附加在 URL 中的 URI 重获这一能力,同时也不丧失任何新功能。
原文链接:http://www.ibm.com/developerworks/cn/websphere/techjournal/1007_col_hepper/1007_col_hepper.html
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14789789/viewspace-675112/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14789789/viewspace-675112/