将基本 IBM portlet 迁移到 JSR 168

来源:百度文库 编辑:神马文学网 时间:2024/09/30 00:35:10
本主题描述将 IBM portlet 迁移到遵从 JSR 168 的 portlet 所需的某些较常见的更改。这并未描述所有的更改。许多迁移任务取决于 portlet 代码中的复杂程度。您必须熟悉 JSR 168 规范以确定本主题中未涉及的任何其余迁移更改。
更改 Java 源代码更改 JSP 源代码更改 portlet 部署描述符
更改 Java 源代码
更改导入语句以使用 JSR 168 软件包。
更改前:
import org.apache.jetspeed.portlet.*; import org.apache.jetspeed.service.*;
更改后:
import javax.portlet.*; import com.ibm.portal.portlet.service.*; 更改类继承以使用 GenericPortlet。注意,不实施 ActionListener。
更改前:
public class SamplePortlet extends PortletAdapter implements ActionListener{ ... }
更改后:
public class SamplePortlet extends GenericPortlet{ ... }更改用于所有呈现方法的对象。在 JSR 168 中,PortletRequest 和 PortletResponse 为 RenderRequest 和 RenderResponse 子类定义常见功能。这些子类是 render() 方法的所有实施的实参,包括 doView()、doEdit() 和 doHelp()。
更改前:
public void doView(PortletRequest request, PortletResponse response) { ... }
更改后:
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException{ ... }更改 actionPerformed() 方法。在 JSR 168 中,此方法由 processAction() 方法替换,这就不需要 portlet 来实施侦听器。processAction() 方法将 ActionRequest 和 ActionResponse 接受为实参,这将扩展 PortletRequest 和 PortletResponse。
更改前:
public void actionPerformed(ActionEvent event) throws PortletException{ ... }
更改后:
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException{ ... } 更改设置响应内容类型的方式。在 JSR 168 中,必须先设置响应中返回的 MIME 输出类型,才能将 JSP 包括在内。IBM portlet 使用 JSP 的页面伪指令的 contentType 属性声明 MIME 类型。因此,进行了此项更改后就不需要在 JSP 中设置 contentType 了。
将以下内容添加到 JSP:
response.setContentType("text/html");更改 JSP 包含。在 JSR 168 中,JSP 由请求分派器的 include() 方法包含。在 portlet 的呈现方法中,在响应中返回输出前,设置该输出的 MIME 类型。
更改前:
PortletContext context = getPortletConfig().getContext(); context.include("/jsp/View.jsp", request, response);
更改后:
response.setContentType("text/html"); PortletContext context = getPortletConfig().getPortletContext(); context.getRequestDispatcher("/jsp/View.jsp").include( request, response); 更改存储用户数据的类。在 JSR 168 中,用户数据存储在 PortletPreferences 对象中,而不是存储在使用 IBM Portlet API 提供的 PortletData 对象中。注意请求对象使用 getter 方法和数据对象使用 setter 方法的不同。
更改前:
PortletData portData = request.getData(); portData.setAttribute("userName", userName); portData.store();
更改后:
PortletPreferences prefs = request.getPreferences(); prefs.setValue("userName",request.getParameter("username")); prefs.store();
某些首选项是只读的且只能由管理员修改。请参阅将配置参数更改为首选项以获取更多信息。
更改用于名称空间编码的方法。例如,如果 portlet 使用 encodeNamespace() 返回唯一的字符串作为 portlet 生成的内容中 JavaScript 变量名的前缀,则 portlet 现在应该使用 getNamespace()。
更改前:
PortletResponse.encodeNamespace()
更改后:
RenderResponse.getNamespace()更改生成 portlet URL 的方式。例如,portlet 的 doEdit() 方法可能将 URI 保存为编辑方式以传递到 JSP。portlet 必须使用 createRenderURL() 方法实例化 PortletURL 对象。
更改前:
// Save URI for the edit page PortletURI editURI = response.createURI(); ... // Preserve the edit page URI in the request to make it accessible by the edit JSP request.setAttribute("editURI", editURI.toString());
更改后:
// Save URI for the edit page PortletURL editURL = response.createRenderURL(); ... // Preserve the edit page URI in the request to make it accessible by the edit JSP request.setAttribute("editURL", editURL.toString());
JSR 168 对于 createReturnURI() 没有同等方法。如果 URL 要调用 portlet 的操作方法,但 portlet 应该使用 createActionURL() 方法。
更改 JSP 源代码
将标记库更改为 JSR 168。
更改前:
<%@ taglib uri="/WEB-INF/tld/portlet.tld" prefix="portletAPI" %>
更改后:
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %> 将引用更改为 API 对象。在 JSR 168 中, JSP 标记使 RenderRequest、RenderResponse 和 PortletConfig 对象可用于 JSP 文件。进行此更改后,JSP 中对 PortletRequest 和 PortletResponse 的所有引用应该更改为相应的 RenderRequest 和 RenderResponse。
更改前:
... <% PortletData prefs = portletRequest.getData(); %>
更改后:
... <% PortletPreferences prefs = renderRequest.getPreferences(); %> 更改用于名称空间编码的 JSP 标记。例如,如果 portlet 使用 唯一地限定文本输入字段的名称,则必须按如下所示更改此标记。
更改前:

更改后:
更改生成 portlet URL 的方式。如果 portlet JSP 为它自己创建一个 URL,则它应该使用 标记指定对哪种方法进行控制。URL 上传递的任何参数都是使用 标记指定的。
更改前:

更改后:
更改资源束。不推荐使用 IBM Portlet API 的 标记,而是应该在所有 portlet 中使用等价的 JSTL 替换它。请参阅在 portlet JSP 中使用 JSTL 以获取更多信息。
更改前:

更改后:
... 更改从 JSP 调用资源的方式。例如,如果 JSP 显示图像,则它应该使用适当响应对象的 encodeURL() 方法,另外,添加来自请求的 portlet 的上下文路径。
更改前:
‘ alt="photo">
更改后:
‘ alt="photo">
更改 portlet 部署描述符
以下步骤描述 IBM Portlet API 的 portlet 部署描述符和 Java Portlet 规范之间的某些区别。然而,JSR 168 描述符中元素的顺序很重要,并且将在部署期间严格执行。开发 portlet 部署描述符时,您应该使用执行验证的工具(如,Rational Application Developer)。
除去 DOCTYPE 声明。JSR 168 的 portlet 描述符使用 XML 模式,这将添加到下一步中。
除去以下内容:
除去 元素。JSR 168 的 portlet 描述符中顶层元素是
除去以下内容:
.... 更新 元素。 添加模式定义。 将 major-version 和 minor-version 属性组合到版本属性中。 将 uid 属性更改为 id。
更改前:

更改后:
除去所有 元素及其内容。保存任何必需的信息(如,配置参数和语言定义)以在 portlet 定义中使用。
更新 元素。除去 href、minor-version 和 major-version 属性。
更改前:

更改后:
将 portlet 类的定义从 web.xml 移动到 portlet.xml。
从 web.xml 除去以下内容:
MyPortlet com.mycompany.samples.MyPortlet MyPortlet /MyPortlet/*
将以下内容添加到 portlet.xml:
com.mycompany.samples.MyPortlet更改定义高速缓存的方式。将 IBM portlet 描述符的 值用作 JSR 168 中 元素的值。JSR 168 中没有等同于 元素的值。请参阅高速缓存 portlet 输出以获取更多信息。
更改前:
-1 no
更改后:
-1 更改 元素的内容。 将受支持的标记更改为 MIME 类型。 使用 元素。
JSR 168 描述符允许您只声明 MIME 类型。在某些情况下,两种标记类型将使用同一 MIME 类型。例如,HTML 和 cHTML 都使用“text/html”作为 MIME 类型。对于 JSR 168,WebSphere Portal 接受 wps.markup 初始化参数的值作为标记类型。
更改前:

更改后:
wps.markup html,chtml ... text/html VIEW EDIT
确保将初始化参数放在 元素前。
除去窗口状态元素。缺省情况下,支持常规窗口、最大化窗口和最小化窗口状态,且不在 JSR 168 的 portlet 部署描述符中声明。
除去以下内容:
将配置参数更改为首选项。在 JSR 168 中,首选项可以由用户以任何标准方式更改,或者可以将它们声明为只读且只能由管理员修改。
更改前:
Location Antartica
更改后:
Location Antartica true 更改本地化设置。 除去 元素。在 JSR 168 中,描述符中列出的第一个语言环境是缺省值。如果未指定语言环境,则缺省情况下使用英语。 为每种受支持的语言创建包含 portlet 的标题、简短标题和关键字的资源束。使用以下参数名: javax.portlet.title = My Portlet Title javax.portlet.short-title = Title javax.portlet.keywords = portlets, JSR 168, portal 如以下示例所示,在 portlet 描述符中声明资源束。 nls.MyPortlet
在此示例中,缺省资源束 MyPortlet.properties 在 WAR 文件的 /WEB-INF/nls 子目录中,且所有特定于语言环境的资源束在文件名后都追加了语言环境(例如,MyPortlet_ja.properties 用于日语)。
如以下示例所示,声明每种受支持的语言环境: en de 如以下示例所示,设置 portlet 描述的本地化值和显示名。 English description English display name-name> German description German display name-name>
注:应该出于兼容性原因而设置显示名。然而,它当前未被 WebSphere Portal 使用。
迁移使用 Struts Portlet Framework 的 IBM portlet
现有版本的 Struts Portlet Framework 支持 IBM Portal 容器 API 或旧容器。本发行版引入了一个新版本的 Struts Portlet Framework,它现在支持 JSR 168 容器或标准容器。本发行版将继续提供一个支持旧容器的版本以及用于标准容器的新版本。Struts Portlet Framework 仍作为示例 war 文件提供,它可用于构建 Struts 应用程序。您可以根据名称来区分每个容器的 war 文件。SPFLegacy 示例支持旧容器,而 SPFStandard 示例支持标准容器。SPFLegacyBlank.war 是用于旧容器的 Struts 应用程序的起始点,而 SPFStandardBlank 是用于标准容器的 Struts 应用程序的起始点。
旧容器的 Struts Portlet Framework
SPFLegacyBlank.war 包含 Struts 应用程序中要包括的文件。相关目录为 WEB-INF/lib 和 WEB-INF/tld 目录。
以下是 WEB-INF/lib 目录中要用于应用程序的库列表:
PortalStruts.jar PortalStrutsCommon.jar PortalStrutsTags.jar StrutsUpdateForPortal.jar wp.struts-commons-logging.jar commons-beanutils.jar commons-collections.jar commons-fileupload.jar commons-lang.jar commons-validator.jar struts-legacy.jar struts.jar
TLD 目录中的文件包括:
struts-bean.tld struts-chtml.tld struts-html.tld struts-logic.tld struts-nested.tld struts-portal-html.tld struts-portal-wml.tld struts-template.tld struts-tiles.tld struts-wml.tld
标准容器的 Struts Portlet Framework
SPFStandardBlank.war 包含 Struts 应用程序中要包括的文件。相关目录为 WEB-INF/lib 和 WEB-INF/tld 目录。
以下是 WEB-INF/lib 目录中要用于应用程序的库列表:
wp.struts.standard.framework.jar PortalStrutsCommon PortalStrutsTags.jar StrutsUpdateForPortal.jar wp.struts-commons-logging.jar commons-beanutils.jar commons-collections.jar commons-fileupload.jar commons-lang.jar commons-validator.jar struts-legacy.jar struts.jar
TLD 目录中的文件包括:
struts-bean.tld struts-chtml.tld struts-html.tld struts-logic.tld struts-nested.tld struts-portal-html.tld struts-portal-wml.tld struts-template.tld struts-tiles.tld struts-wml.tld
IBM 容器和 JSR 168 兼容容器的公共文件
以下文件是 Jakarta Struts 1.1 二进制文件,对于 Struts Portlet Framework 的标准版本和旧版本,它们是相同的
commons-beanutils.jar commons-collections.jar commons-fileupload.jar commons-lang.jar commons-validator.jar struts-legacy.jar struts.jar
TLD 目录中的以下文件对于两种容器是相同的。将来的发行版中可能有所变化,因此强烈建议将 blank 中的文件用于期望的容器。
struts-bean.tld struts-chtml.tld struts-html.tld struts-logic.tld struts-nested.tld struts-portal-html.tld struts-portal-wml.tld struts-template.tld struts-tiles.tld struts-wml.tld
从 Struts Portlet Framework 的先前版本迁移到 Struts Portlet Framework 的标准版本
要从 Struts Portlet Framework 的旧版本迁移到标准版本,首先必须迁移到 SPFStandardBlank.war 文件随附的 jar 和 TLD。
以下是应用程序的 WEB-INF/lib 目录中必须更新的文件列表:
wp.struts.standard.framework.jar PortalStrutsCommon.jar PortalStrutsTags.jar StrutsUpdateForPortal.jar wp.struts-commons-logging.jar commons-beanutils.jar commons-collections.jar commons-fileupload.jar commons-lang.jar commons-validator.jar struts-legacy.jar struts.jar commons-digester.jar commons-logging.jar jakarta-oro.jar
以下是应该使用 SPFStandardBlank.war 文件的 TLD 更新的 TLD 文件列表:
struts-bean.tld struts-chtml.tld struts-html.tld struts-logic.tld struts-nested.tld struts-portal-html.tld struts-portal-wml.tld struts-template.tld struts-tiles.tld struts-wml.tld
以下 JAR 文件只有在 IBM 容器中是必需的且必须删除它:
PortalStruts.jar
Web 部署描述符
标准容器需要一个 Web 部署描述符,这是因为将把应用程序打包为一个 war 文件。但是,现在多数初始化参数是通过 portlet 部署描述符配置的。
将 servlet 类从 Web 部署描述符中除去。servlet 类不再象原来那样为标准容器中的应用程序指定 portlet 类。portlet 现在被指定为 portlet 部署描述符中的 portlet 类。 将 init 参数从 Web 部署描述符移动到 portlet 部署描述符中。由于 portlet 类现在是在 portlet 部署描述符中定义的,所以 init 参数也是在 portlet 部署描述符中指定的。请注意,init 参数在 portlet 部署描述符中被指定为名称和值,而不是在 Web 部署描述符中命名它们时那样指定为 param 名称和 param 值。 taglib 元素仍将保留在 Web 部署描述符中,无需更改。 欢迎文件元素仍将保留在 Web 部署描述符中,无需更改。
portlet 部署描述符
对于 portlet 部署描述符的定义,标准容器与旧容器有所不同。要在标准容器中部署迁移的示例,需要进行某些更改。对于标准容器,信息中心将包含 portlet 部署描述符语义的详细信息。
标准容器引入了用于指定 portlet 类的 portlet-class 元素。Struts Portlet Framework 的 portlet 类是 com.ibm.portal.struts.portlet.StrutsPortlet。 portlet 部署描述符中定义了 portlet 的 init 参数。您应该从 Web 部署描述符中迁移 init 参数。 标准容器在 portlet 部署描述符中没有抽象和具体之分。portlet 元素将定义受支持的方式以及 portlet 首选项。 Struts Portlet Framework 不再使用 portlet 过滤器。您不应迁移 FilterChain init 参数。
Struts 配置文件
Struts Portlet Framework 定义了请求处理程序,您必须在 Struts 配置文件中配置它。需要将控制器属性 processClass 迁移到要部署到标准容器中的以下值:

如果 Struts 应用程序使用支持 Tiles 的 Struts 请求处理程序,则还需要迁移 Struts 插件:

Struts 操作
Struts 操作类会传递到 HttpServletRequest 对象,因此应用程序对门户网站容器可能没有相关性。但是,许多应用程序使用 PortletApiUtils 来获取 portlet 请求并直接与 portlet API 交互。如果是这样,则应用程序必须将 org.apache.jetspeed 接口替换为同等 javax.portlet 接口。信息中心中记录了新的接口。
注:以下示例说明了 PortletApiUtils 对象获得的更改: 旧的:PortletApiUtils portletUtils = PortletApiUtils.getInstance(); 新的:PortletApiUtils portletUtils = PortletApiUtils.getUtilsInstance();
StrutsPortlet
旧容器的 com.ibm.wps.portlets.struts.WpsStrutsPortlet 类扩展了 PortletAdapter 类。可能已通过扩展 WpsStrutsPortlet 类来定制使用 Struts Portlet Framework 的 Struts 应用程序。如果是这样,则必须为标准容器迁移那些更改。标准容器的 com.ibm.portal.struts.portlet.StrutsPortlet 类扩展了标准容器的 GenericPortlet。
请求处理程序
旧容器的 com.ibm.wps.portlets.struts.WpsRequestProcessor 类可能已被扩展来定制处理。标准容器的请求处理程序类是 com.ibm.portal.struts.portlet.WpRequestProcessor。如果旧接口已用于定制,则需要将这些更改迁移到标准接口。