在开始之前,应该先完成练习 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 前缀。
<%@ 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" />
<%@ 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"/>
在 IBM portlet API 中,<portletAPI:init> 标记使 PortletRequest、PortletResponse 和 PortletConfig 对象可供 JSP 文件使用。而在 JSR 168 portlet API 中,<portlet:defineObjects> 标记使 RenderRequest、RenderResponse 和 PortletConfig 对象可供 JSP 文件使用。
<portletAPI:init />
<portlet:defineObjects />
这两种 API 的区别在于它们如何为 render 响应设置 MIME 类型。IBM portlet 在 JSP 文件的 page 伪指令上声明 MIME 类型。JSR 168 portlet 在 render 方法(doView() 和 doEdit())中使用 RenderResponse 对象的 setContentType() 方法来声明 MIME 类型。
<%@ page contentType="text/html"
import="java.util.*,
com.ibm.etools.portal.portletexamples.bookmark.legacy.*,
org.apache.jetspeed.portlet.*"
session="false"%>
response.setContentType("text/html");
必须在 portlet URI(JSR 168 使用术语 URL)中将对 portlet、portlet 页面或 portlet 资源的引用进行编码。在当前方式下,IBM portlet API 使用 createURI 来指向调用 portlet;在先前方式下,使用 createReturnURI 来指向调用 portlet。JSR 168 portlet API 为操作阶段和显示阶段创建 URL(分别为 actionURL 和 renderURL)。
在 JSP 文件中: <portletAPI:createURI/>
<portletAPI:createReturnURI/>
在 Java 类中:PortletResponse.createURI()
PortletResponse.createReturnURI()
在 JSP 文件中: <portlet:actionURL/>
<portlet:renderURL/>
在 Java 类中:RenderResponse.createActionURL()
RenderResponse.createRenderURL()
Portlet JSP 文件必须对引用相关联 WAR 文件中的资源(例如,图像、applet 和其它 JSP 文件)的 URL 进行编码。JSR 168 portlet API 还要求将上下文路径包含在 URL 中。
<%= response.encodeURL("images/photo01.jpg") %>
<%= renderResponse.encodeURL(renderRequest.getContextPath() + "/images/photo01.jpg") %>
在练习 1.3 的名称空间编码中讨论了 Java 类和 JSP 文件的名称空间编码。
这两种 API 的示例代码都说明了如何使用 JSTL 标记 <fmt:setBundle>。此标记引用样本的 JavaSource/nls
目录中的标准 Java 资源束 Text.properties
。将此资源束与用来定义 portlet 的资源束进行比较。
<fmt:setBundle basename="nls.Text" />
<fmt:setBundle basename="nls.Text" />
现在,您可以开始进行练习 1.6:决定使用哪个 API 了。