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 上扮演一个技术博客的角色。
问题
为什么创建 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 模板的外观如下所示:
提示 : 您可以使用已知值替换任何可选标志。例如 , 如果您认为永远不会通过 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"%>
当您在 WebLogic Portal Consumer 中消费此 portlet 时 , 它将发送以下 SOAP 请求以获取该 portlet 的标记 :
在此请求中 , 要注意的主要细节是模板元素。将 URL 模板发送到任何 Producer 之前 , WebLogic Portal Consumer 会将 URL 模板中的所有 Consumer 特定的标志替换掉 , 仅留下 WSRP 1.0 特定的标志。替换 WSRP 1.0 特定的标志由 Producer 来完成。注意,出于可读性方面的考虑,上述消息中的模板的多个行被强制换行。
为了响应上述 SOAP 请求 , WebLogic Portal Producer 将返回以下响应 :
提示 : 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 返回如下响应 :
注意 , 链接的 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 上扮演一个技术博客的角色。
WebLogic Portal 8.1 中的 URL
weblogic portal 8.1
weblogic portal 8.1
weblogic portal
BEA WebLogic Portal 8.1 使用技巧
Weblogic Portal Reference
WebLogic Portal 8.1 平台上运行Lucene搜索引擎
在 WebLogic Portal 8.1 中使用远程 Portlet Web 服务
Ajax Programming in BEA WebLogic Portal 8.1, Part 2
WebLogic Administration Portal Online Help
How WebLogic Portal Uses the WebLogic Server Security Framework
CSDN 文档中心:WebLogic Portal 8.1:实现集成的企业--提高生产率、降低成本的综合解决方案
实现用WebLogic Portal 与Domino服务
使用Maven 2创建WebLogic Portal应用程序
BEA Weblogic Portal内容管理的几点开发经验
CSDN 文档中心:WebLogic Portal 7.0 上开发小结
使用WEBLOGIC PORTAL规则引擎在WEBLOGIC INTEGRATION流程中实现动态业务逻辑,第一部分
使用WEBLOGIC PORTAL规则引擎在WEBLOGIC INTEGRATION流程中实现动态业务逻辑,第一部分
Action接收URL中的参数
在BEA WEBLOGIC PORTAL中进行AJAX编程,第1部分
在BEA WEBLOGIC PORTAL中进行AJAX编程,第1部分
URL
体验WebLogic Server 8.1 SP4新增功能之WebLogic Single1
URL 或 XML 文档中的特殊字符