评论专栏: 从外部应用程序发送参数到基于 JSR 286 的 Web Content Viewer portlet

新版基于 JSR 286 的 Web Content Viewer portlet 是 IBM® WebSphere® Portal V6.1.5 的一部分,其中增加了大量新功能,而且有许多优势。如果您想从一个外部应用程序发送参数到 portlet,新版和旧版的差异非常大。本文向您介绍如何轻松地发送参数到新 portlet,以及存在差异的原因。 本文来自于 IBM WebSphere Developer Technical Journal

Stefan Hepper, WebSphere Portal 编程模型架构师, EMC

Stefan Hepper 是一名 Lotus Web Content Management 产品架构师,也是 WebSphere Portal and Lotus Web Content Management 产品开发团队的一员。他之前的职务是 V6.1.5 主程序员,目前主要负责 Java Portlet Specification V 2.0 (JSR 286) 。Stefan 在国际会议(例如 JavaOne)上发表了大量演讲和各种论文,并且与人合作撰写了图书 Pervasive Computing(Addison-Wesley,2001 年)和 Programming Portlets:From JSR 168 to WebSphere Portal Extensions(McPress,2007 年)。Stefan 从德国的卡尔斯鲁厄大学获得了计算机科学毕业文凭。他于 1998 年加入 IBM Boeblingen Development Laboratory ,于 2009 年成为 IBM Silicon Valley Lab 的一员。


developerWorks 专家作者

2010 年 9 月 25 日

新旧对抗

本文涉及的信息只引用由外部系统生成的 URL。WebSphere Portal 架构内生成的 URL 是很简单的,应该使用 IBM Web Content Management 的 UrlCmpnt 标记。

新 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=
<pathCmpnt type="noprefixservlet" />/[LIBRARY]/[SITE]/[SITE_AREA_PATH]/[CONTENT]

例如:http://mysystent/wps/portal/home?WCM_GOBAL_CONTEXT=/mynewslib/usnews/news1

这个 portlet 用起来很简单,但是它也有以下缺点:

由于受到显示的限制,本文中显示的 URL,其中一些可能看起来是由多行构成,但实际上,每个 URL 是连续的一行。

  • 由于参数不能保存在 URL 中,而要保存在会话中(即使在异步使用情况下),因而影响门户服务器内存消耗。
  • 一旦与页面交互,参数将不再在 URL 中 — 而存储在会话中 — 您不再需要将您的选择加入书签。
  • 缓存在浏览器中的静态页面将不再有效,因为选择内容不能被编码成 URL。这意味着浏览器不能分辨新闻 1 和新闻 2 ,因此也不能在浏览器上缓存。

让我们看看在 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 | &current=true]

这意味着您可以提供路径给内容,选择提供下面之一:

  • 一个目标页面,使用惟一的页名或其对象 ID 。
  • 一个 URL 映射。
  • 在 URL 中选定的、要在 URI 之前使用的当前页面。

如果您不能提供上述任何一个,WebSphere Portal 自动尝试寻找正确的页面。只有当您正在使用 Web Content Pages 时该方法才有效,在这个 Web Content Pages 中您可以将 Web Content Management 网站区域(site area )映射到门户页面,以便于 WebSphere Portal 意识到它们之间的关联。

因此,现在您如何获取一个完整的 URL 呢?有两个不同的选择:

  • 直接通过 /wps/poc or /wps/mypoc 访问 WebSphere Portal 分解器框架。
  • 为 WebSphere Portal 使用外部应用程序了解的任何 URL。

我们来看一个 Web Content Management Web Content library 设置样例,包含以下内容:

  • 一个网站区域 NewsUS 和内容项 News1、News2、News3。
  • 一个网站区域 NewsEurope 和内容项 News4、News5、News6。
    图 1. Library Explorer
    图 1. Library Explorer
  • 以下门户页面有友好的名称:
    • 顶级:Products、Company News
    • 第二级:Products/Cars、Products/SUVs、Company News/US、Company News/Europe
    • 美国和欧洲是 Web Content pages。美国被映射到 Web Content Management 网站区域 Web Content/NewsUS,而欧洲被映射到 Web Content Management 网站区域 Web Content/NewsEurope。

图 2 是欧洲页面属性的高级部分,其中显示了到 NewsEurope Web Content Management 网站区域的映射。

图 2. 欧洲页面属性的高级部分
图 2. 欧洲页面属性的高级部分

我们也将定义一个 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,重定向到那个页面,然后将该页面的上下文设置为内容项库路径。

  • http://host_name/wps/mypoc?urile=wcm%3Apath%3A/Web+Content/NewsUS/News1&mapping=/coolCars

    这个 URL 通知 WebSphere Portal 用和之前 URL 一样的方式来呈现内容项,但是不进行动态页面查阅来重定向到页面 /Products/Cars,该页面被映射到 URL /coolCars,如图 3 所示。

    图 3. 通过将 /coolCars 映射到选中的 Products/Cars 页面访问目标页面
    图 3. 通过将 /coolCars 映射到选中的 Products/Cars 页面访问目标页面
  • 通过一个友好的 URL 访问门户:

    http://host_name/wps/portal/Company+News/Europe?urile=wcm%3Apath%3A/Web+Content/NewsUS/News2&current=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 网站区域
图 4.使用友好的 URL 路径 Company News/Europe 访问页面并呈现 USNews 网站区域

在目标页面上至少必须有一个 JSR 286 web 内容查看器 portlet,而且必须被配置来接收来自其他 portlets 和自身 portlets 的链接,如图 5 所示。

图 5. 配置来接收来自其他 portlet 链接的 JSR 286 Web Content Viewer Portlet
图 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&current=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 查询参数解决方案有两个弊端:

  • 您只能获得一个请求的参数,之后页面上的每个 portlet 需要在对话中存储该值,这需要有会话,甚至在匿名使用的情况也需要有会话。
  • 您不知道 portlet 能够理解什么样的参数,因为 portlet 没有正式声明,甚至在两个 portlet 定义相同的参数名的情况下您也可以运行,但是不同的语义可能会阻止您将两个 portlet 放在同一页面上,而且您事先是不知道的。

为了克服这些限制,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 重获这一能力,同时也不丧失任何新功能。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Lotus
ArticleID=547924
ArticleTitle=评论专栏: 从外部应用程序发送参数到基于 JSR 286 的 Web Content Viewer portlet
publish-date=09252010