编写基于 WebSphere®
Portal 的应用程序时,正确生成门户网站 URL 是其中一项最重要的任务。提供了多个编程工具和方法,
用于在定制代码中生成 WebSphere
Portal URL。以下部分介绍了可用的编程工具,并论述了何时最适合使用每款工具。
门户网站 URL 的类型
根据您尝试完成的任务不同,有多种不同类型的门户网站 URL。
- 呈示 URL
- 此类 URL 用于检索门户网站页面的一般视图。具体而言,此类 URL 不包含任何
Portlet 操作,也不会引起任何服务器端状态更改。呈示 URL 对应于 HTTP GET
操作并具有幂等性,即,它可以多次运行,而不会造成任何损害。普通 WebSphere
Portal 页面导航由呈示 URL 组成。
- 操作 URL
- 操作 URL 用于 Portlet 内的活动。这些 URL 对应于 HTTP POST 或 PUT
并且通常不具有幂等性,这意味着它们最多只能运行一次。操作 URL 通常以特定 Portlet 为目标,并且可能会引起服务器端状态更改。Portlet 操作以及作为操作目标的 Portlet 以参数形式在导航状态文档内传递。
- 友好 URL
- 友好 URL 包含用于描述门户网站页面路径的人类可读字符串。
这些人类可读字符串对应于与页面或标签关联的友好 URL 名称。此外,URL 中也可能存在友好内容路径标记。友好内容路径标记是人类可读字符串,描述与页面关联的 Web 内容管理库的站点区域路径。
注: 友好 URL 还可能包含编码的导航状态文档。如果未包含,那么它为无状态友好 URL。存在专门用于处理友好 URL 的编程 API。
- 虚 URL
- 虚 URL 类似于无状态友好 URL,人类可读并且没有编码的导航状态文档。但是,虚 URL 和与门户网站页面关联的友好 URL 名称无关。而虚 URL 是简单、易记且可轻松输入(如果需要)的别名。虚 URL 与 WebSphere Portal 先前发行版中介绍的已映射的 URL 类似。它们仅用作初始入口点,在与门户网站站点开始交互后不会持久存在于浏览器地址栏中。存在一个专用于处理虚 URL 的编程 API。
- 部分内容 URL
- 部分内容 URL(即 PoC URL)是以内容而非门户网站工件(例如页面)为目标的后期绑定机制。它们使用 WeSphere Portal 的另一个 URL 入口点(通常为 mypoc 或 mycontenthandler,而非 myportal)。一个编程 API 可用于处理部分内容 URL。
生成门户网站 URL 的方法
由于 WebSphere
Portal URL 极其复杂,难以进行手动编码,因此请勿尝试通过字符串并置来构建门户网站 URL。设计意图是,门户网站中的大部分自引用 URL 都在运行时生成于代码中,以避免损坏链接,以及避免手动维护基于门户网站的站点中的链接。
WebSphere
Portal 为程序员提供了一些用于生成这些复杂门户网站 URL 的选项。不同的选项设计用于解决从最简单到最复杂的各种用例。
- 门户网站 JSP 标记方法在主题和外表 JSP 中使用。
- JSR 286 Portlet API 和相应的 JSP 标记。此 URL 生成方法可满足标准 portlet 中几乎所有的 URL 生成需求。
- 或者,如有必要,当您修改现有 portlet 并且无法进行升级时,可使用较旧的 JSR 168 Portlet API。
- 不再支持 IBM® Portlet API。必须将写入此 API 的较旧的 portlet 迁移到当前标准。
- WebSphere Portal 已定义公共呈示参数。此方法可以支持许多先前需要使用导航状态 API 的用例。
- 友好 URL API 方法专门用于涉及友好 URL 的用例,包括必须是无状态的 URL(没有已编码的导航状态文档)。
- PoC URL API 方法专门用于创建部分内容 URL。
- 虚 URL API 方法专门用于处理虚 URL。
- 导航状态 API 方法是用于生成 URL 的功能最齐全且最通用的编程工具,但需要最深入的理解和编程技能。
当您创建需要 portlet 间通信的协作 portlet 时,可能在生成的 URL 中携带 portlet 间消息传递。JSR 286 支持的呈示参数是一种实现方式,但还将提供额外的编程工具。针对协作 portlet 的 JSR 286 方法及额外工具在 Portlet 通信部分中进行了更为详细的描述。此类工具的一个示例是协作 portlet API,用于 JSR 286 和 JSR 168 portlet 之间的互操作。
将用例映射到可用的编程工具
表 1. . 所列用于不同用例的简单到复杂的 URL 生成方法。| 任务(最简单到最复杂) |
URL 生成方法 |
在主题级别上门户网站页面之间创建页面导航链接。例如,标准选项卡式页面导航。
|
这些 URL 通常是简单的呈示 URL。在 JSP 中,使用 <portal-navigation/> JSP 标记。有关对门户网站主题进行编程的更多信息,请参阅开发主题和外表部分。
|
自包含(不需要 portlet 间通信)的 JSR 286 portlet 生成指向自身的操作 URL 并设置自己的呈示参数。
|
|
JSR 286 portlet,需要与另一个 JSR 286 Portlet 进行 Portlet 间通信,但没有页面导航(门户网站视图仍然保留在当前页面)。
|
足以使用 JSR 286 呈示参数支持。但还存在其他方法。有关更多信息,请参阅 Portlet 通信部分。
|
需要与 JSR 168 Portlet 进行互操作的 JSR 286 Portlet。
|
将编写通过 portlet 间通信与其他 portlet 合作的 JSR168 portlet,以使用协作 portlet API(也称为属性代理)。属性代理是 JSR 168 规范的 IBM 扩展。JSR286 引入了 portlet 事件模型,该模型取代了属性代理。如果满足某些条件,那么 JSR286 portlet 和 JSR 168 portlet 可以互操作。有关更多信息,请参阅 JSR 286 portlet 事件与 JSR 168 协作 portlet 之间的互操作性部分。
|
需要执行以下操作的 JSR 286 Portlet: - 生成指向另一个门户网站页面的呈示链接(产生页面导航)。
- 有选择地控制目标 portlet 的方式或窗口状态。
- 有选择地控制门户网站状态。
- 有选择地控制目标 portlet 的呈示参数。
- 有选择地控制已生成请求的语言环境。
|
从 Portal 8.5 CF05 开始,对所有这些用例等使用 WebSphere Portal 定义的公共呈示参数。这些呈示参数使得当前请求上下文的各个方面在 WebSphere Portal 指定的名称空间中作为普通公共呈示参数可用。- 要将导航状态值读取为呈示参数:
- 可以通过普通 JSR286 API renderResponse.getParameter(<parameter qualified name>) 来访问这些特殊公共呈示参数。
其中,<parameter qualified name> 是 NAMESPACE_URI 和某一个呈示参数名称的并置,如以下部分中所定义。例如,http://www.ibm.com/xmlns/prod/websphere/portal/publicparams 选择。
- 要使用呈示参数来设置导航状态值:
- 可以通过普通 JSR286 portlet API baseURL.setParameter(<parameter qualified name>, <value>) 来设置
通过使用普通 JSR286 API 来设置这些特定的呈示参数,系统将正确的导航状态设置编码到新 URL 上的导航状态文档中。该设置使得新值对呈示并单击该新 URL 而产生的下一个请求可用。
注释: - 该支持需要使用有状态的 URL,因为仅在已编码的导航状态文档中携带呈示参数。
- 所有这些值在 com.ibm.portal.PublicRenderParameters 类中作为公共常量可用,该类是 wp.model.api 组件中的公共 API。要获取完整详细信息,请参阅 WebSphere Portal javadoc IBM WebSphere Portal V8.5.0.0 SPI 规范。
WebSphere
Portal 指定的公共呈示参数的名称空间为 http://www.ibm.com/xmlns/prod/websphere/portal/publicparams(作为 NAMESPACE_URI 可用)。以下项是 WebSphere
Portal 支持的特殊公共呈示参数: - selection (NAME_SELECTION)
- uri (NAME_URI)
- parameters (NAME_PARAMETERS)
- locale (NAME_LOCALE)
- themeTemplate (NAME_THEME_TEMPLATE)
- labelMappings (NAME_LABEL_MAPPINGS)
- screenTemplate (NAME_SCREEN_TEMPLATE)
- themePolicy (NAME_THEME_POLICY)
- solo (NAME_SOLO)
- showTools (NAME_SHOW_TOOLS)
- hiddenContent (NAME_HIDDEN_CONTENT)
- hiddenPages (NAME_HIDDEN_PAGES)
- statePartition (NAME_STATE_PARTITION)
- path-info (NAME_PATH_INFO)
- focus (NAME_FOCUS)
- deviceClass (NAME_DEVICE_CLASS)
- digest (NAME_DIGEST)
- pageMode (NAME_PAGE_MODE)
- editMode (NAME_PAGE_EDIT_MODE)
- infoMode (NAME_PAGE_INFO_MODE)
- helpMode (NAME_PAGE_HELP_MODE)
还存在门户网站 URL 生成便捷 API。此便捷 API 仅支持呈示 URL。使用此 API 无法生成任何状态更改(操作 URL )。以下项是此 API 中的关键类: - com.ibm.portal.portlet.service.url.PortalURLGenerationService
- com.ibm.portal.portlet.service.url.PortalURLWriter
依据 com.ibm.portal.portlet.service.url 包的 javadoc,程序员: - 通过 JNDI 查找来获取 PortletServiceHome 的实例。
- 在该 home 接口上,调用 getPortletService(PortalURLGenerationService.class)。
- 在该服务上,调用 getPortalURLWriter(request,
response)
- 使用 PortalURLWriter 对象上的方法来创建和操作呈示 URL。
存在针对 URL 生成便捷 API 的同等 JSP 标记集。 <%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v8/portlet/ibm-portlet-ext" prefix="portlet-ext" %>
有关更多信息,请参阅 标准 portlet 的 JSP 标记。使用便捷 API 标记创建呈示 URL 的示例为 <portlet-ext:portalRenderURL>。
|
友好 URL
|
又称为“友好 URL 名称”的“友好 URL”是门户网站页面的人类可读名称。它被设置为页面属性,每一页最多可以有一个“友好 URL”。 注释: - 如果页面具有正确配置的“友好 URL”,那么 WebSphere
Portal 可保证呈示该页面的任何请求都具有“友好 URL”。只有使用 friendly.redirect.enabled 配置设置明确关闭“友好 URL”实施时,请求才不会具有“友好 URL”。
- “友好 URL”不保证其脱离“导航状态”。如果需要除去“导航状态”,可使用更多的方法。您可能还希望为这些用例考察虚 URL 或 URL 映射。
要使用“友好 URL”API,需获取 FriendlyURLFactory 实例。根据您编写的代码的类型,可通过以下两种方式之一来获取 FriendlyURLFactory 实例: - 如果您正在编写 portlet:
-
- 如果您正在编写主题代码:
-
在您具有 FriendlyURLFactory 后,可调用某一项 newURL() 方法来获取 FriendlyURL 实例。可使用 set* 方法设置 FriendlyURL 实例,此方法会使用 writer(Writer) 方法写入响应。Writer 可从响应中获取,然后通过调用 dispose() 来进行处理。
|
虚 URL
|
虚 URL 是简单易记并且用户可手动输入的 URL。虚 URL 由 Web 管理员通过 WebSphere
Portal 管理工具(如工具栏、管理 portlet 或 XMLAccess 脚本编制)进行管理。但是,有时当您呈示响应时,必需生成虚 URL 链接。
以下部分描述了如何使用虚 URL API 来获取可用于呈示虚 URL 链接的 VanityURLNode。根据您正在开发的代码包的类型,使用三种不同的方法之一来访问和使用虚 URL API。 注: 请谨慎为正在开发的代码选择正确的 SPI 包。
必需的接口文档位于 WebSphere
Portal SPI javadoc 中。 - 如果您正在编写 portlet:
- 找到 com.ibm.portal.portlet.service.model 包。
- 从 VanityURLModelProvider 接口开始。您需要获取类的实例,该实例通过两步实现此接口:
- 使用名称常量 VanityURLModelProvider.JNDI_NAME,通过 JNDI 查找来获取 PortletServiceHome 的实例。
- 在该 PortletServiceHome 对象上,调用 getPortletService(VanityURLModelProvider.class)。
- 在 portlet 的 getPortletService 方法中执行 JNDI 查找并调用 init()。将返回的 VanityURLModelProvider 实例保存在 portlet 类内的静态字段中。可以在各个请求中复用此提供程序实例。
- 对于每个请求,例如,在 portlet 的 doView() 方法的调用中,通过传递当前的 portlet 请求和响应,在已保存的 VanityURLModelProvider 实例上调用 getVanityURLModel。不能在各个请求中复用模型。
- 在 VanityURLModel 对象上,调用 getLocator()。
- 在 VanityURLModelLocator 上,您可以调用任何 findBy 方法,这些方法将返回单个 VanityURLNode 或 IterableListModel<VanityURLNode> 列表。
- 如果您正在编写主题代码:
-
- 如果您正在编写数据源:
- 找到 com.ibm.portal.cor.service 包。
注: 此指令集中的许多类名与虚 URL API 的主题代码用法的类名相同,但包名不同。
- 获取类的实例,该实例通过两步实现 VanityURLModelProvider:
- 使用名称常量 VanityURLModelHome.JNDI_NAME,通过 JNDI 查找来获取 VanityURLModelHome 的实例。请参阅 com.ibm.portal.cor.service.VanityURLModelHome javadoc,以获取示例代码。
- 在该 VanityURLModelHome 对象上,调用 getVanityURLModelProvider()。
- 在您的类的构造方法或 init 方法中,执行 JNDI 查找并调用 getVanityURLModelProvider(),然后将返回的
VanityURLModelProvider 实例保存在类内的静态字段中。
可以在各个请求中复用此提供程序实例。
- 在“数据源”的每个请求方法中,调用 modelProvider.getVanityURLModel(com.ibm.content.operations.registry.api.Context)。
针对“数据源”的编程详细信息:在大多数情况下,由专用工厂分配“数据源”。向解析器框架注册该工厂,以处理特定 URI 的请求。收到该 URI 的请求后,解析器框架会启动该工厂,并且会向该工厂传递 com.ibm.content.operations.registry.api.Context 对象。确保了解此 COR Context 对象与 JNDI 查找所使用 javax.naming.Context 类之间的差异。该工厂将分配新的“数据源”实例(或者可能会从池中检索一个现有实例),并通过传递 COR Context 对象,在“数据源”上调用 reset()。必须将该对象以及 reset() 的其他参数保存在“数据源”内的实例字段中。可以在随后的方法调用中进行使用,直至调用 dispose() 或重新调用 reset()。调用 getVanityURLModel(com.ibm.content.operations.registry.api.Context) 时,请使用 COR Context 对象。
- 在 VanityURLModel 对象上,调用 getLocator()。
- 在 VanityURLModelLocator 上,您可以调用任何 findBy 方法,这些方法将返回单个 VanityURLNode 或 IterableListModel<VanityURLNode> 列表。
在您通过任何适当的方式具有 VanityURLNode 实例后,可以调用该接口的各种方法来构建虚 URL 的呈示表示: - VanityURLnode.isSecure() 告知目标协议是 http 还是 https。
- VanityURLnode.isProtected() 告知目标 URL 映射到 /portal 还是 /myportal。
- VanityURLnode.getHost() 将返回与此虚 URL 关联的主机名。
- VanityURLnode.getPort() 将返回与此虚 URL 关联的端口号。
- VanityURLnode.getVpld() 将返回针对此虚 URL 的虚拟门户网站 OID。
- VanityURLnode.getPath() 将返回针对此虚 URL 的路径字符串。该路径字符串被认为是虚 URL 字符串。
|
创建、更新或删除虚 URL。
|
如果您正在编写代码,旨在创建、更新或删除虚 URL,而非读取和呈示虚 URL,那么请使用以下 API: - 找到 com.ibm.portal.model.controller 包。
- 您需要获取类的实例,该实例使用名称常量 VanityURLModelControllerHome.JNDI_Name,通过 JNDI 查找来实现 VanityURLModelControllerHome。请参阅 com.ibm.portal.model.controller.VanityURLModelControllerHome javadoc,以获取示例代码。
- 在该 VanityURLModelControllerHome 对象上,调用 getVanityURLModelControllerProvider()。
- 在您的类的构造方法或 init 方法中,执行 JNDI 查找并调用 getVanityURLModelControllerProvider(),然后将返回的 VanityURLModelControllerProvider 实例保存在类内的静态字段中。可以在各个请求中复用此提供程序实例。
- 您可能还需要使用与编写主题代码中描述的相同代码来获取 VanityURLModelProvider。
- 在每个请求方法中,
- 在 VanityURLModelProvider 上,调用 getVanityURLModel(request,response)。
- 在 VanityURLModelControllerProvider 对象上,通过传递从调用 getVanityURLModel 返回的模型来调用 createVanityURLModelController(model)。
- 用于创建新的虚 URL 和设置其属性的后续调用记录在 VanityURLModelController 和 ModifiableVanityURLNode 的 javadoc 中。
|
需要生成操作 URL 以指向另一个特定 Portlet 的 JSR 286 Portlet,或未在此处列出的任何其他用例。
|
导航状态 API |
部分内容 URL
|
部分内容或 POC URL 是解析器框架内以数据源或解析服务为目标的 URL。鉴于此数据源或解析服务,PoC URL API 可帮助编程人员创建 URL,使解析器框架能够启动正确的数据源或解析服务。
要使用部分内容 URL,请获取 com.ibm.portal.resolver.acessors.url.PocURLFactory 的实例。与其他 URL API 极为类似,获取 URLFactory 的实例的代码取决于您是否正在编写 portlet 或主题代码,或者是否已在解析器框架内运行代码。 - 如果您正在编写 portlet:
-
- 如果您正在编写主题代码:
-
- 如果您正在编写作为数据源或解析服务运行的代码:
- 在 Portal javadoc 中,找到 com.ibm.portal.resolver.service 包。
- 使用名称常量 CorPocServiceHome.JNDI_NAME,为 CorPocServiceHome 执行 JNDI 查找。
- 将生成的 CorPocServiceHome 实例保存在类实例字段中。没有必要对每个请求都执行 JNDI 查找。
- 在您的类的每个请求方法中,在已保存的 CorPocServiceHome 实例上,调用 getCorPocService(com.ibm.content.operations. registry.api.Context)。
注: 必须在返回的服务实例超出范围前对其调用 dispose()。
针对“数据源”的编程详细信息:在大多数情况下,由专用工厂分配“数据源”。向解析器框架注册该工厂,以处理特定 URI 的请求。收到该 URI 的请求后,解析器框架会启动该工厂,并且会向该工厂传递 com.ibm.content.operations.registry.api.Context 对象。确保了解此 COR Context 对象与 JNDI 查找所使用 javax.naming.Context 类之间的差异。该工厂将分配新的“数据源”实例(或者可能会从池中检索一个现有实例),并通过传递 COR Context 对象,在“数据源”上调用 reset()。必须将该对象以及 reset() 的其他参数保存在“数据源”内的实例字段中。可以在随后的方法调用中进行使用,直至调用 dispose() 或重新调用 reset()。调用 getCorPocService (com.ibm.content.operations.registry.api.Context) 时,请使用 COR Context 对象。
- 在生成的 CorPocService 实例上,调用 getURLFactory()。
在获取 PocURLFactory 后: - 调用某一项 newURL 方法,将期望类型的 PocURL 实例化。
- 在生成的 PocURL 实例上,调用 setXXX 方法来定义 URL 属性。
- 调用 writeDispose() 来让 URL 指向响应并处理 PocURL 实例。必须从 writeDispose 方法的响应参数获取供其使用的“写程序”实例。
|