WebLogic Portal 8.1 中的 URL

来源:百度文库 编辑:神马文学网 时间:2024/04/29 19:49:06
BEA WebLogic Portal 8.1™ 框架的核心任务之一是创建一致且正确的 URL , 以便用户在门户页面环境中与各种 portlet 进行 交互。撰写本文的目的是为了向读者介绍 WebLogic Portal 中 URL 创建过程的基础结构。本文介绍 WebLogic Portal 如何创建 URL , 可以创建的各种 URL , URL 背 后的 API 和 层 , 以及使用 Web Services for Remote Portlets ( WSRP ) 提供或消费 portlet 时 URL 将会发生什么变化。在介绍 URL 创建过程的同时,我还将重点强调一些最佳实践。阅读本文之后,您将有能力避免大多数常见的 URL 缺陷,并且可以利用 portlet 提供一致的用户体验。
问题
为什么创建 URL 是 WebLogic Portal 的核心任务 ? 为什么 portlet 不能像在 HTML/JSP 页面中创建 URL 那样在以下示例代码中创建 URL
Click here to continue.
当用户点击与此类似的链接时 , 下面的某种情况将发生 :
用户将看到未经门户页面聚合的 next.jsp 内容。
用户将看到错误页面,带有可怕的异常堆栈跟踪。
如果门户调用 portlet 使用的是 WSRP ,但是用户不具有与 WSRP Producer 直接交互的权限,则该用户的浏览器上将显示一个 DNS 或安全性错误。
要避免这些情况的发生 , portlet 必须要求 WebLogic Portal 创建 URL 。为什么 portlet 将此任务委派给 WebLogic Portal ? 原因如下 :
提示 :在创建 portlet 时 , 不要假定关于 URL 结构的任何事情。实际结构不仅可以由部署在 portlet 的 Web 应用程序中的模板确定,而且也可以由客户确定,比如 WSRP 。
门户是访问 portlet 的网关 —— 当用户与 portlet 交互(即提交表单或点击链接)时,门户接收用户请求,查找负责处理该请求的 portlet ,然后调用 portlet 。门户还可提供附加服务,如个性化、权利等。因此, portlet 创建的链接必须指向门户,而不是指向 portlet 的 JSP 、 servlet 或页面流。
Portlet 从门户中去耦 ——Portlet 是可重用单元,可以将其聚合到多个门户和桌面。因此, Portlet 不能对门户页面的 URL 假定太多。聚合 portlet 的门户可以位于: (a) 本地,在同一 Web 应用程序中, (b) 在同一服务器上的不同 Web 应用程序中,或者 (c) 物理远程位置。在 (b) 和 (c) 两种情况下,门户可以使用 WSRP 在页面中聚合 portlet 。实际上,可以同时将同一 portlet 聚合到这三种类型的门户页面中。
Portlet 不知道部署 —— 更重要的是, portlet 对于如何部署它们无法假定太多。部署细节包括代理服务器、域名称、端口,等等。 Portlet 对这些无法做出任何假定 。
当您将 URL 的创建委托给 WebLogic Portal 时 , 它将对 portlet 屏蔽门户页面 URL 、域名称、代理服务器等。门户管理员和部署人员可以控制细节,无需破坏 portlet 中的任何 URL 。
如果您非常想知道上述链接的创建方式(假定您要在简单 JSP portlet 中创建这一链接),下面就是一个例子:
Click ">here to continue .
现在 , 我们来检查 WebLogic Portal 的 URL 的基础结构
URL模板
WebLogic Portal 使用称为 “ URL 模板 ” 的简短 URL 片断创建 URL 。它们不是有效的 URL , 需要进一步处理才能使用。要查看 URL 模板,需要创建门户项目并检查其 WEB-INF 目录。在此目录中,您将发现一个 url-templates-config.xml 文件。该文件中包含大量的默认 URL 模板。每个 URL 模板的外观如下所示:
{url:scheme}://{url:domain}:{url:port}/{url:path}?{url:queryString}{url:currentPage} to continue.
提示 : 您可以使用已知值替换任何可选标志。例如 , 如果您认为永远不会通过 HTTP 访问门户页面 , 则可以在所有 URL 模板中使用 “ http ” 替换“url:scheme” 。
您将发现该文件不只是列出一个模板 , 而是列出多个模板。在讨论为何需要多个模板之前,我们先看一看 URL 模板的结构。
剖析URL模板
URL 模板是带有一个或多个标志的 URL 。这些标志由 WebLogic Portal 预定义,在使用远程 portlet 的情况下,是 WSRP 1.0 规范规定的。所有标志均由大括号包围 ( { , } ) 。使用 URL 模板创建 URL 时, WebLogic Portal 使用相应的值替代这些标志,这些值或者由 URL API 或者由 JSP 标记指定,或者从部署门户的方式自动派生。
每个 URL 模板中可以具有一个或多个下面的标志 :
url:scheme: 这是一个可选的标志,用于指定访问该 URL 所需的 HTTP 方案。该值可以是“ http ”或“ https ”。如果在使用此 URL 模板时没有为该标志指定值, WebLogic Portal 将使用可用于生成该模板在其中发挥使用的页面的任一方案。例如,如果使用“ https ”访问包含具有模板的 URL 的页面,则它会将这一标志替换为“ https ”。
url:domain : 这是一个可选标志 , 用于指定访问该门户时使用的域的名称。在大多数情况下,它就是在 WebLogic Portal 之前部署的代理服务器的域名称。如果在使用 URL 模板时没有为该标志指定值, WebLogic Portal 将使用传入的 HttpServletRequest 的 getServerName() 的值。
url:port : 这是一个可选标志 , 用于指定访问门户时使用的端口号。在大多数情况下,它将是代理服务器的端口号。如果未指定值,则 WebLogic Portal 将使用传入的 HttpServletRequest 的 getServerPort() 的值。
url:securePort : 这是一个可选标志 , 用于指定访问门户时使用的 SSL 端口号。在大多数情况下,它将是代理服务器的 SSL 端口号。如果未指定值,则 WebLogic Portal 将从服务器 / 代理配置获取值。
url:prefix: 这是一个可选标志,如果您在代理服务器设置中使用路径前缀,则需指定该标志 。
url:path : 所有 URL 模板都必须包括此标志。 WebLogic Portal 根据页面是门户的一部分还是桌面的一部分 , 使用相应的值替换它。
url:contextualPath : 此标志是可选的 , 应用于指向与 Web 应用程序上下文根相关的路径的 URL 。一个示例是到与 Web 应用程序上下文根相关的图像或文件的链接。
url:queryString : 所有 URL 模板都必须包括此标志。 WebLogic Portal 使用很多保留查询参数 , 使用该标志替换那些查询参数。实际替换的参数取决于如何和在何处使用这一模板。要查找有关这些保留查询参数的更多信息,请参考 WebLogic Portal 框架中的白皮书 。
url:currentPage : 这是一个可选项 , 用于在生成的 URL 中嵌入当前的页面标签。
提示 : 记住使用用于设置代理服务器的路径前缀替换url:prefix标志。
创建门户项目时创建的 url-templates-config.xml 文件中包含的模板列表 , 可以满足大多数常见开发需求。
URL的类型
WebLogic Portal 使用三种 URL
操作 URL : 这些 URL 可用于提交用户互操作 ( 如表单提交和查询链接 ), 可以由任何 portlet 创建。
资源 URL : 资源 URL 可用于生成到静态内容 ( 如图像、样式表、 JavaScript 文件、 pdf 文件等 ) 的链接。任何 portlet 都可以创建这些 URL 。
呈现 URL 。呈现 URL 是一种特殊类型的 URL , 供 Java ( 符合 JSR168 的 ) portlet 和远程 ( 使用 WSRP 的 ) portlet 使用。
稍后我们将讨论在 JSP 中如何创建这些类型的 URL 。
参照前面的 url-templates-config.xml 文件 , 您将发现该文件具有两个主要部分。第一部分定义大量模板。
第二部分定义 Java 和 Page Flow portlet 如何使用这些模板。
文件中定义的每个 url-template 具有一个名称和一个字符串值。任何两个 URL 模板的名称都不能相同。
字符串值是带有一个或多个标志的 URL 模板字符串。
此文件的第二部分为 Java 和 / 或 Page Flow portlet 定义一个或多个 url-template-ref 元素。使用这些元素可以指定要用于给定 URL 的 URL 模板。例如 , 以下片断指定 , 名为 jpf-action 的 URL 模板可用于创建在页面流中使用的操作 URL , 而名为 jpf-secure-action 的 URL 模板 可用于在页面流中创建安全操作 URL :
...
使用URL模板
WebLogic Portal 提供了很多使用在前一节中定义的 URL 模板的方法。
显式使用URL模板
利用 URL 模板 , 您可以使用com.bea.portlet.GenericURL 及其子类创建 URL 。下面是一个示例 :
<% ResourceURL url = ResourceURL.createResourceURL(request, response); url.setScheme("http"); url.setDomain("my.domain.com"); url.setPort(8001); url.setPathPrefix("/static"); url.setTemplate("my-resource-template"); url.setPath("/images/my.jpg");%>
此片断使用 my-resource-template 创建到图像的链接。执行时 , 该 JSP 生成以下代码 :

提示 : 确保正在使用的 URL 模板具有与 setter 方法相对应的标志。如果没有 , WebLogic Portal 将忽略到 setter 的调用。
注意 , 模板必须存在于 my-resource-template 文件中 , 此片断才能生效。模板还必须具有一个指定的url:prefix 标志 , setPathPrefix() 方法将替换 该标志。
在com.bea.portlet.GenericURL 或其子类的位置 , 您可以使用在呈现标记库中可用的 URL 标记创建 URL 来代替。例如 , 可以使用 renderUrl JSP 标记来重写上述 JSP 片断 : <%@ taglib uri="render.tld" prefix="render" %> "/>
注意 , 所有的框架主干 JSP 均使用呈现标记创建到窗口模式 / 状态按钮的链接、到页面的链接 , 等等。
在Portlet中使用URL模板
使用 Page Flow 和 Struts 标记在 Page Flow 和 Struts portlet 中创建表单、链接等时 , 这些 JSP 标记通过 URL 重写程序将 URL 创建委派给 WebLogic Portal 。这些 URL 重写程序使用 jpf-url-templates 指定的 URL 模板创建 URL 。
WebLogic Portal 中的 portlet 容器使用类似的方法处理 Java portlet 。创建 javax.portlet.PortletURL 时, portlet 容器使用在 url-templates-config.xml 文件中指定的 java-portlet-url-templates 。下面是一个示例:
<% PortletURL actionURL = renderResponse.createActionURL(); PortletURL renderURL = renderResponse.createRenderURL();%>
WebLogic Portal 将分别使用 “ 操作 ” 和 “ 资源 ” 类型的 URL 模板生成这两个 URL 的字符串值。
远程Portlet中的URL
当您使用WSRP消费远程portlet时,确保远程portlet返回的标记引用门户至关重要(WSRP Consumer)。使用远程portlet时,Consumer充当最终用户和WSRP Producer上部署的portlet的中间件。一般情况下,Producer可能设置安全性策略,限制最终用户对部署在Producer上的资源的访问权限。所以,未使用WebLogic Portal创建的链接在远程portlet上可能失败。
WSRP 1.0规范为URL创建指定了两种方法:“producer writing”和“consumer rewriting”。下面简要介绍一下这两种方法。
Producer Writing
此方法包括以下步骤:
Consumer 将一组 URL 模板发送给 Producer 。这些 URL 模板在结构上类似于上面讨论的模板 , 不同的是它们包含由 WSRP 1.0 规范指定的标记。
Producer 使用这些 URL 模板创建 URL , 并向 Consumer 返回标记。
如果需要 , Consumer 可以进一步处理 URL 以便 URL 引用 Consumer 。
在这三个步骤中 , 只有第三步依赖于 WSRP Consumer 的实现方式。如果 WebLogic Portal 就是 Consumer , 则 Producer 的 URL 的编写包括以下步骤 :
WebLogic Portal 使用一组用于远程 portlet 的 URL 模板。这些模板连同其他 URL 模板一起在 url-templates-config.xml 文件中声明。门户 Web 应用程序的 WEB-INF 目录中的 wsrp-producer-registry.xml 文件指定了必须用于远程 portlet 的 URL 模板的名称。注意这些模板中出现的额外标志。例如, wsrp-default 模板具有类似 {wsrp-interactionState} 、 {wsrp-navigationalState} 和 {wsrp-mode} 的标志。 WSRP 1.0 规范描述这些标志的意义。
Producer 使用这些模板创建 URL 。注意 , Producer 不一定是 WebLogic Portal 。使用其他实现也可以处理这些 URL 模板 , 因为这些标志是由 WSRP 1.0 规范定义的。
WebLogic Portal 聚合 Producer 返回的标记而不进一步处理。
将 WebLogic Portal 设置为 Producer 时 , 它将使用 URL 模板 , 这一点与本地使用 portlet 的 情况类似。惟一的区别是 , 它使用 Consumer 发送的模板 , 而不使用在 Producer 本地部署的模板。
下面是一个示例。我们假定您使用以下 JSP 部署 Page Flow portlet :
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%> Next
当您在 WebLogic Portal Consumer 中消费此 portlet 时 , 它将发送以下 SOAP 请求以获取该 portlet 的标记 :
portlet_1 wsrp:none portlet_1_2_1 portlet_1_2_1 http://localhost:7001/consumer/hello.portal?_nfpb=true& _windowLabel=portlet_1_2_1&_pageLabel=hello_page_2& wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}& wsrp-requiresRewrite={wsrp-requiresRewrite}& wsrp-navigationalState={wsrp-navigationalState}& wsrp-interactionState={wsrp-interactionState}& wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState} http://localhost:7001/consumer/hello.portal?_nfpb=true& _windowLabel=portlet_1_2_1&_pageLabel=hello_page_2& wsrp-urlType=blockingAction&wsrp-url={wsrp-url}& wsrp-requiresRewrite={wsrp-requiresRewrite}& wsrp-navigationalState={wsrp-navigationalState}& wsrp-interactionState={wsrp-interactionState}& wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState} http://localhost:7001/consumer/hello.portal?_nfpb=true& _windowLabel=portlet_1_2_1&_pageLabel=hello_page_2& wsrp-urlType=render&wsrp-url={wsrp-url}& wsrp-requiresRewrite={wsrp-requiresRewrite}& wsrp-navigationalState={wsrp-navigationalState}& wsrp-interactionState={wsrp-interactionState}& wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState} http://localhost:7001/consumer/resource?_windowLabel=portlet_1_2_1& wsrp-urlType=resource&wsrp-url={wsrp-url}& wsrp-requiresRewrite={wsrp-requiresRewrite} http://localhost:7002/consumer/hello.portal?_nfpb=true& _windowLabel=portlet_1_2_1&_pageLabel=hello_page_2& wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}& wsrp-requiresRewrite={wsrp-requiresRewrite}& wsrp-navigationalState={wsrp-navigationalState}& wsrp-interactionState={wsrp-interactionState}& wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState} https://localhost:7002/consumer/resource?_windowLabel=portlet_1_2_1& wsrp-urlType=resource&wsrp-secureURL=true& wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite} false en-US text/html */* wsrp:view wsrp:normal Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; FDM) UTF-8
在此请求中 , 要注意的主要细节是模板元素。将 URL 模板发送到任何 Producer 之前 , WebLogic Portal Consumer 会将 URL 模板中的所有 Consumer 特定的标志替换掉 , 仅留下 WSRP 1.0 特定的标志。替换 WSRP 1.0 特定的标志由 Producer 来完成。注意,出于可读性方面的考虑,上述消息中的模板的多个行被强制换行。
为了响应上述 SOAP 请求 , WebLogic Portal Producer 将返回以下响应 :
text/html; charset=UTF-8 Next ]]> en-US false
提示 : WebLogic Portal Producer 可以将 URL 模板存储在 HTTP 会话中 , 所以 , WebLogic Portal Consumer 每个会话发送一次 URL 模板。
注意 , Producer 使用 blockingActionTemplate 创建 netui:anchor 标记的链接。由于在这次响应中返回的 portlet 标记完全合格 , 不需要在 Consumer 上对其进行进一步地处理。
如果您有意了解关于这些 SOAP 消息内容的更多信息 , 请访问 OASIS WSRP TC主页 , 并下载最新版本的 WSRP 1.0 Primer 。
Consumer Rewriting
在此方法中 , Consumer 不发送 URL 模板 , 而是执行以下步骤 :
Consumer 为 portlet 标记发出请求。该请求不包括 URL 模板。
Producer 创建链接 , 这些链接被封装在由 WSRP 1.0 规范指定的特殊标记中。
Consumer 分析该标记 , 并使用适当的 URL 替换这些标记中的链接。
对于上述示例 portlet , Producer 返回如下响应 :
text/html; charset=UTF-8 Hello World <a href="wsrp_rewrite?wsrp-urlType=blockingAction&wsrp-secureURL=false &wsrp-interactionState=_action%3D%252Fhello%252FHelloWorld%252Fbegin/wsrp_rewrite">Begin </a> en-US true
注意 , 链接的 href 值被封装在 wsrp_rewrite? 和 /wsrp_rewrite 标记之间。然后 , WebLogic Portal Consumer 分析这些记号中的标记 , 并使用部署在 Consumer 上的 URL 模板创建 URL 。
提示 : 如果将 WebLogic Portal 用作 Consumer , 则可以尝试对 Producer 进行设置 , 以便更好地使用 URL 模板。
Producer Writing还是Consumer Rewriting?
URL 创建的两种方法的主要不同点在于 URL 模板的使用。由 WebLogic Portal Consumer 发送给 Producer 的那种模板不需要对 Producer 返回的标记进行进一步地处理。因此,将 WebLogic Portal 用作 Consumer 时,此方法执行地较好。
WebLogic Portal Producer ( 无论简单还是复杂 ) 默认的设置是使用 Producer writing 生成 URL 。您可以通过更新 Producer 的 WEB-INF 目录下的 wsrp-producer-config.xml文件改用 Consumer rewriting 。请参考关于 WSRP 的 WebLogic Portal 文档资料 以获取更多细节。
结束语
在本文中 , 我的目的之一是想指出为什么创建 URL 对于提供一致的用户体验是关键一步。当您使用 WebLogic Portal 提供的 API 和 JSP 标记、 Page Flow 或 Struts 标记、或者 Java Portlet API 或标记时, URL 创建过程依赖于 URL 模板。 WebLogic Portal 具有消费本地部署的模板和远程 Consumer 发送的模板的能力。这些功能在设计上允许 URL 模板控制所有创建的链接,以声明的方式即可调整,无需更改代码。
反向工程生成的 URL 结构以手动创建链接 ( 即不使用任何 WebLogic Portal API 或标签 ), 也是很可能实现的。这种链接在有些情况下可以使用,但是当部署配置变更或使用 WSRP 时,则很可能失败。下面是最新的准则。始终使用以下标签创建链接:
在框架主干 JSP 和 portlet JSP 中 : com.bea.portlet.GenericURL 或其子类或者呈现标签库中的 URL 标签
在 Page Flow portlet 中 : Page Flow HTML 标记
在 Struts portlet 中 : Struts HTML 标记
在 Java Portlet 中 : Java Portlet API 或 portlet 标记库中的 URL 标记
您完全可以不使用这些标记 , 而按照自己的意思创建 URL 。但这样的 URL 有时可能不可用。
参考资料
关于 WSRP 的 WebLogic Portal 文档资料
WebLogic Portal GenericURL 文档资料
描述 WebLogic Portal Framework 的白皮书
OASIS WSRP TC 主页
关于作者
Subbu Allamaraju 是 BEA Systems 的 WebLogic Portal 开发团队的专职软件工程师。从事 WSRP 标准及其 WebLogic Portal 实现方面的工作。此外他还在 subbu.org 上扮演一个技术博客的角色。