练习 1.5:比较 JSP 文件编码差别

在开始之前,应该先完成练习 1.4:比较部署描述符差别

在此练习中,您将了解两个 portlet API 在 JSP 文件编码方面的差别。研究两个版本的“编辑”和“查看”JSP 文件。下面讨论的是它们之间的基本差别。

标记库

IBM portlet API 标记是在 portlet.tld 标记库中声明的。这些标记使用 portletAPI 前缀。而 JSR 168 portlet API 使用 std-portlet.tld 标记库和 portlet 前缀。还可以使用在 fmt.tld 中定义的其它标记库,例如,JavaServer Pages 标准标记库(JSTL)。如以下样本代码中所示,JSTL 标记库使用 fmt 前缀。

IBM portlet API
<%@ taglib uri="/WEB-INF/tld/portlet.tld" prefix="portletAPI" %>
<portletAPI:init />

<%@ taglib prefix="fmt" uri="/WEB-INF/tld/fmt.tld" %>
<fmt:setBundle basename="nls.Text" />

JSR 168 portlet API
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<portlet:defineObjects />

<%@ taglib prefix="fmt" uri="/WEB-INF/tld/fmt.tld" %>
<fmt:setBundle basename="nls.Text"/>

使对象可供 JSP 文件使用

在 IBM portlet API 中,<portletAPI:init> 标记使 PortletRequest、PortletResponse 和 PortletConfig 对象可供 JSP 文件使用。而在 JSR 168 portlet API 中,<portlet:defineObjects> 标记使 RenderRequest、RenderResponse 和 PortletConfig 对象可供 JSP 文件使用。

IBM portlet API
<portletAPI:init />
JSR 168 portlet API
<portlet:defineObjects />

MIME 类型声明

这两种 API 的区别在于它们如何为 render 响应设置 MIME 类型。IBM portlet 在 JSP 文件的 page 伪指令上声明 MIME 类型。JSR 168 portlet 在 render 方法(doView() 和 doEdit())中使用 RenderResponse 对象的 setContentType() 方法来声明 MIME 类型。

IBM portlet API
<%@ page contentType="text/html"
         import="java.util.*,
                 com.ibm.etools.portal.portletexamples.bookmark.legacy.*,
                 org.apache.jetspeed.portlet.*"
         session="false"%>
JSR 168 portlet API
response.setContentType("text/html");

Portlet 引用

必须在 portlet URI(JSR 168 使用术语 URL)中将对 portlet、portlet 页面或 portlet 资源的引用进行编码。在当前方式下,IBM portlet API 使用 createURI 来指向调用 portlet;在先前方式下,使用 createReturnURI 来指向调用 portlet。JSR 168 portlet API 为操作阶段和显示阶段创建 URL(分别为 actionURL 和 renderURL)。

IBM portlet API
在 JSP 文件中:  <portletAPI:createURI/>
                 <portletAPI:createReturnURI/>
在 Java 类中:PortletResponse.createURI()
                 PortletResponse.createReturnURI()
JSR 168 portlet API
在 JSP 文件中:  <portlet:actionURL/>
                 <portlet:renderURL/>
在 Java 类中:RenderResponse.createActionURL()
                 RenderResponse.createRenderURL()

URL 编码

Portlet JSP 文件必须对引用相关联 WAR 文件中的资源(例如,图像、applet 和其它 JSP 文件)的 URL 进行编码。JSR 168 portlet API 还要求将上下文路径包含在 URL 中。

IBM portlet API
<%= response.encodeURL("images/photo01.jpg") %>
JSR 168 portlet API
<%= renderResponse.encodeURL(renderRequest.getContextPath() + "/images/photo01.jpg") %>

名称空间编码

在练习 1.3 的名称空间编码中讨论了 Java 类和 JSP 文件的名称空间编码。

资源束

这两种 API 的示例代码都说明了如何使用 JSTL 标记 <fmt:setBundle>。此标记引用样本的 JavaSource/nls 目录中的标准 Java 资源束 Text.properties。将此资源束与用来定义 portlet 的资源束进行比较。

IBM portlet API
<fmt:setBundle basename="nls.Text" />
JSR 168 portlet API
<fmt:setBundle basename="nls.Text" />

现在,您可以开始进行练习 1.6:决定使用哪个 API 了。

反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.