练习 1.4:比较部署描述符差别

在开始之前,应该先完成练习 1.3:比较 Java 类差别

在此练习中,您将了解两个 portlet API 的部署描述符之间的差别。研究两个版本的 portlet 部署描述符(portlet.xml)。以下显示的是样本中说明的基本差别。要编辑 portlet 部署描述符,请使用 portlet 部署描述符编辑器。

portlet.xml 的标记规则

IBM portlet API 的标记规则是由 DTD 定义的;JSR 168 portlet API 的标记规则是由 XML 模式定义的。这就要求在 portlet 部署描述符的顶部使用不同的 XML 定义语句。

IBM portlet API
<!DOCTYPE portlet-app-def PUBLIC "-//IBM//DTD Portlet Application 1.1//EN"
          "portlet_1.1.dtd ">
JSR 168 portlet API
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             version="1.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             id="bookmark_03_jsr.1">

<portlet-app> 元素的 id 属性

这两种 API 对 <portlet-app> 元素的 id 属性使用不同的名称。IBM portlet API 使用 uid,而 JSR 168 portlet API 使用 id。

IBM portlet API
<portlet-app uid="com.ibm.etools.portal.portletexamples.bookmark.legacy"
JSR 168 portlet API
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             version="1.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             id="bookmark_03_jsr.1">

<portlet> 元素的 href 属性

使用 IBM portlet API 时,<portlet> 元素的 href 属性必须指向 Web 部署描述符(web.xml)中 <servlet> 元素的相应 id;使用 JSR 168 portlet API 时,<portlet-app> 元素的 id 属性向服务器唯一地标识 portlet。JSR 168 portlet 不是 servlet,不需要引用 web.xml。

IBM portlet API
portlet.xml:<portlet id="Bookmark" href="WEB-INF/web.xml#Servlet_1086938566718"
web.xml:    <servlet id="Servlet_1086938566718">
JSR 168 portlet API
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             version="1.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             id="bookmark_03_jsr.1">

Portlet 版本

对于 IBM portlet API,使用 <portlet-app> 和 <portlet> 元素的 major-version 和 minor-version 属性;而对于 JSR 168 portlet API,使用 <portlet-app> 元素的 version 属性。

IBM portlet API
<portlet-app uid="com.ibm.etools.portal.portletexamples.bookmark.legacy"
             major-version="1" minor-version="0">
<portlet id="Bookmark" href="WEB-INF/web.xml#Servlet_1086938566718"
             major-version="1" minor-version="0">
JSR 168 portlet API
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             version="1.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd "
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
             id="bookmark_03_jsr.1">

受支持的标记类型

在 portlet 部署描述符中,IBM portlet API 声明了受支持的标记类型;而 JSR 168 portlet API 声明了受支持的 MIME 类型。IBM 提供了一个扩展(即,wps.markup 初始化参数),它允许您为 JSR 168 portlet 定义受支持的标记类型。可以使用它来区分使用同一 MIME 类型的不同标记类型(例如,HTML 和 cHTML)。

IBM portlet API
<supports>
   <markup name="html">
      <view />
      <edit />
   </markup>
   <markup name="chtml">
      <view />
   </markup>
</supports>
JSR 168 portlet API
<init-param>
   <name>wps.markup</name>
   <value>html,chtml</value>
</init-param>

<supports>
   <mime-type>text/html</mime-type>
   <portlet-mode>VIEW</portlet-mode>
   <portlet-mode>EDIT</portlet-mode>
</supports>

受支持的方式

对于这两种 API,都必须在 portlet 部署描述符中定义受支持的方式,只不过语法稍微有所不同。这两种 API 都支持编辑、查看和帮助方式。IBM portlet API 还支持“配置”方式。JSR 168 portlet API 支持一些定制方式,例如,关于、预览、打印、编辑缺省值以及配置。对于这两种 API,都必须支持查看方式;所有其它方式都是可选的。

IBM portlet API
<supports>
   <markup name="html">
      <view />
      <edit />
   </markup>
</supports>
JSR 168 portlet API
<supports>
   <portlet-mode>VIEW</portlet-mode>
   <portlet-mode>EDIT</portlet-mode>
</supports>

允许的窗口状态

对于这两种 API,会自动为它们提供正常状态。对于 IBM portlet API,其它状态(例如,单独)都必须明确声明。对于 JSR 168 portlet API,最大化和最小化状态也是自动提供的;但是,定制状态还是必须明确声明。

IBM portlet API
<allows>
   <maximized/>
   <minimized/>
</allows>
JSR 168 portlet API
没有定制状态显示在示例中,但是将使用 <custom-window-state> 元素

本地化

在 portlet 部署描述符中定义了一些用来定义 portlet 的本地化字符串。IBM portlet API 的 portlet.xml 定义了标题、简短标题、描述和关键字的本地化值。IBM API 还具有缺省语言环境的设置。JSR 168 portlet API 在 portlet.xml 中定义了 portlet 描述和显示名称的本地化值。 标题、简短标题和关键字的值位于 portlet 资源束中。如下所示,portlet 资源束 Portlet.properties 位于样本的 nls 目录中。JSR 168 API 具有用来定义资源束和受支持语言环境的设置。
IBM portlet API
<default-locale>en</default-locale>
<language locale="en">
   <title>Bookmark portlet (IBM)</title>
   <title-short>Bookmark</title-short>
   <keywords>Bookmark</keywords>
</language>
<language locale="de">
   <title>Lesezeichen Portlet (IBM)</title>
   <title-short>Lesezeichen</title-short>
   <keywords>Lesezeichen, Bookmark</keywords>
</language>
JSR 168 portlet API
<resource-bundle>nls.Portlet</resource-bundle>
<supported-locale>en</supported-locale>
<supported-locale>de</supported-locale>
<description xml:lang="EN">English description</description>
<display-name xml:lang="EN">English display name</display>-name>
<description xml:lang="DE">German description</description>
<display-name xml:lang="DE">German display name</display>-name>

样本 portlet 资源束 Portlet.properties:
javax.portlet.title = Bookmark Portlet
javax.portlet.short-title = Bookmark
javax.portlet.keywords = Bookmark

高速缓存到期

在 IBM portlet API 中,portlet 可以使用 PortletRequest 对象的 invalidateCache() 方法,显式地使高速缓存失效(基于失效的高速缓存)。缺省高速缓存到期和作用域是在 portlet 部署描述符中设置的。<expires> 元素的值可以为 0(始终到期)、-1(从不到期)或者是到期之前的秒数。如果 <shared> 元素值为 no,则意味着 portlet 实例之间不共享高速缓存。

JSR portlet API 使用基于到期的高速缓存,其中高速缓存到期时间是在部署描述符中定义的,但是 portlet 可以通过将 EXPIRATION_CACHE 值与 RenderResponse 对象的 setAttribute() 方法配合使用来重新设置到期时间。<expiration-cache> 元素使用的值与 IBM portlet API 用于 <expires> 元素的值相同。

IBM portlet API
<cache>
   <expires>-1</expires>
   <shared>no</shared>
</cache>
JSR 168 portlet API
<expiration-cache>0</expiration-cache>

现在,您可以开始进行练习 1.5:比较 JSP 文件编码差别了。

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.