ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 从外部应用程序发送参数到基于 JSR 286 的 Web Content Viewer portlet

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

原创 Linux操作系统 作者:CloudSpace 时间:2010-09-29 14:36:56 0 删除 编辑
Stefan Hepper, WebSphere Portal 编程模型架构师, EMC

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

新旧对抗

本文涉及的信息只引用由外部系统生成的 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 变得有点复杂。在这篇专栏文章中,您将会有意外的收益。

在 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 用起来很简单,但是它也有以下缺点:

由于受到显示的限制,本文中显示的 URL,其中一些可能看起来是由多行构成,但实际上,每个 URL 是连续的一行。
  • 由于参数不能保存在 URL 中,而要保存在会话中(即使在异步使用情况下),因而影响门户服务器内存消耗。
  • 一旦与页面交互,参数将不再在 URL 中 — 而存储在会话中 — 您不再需要将您的选择加入书签。
  • 缓存在浏览器中的静态页面将不再有效,因为选择内容不能被编码成 URL。这意味着浏览器不能分辨新闻 1 和新闻 2 ,因此也不能在浏览器上缓存。

让我们看看在 JSR 286 新时代查看器是如何工作的。

在新的查看器中,您可以在 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]

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

  • 一个目标页面,使用惟一的页名或其对象 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¤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 网站区域
图 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 需要遵守 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 编码。

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 重获这一能力,同时也不丧失任何新功能。

原文链接:http://www.ibm.com/developerworks/cn/websphere/techjournal/1007_col_hepper/1007_col_hepper.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14789789/viewspace-675112/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-08

  • 博文量
    355
  • 访问量
    855738