開始之前,您應該先完成練習 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 設定呈現回應之 MIME 類型的方法不同。IBM Portlet 在 JSP 檔的 page 指引上宣告 MIME 類型。JSR 168 Portlet 在呈現方法 (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 的參照,Portlet 頁面或 Portlet 資源必須編碼在 Portlet URI 中(JSR 168 使用 URL 一詞)。IBM Portlet API 利用 createURI 來指向現行模式中發出呼叫的 Portlet,利用 createReturnURI 來指向上一模式中發出呼叫的 Portlet。JSR 168 Portlet API 會建立動作階段 (actionURL) 和呈現階段 (renderURL) 的 URL。
在 JSP 檔中: <portletAPI:createURI/>
<portletAPI:createReturnURI/>
在 Java 類別中:PortletResponse.createURI()
PortletResponse.createReturnURI()
在 JSP 檔中: <portlet:actionURL/>
<portlet:renderURL/>
在 Java 類別中:RenderResponse.createActionURL()
RenderResponse.createRenderURL()
Portlet JSP 檔必須將 URL 編碼成參照相關 WAR 檔中的資源,如影像、Applet 和其他 JSP 檔。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。