練習 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 設定呈現回應之 MIME 類型的方法不同。IBM Portlet 在 JSP 檔的 page 指引上宣告 MIME 類型。JSR 168 Portlet 在呈現方法 (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 的參照,Portlet 頁面或 Portlet 資源必須編碼在 Portlet URI 中(JSR 168 使用 URL 一詞)。IBM Portlet API 利用 createURI 來指向現行模式中發出呼叫的 Portlet,利用 createReturnURI 來指向上一模式中發出呼叫的 Portlet。JSR 168 Portlet API 會建立動作階段 (actionURL) 和呈現階段 (renderURL) 的 URL。

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 檔必須將 URL 編碼成參照相關 WAR 檔中的資源,如影像、Applet 和其他 JSP 檔。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.