WebSphere Portal 版本 4.1 的 Portlet API 更改成与 J2EE 规范一致。所有 portlet 是从 Servlet API 的 HttpServlet 类的扩展,并且把所有 portlet 作为 servlet 部署。如果要部署 WebSphere Portal Server 版本 1.2 或 2.1 的 portlet,阅读下列章节确定如何迁移 portlet 来使用新的 Portlet API。
更改到 Portlet API
要提供功能增强并移动 Portlet API 到标准 API 实现,IBM 更新了 Portlet API。WebSphere Portal 4.1 中一些新的 API 的突出显示包含:
- 遵从 J2EE 规范
- 与应用程序服务器更紧密地集成
- 增强的 portlet 消息传递。现在 portlet 可以使用
DefaultPortletMessage
类发送消息到其它 portlet 应用程序中的 portlet。发送 portlet 的消息和接收 portlet 的消息必须位于相同的门户网站页面上。
下列类和方法更改:
类 | 方法 | 更改 | 注释 |
---|---|---|---|
Event | getPortlet() | Deprecated | 请参阅事件 Javadoc |
PortletConfig | getAttribute() | Changed | 使用 getInitParameter() |
PortletContext | Send | Deprecated | 请参阅 PortletContext Javadoc 以获得新的方法签名 |
PortletData | removeAllAttributes() | Deprecated | 无替换 |
PortletRequest | getUser() | Added | |
PortletRequest | getPortletSettings() | Added | PortletSettings 是 portlet 的配置数据。PortletData 仍然是存储用户设置和值的地方。 |
PortletRequest | getSession() | Changed | 现在 getPortletSession() |
PortletResponse | encodeURI() | Deprecated | 使用 encodeURL() |
PortletResponse | getCharacterSet() | Deprecated | 使用 getCharacterEncoding() |
PortletSession | getUser() | Deprecated | 使用 PortletRequest.getUser() |
PortletApplicationSettings | Added | 管理由门户网站管理员更新的 portlet 应用程序设置 | |
PortletSettings | Added | 管理由门户网站管理员更新的 portlet 设置 | |
SaxPortlet | Removed | 不再支持此类。 |
管理 portlet 配置数据
在早期版本中,PortletRequest
、PortletResponse
和 PortletSession
指不从它们的 servlet 变体对象继承的离散对象。在 WebSphere Portal 4.1 中,这些对象直接从它们的 servlet 变体对象继承,按如下所示:
WebSphere Portal 版本 V1.2 和 V 2.1 | WebSphere Portal V4.1 | ||
---|---|---|---|
PortletContext | 由开发者设置:只读 | ||
PortletContext | |||
PortletApplicationSettings | 初始由开发者设置:可以由 管理员更改 | ||
PortletConfig | 由开发者设置:只读 | ||
PortletConfig | |||
PortletSettings | 初始由开发者设置:可以由 管理员更改,可读/写。 | ||
在以前版本中,视图方式下的 portlet 可以在 PortletData
对象中和 portlet 事件处理期间存储数据。版本 4.1 中,portlet 仅当 portlet 处于编辑方式时可以在 PortletData
对象中存储值。如果 portlet 没有在编辑方式下而试图更新这些值,会出现异常。请参阅 Portlet API 以获取关于这些对象的详细信息。
迁移 Java 源代码
Portlet 接口由抽象的 Portlet 类替换。抽象的 Portlet 类的方法进行了更改,需要对任何直接扩展该类的 portlet 的更改。然而,Portlet 不应该从 Portlet 类直接继承。相反,portlet 应该扩展帮助器类,如 AbstractPortlet、MVCPortlet,或 PortletAdapter。跨越门户网站的发行版维护这些类的方法和签名。
实例或现有 portlet 的扩展的 portlet,或使用裁剪 portlet 创建的 portlet 不需要迁移。
访问用户主题
JAAS 用户主题的检索已更改。在 WebSphere Portal Server 2.1 中,portlet 通过获取用户主题的引用来访问用户的安全性信息。
PortletSession session = portletRequest.getSession(); // Get the Portlet Session org.apache.jetspeed.portletcontainer.UserImpl // Get the User Object user =(org.apache.jetspeed.portletcontainer.UserImpl) session.getUser(); Subject subject = user.getSubject(); // Next, grab the Subject
在 WebSphere Portal 4.1 中,从 PortletContext
访问用户主题。下例演示如何获取用户主题的引用:
import org.apache.jetspeed.portlet.*; import com.ibm.wps.portletservice.credentialvault.CredentialVaultService; import javax.security.auth.Subject; PortletContext context = this.getPortletConfig().getContext(); CredentialVaultService service = (CredentialVaultService) context.getService(CredentialVaultService.class); Subject userSubject = service.getUserSubject(portletRequest);
一旦检索用户主题的引用,还可以检索用户凭证的信息和用户主题的其它信息。要获取进一步的信息,请参阅Portlet 安全性。
计算请求、响应和会话对象
在早期版本中,PortletRequest
、PortletResponse
和 PortletSession
为离散对象,不继承它们的 servlet 变体对象。可能需要在 portlet 中计算这些 portlet 对象之一,按如下所示:
HttpServletRequest httpRequest = ((PortletRequestImpl) request).getServletRequest(); HttpServletResponse httpResponse = ((PortletResponseImpl) response).getServletResponse(); HttpSession hSession = ((PortletSessionImpl) session).getHttpSession();
在 WebSphere Portal 4.1 中,这些对象从它们的 servlet 变体对象继承,按如下所示。
Portlet 对象 | Servlet 对象 |
---|---|
PortletSession | HttpSession |
PortletRequest | HttpRequest |
PortletResponse | HttpResponse |
既然 portlet 对象是 servlet 对象的直接子代,不需要计算来派生 servlet 对象。仅直接使用对象。
PortletSession myPortletSession = request.getSession(); String myServletID = myPortletSession.getID(); // HttpSession.getID()
迁移 JSP
在早期版本中,portlet 容器重新定义了 JSP 中通过 PortletContext.include 方法调用的一些标准 JSP 标记的语义。例如,对于 <jsp:useBean scope="request">,bean 存储在 PortletRequest 而不是 HttpServletRequest。
对于 WebSphere Portal 4.1,JSP 1.1 规范中的标记如规范中定义的那样进行处理,甚至当运行在 portlet 容器的上下文中也如此。portlet JSP 标记库有更改。<encodeURI> 标记被取消;应该使用 portletResponse 的 encodeURL() 方法替代。请参阅使用 Portlet API 标记以获取完整信息。
迁移 portlet 部署描述符
因为现在 portlet 被作为 Web 应用程序下列 J2EE 型号封装,所以需要附加的部署描述符。Web 应用程序部署描述符包含标识 portlet 作为 Web 应用程序中的 servlet 所必需的信息。servlet 标识由 <portlet> 标记的 HREF 属性映射到 portlet 部署描述符中的 portlet。
而且,根据具体 portlet 和具体 portlet 应用程序的介绍,portlet 部署描述符也已经更改。portlet 应用程序中每个 <portlet> 标记仍然包含 <portlet-name>、<allows>、<cache> 和 <supports> 标记。移动 <default-locale>、<language> 和 <config-param> 标记来定义具体 portlet。<context-param> 是 <concrete-portlet-app> 元素的一部分。这允许一个 portlet 以多种方法配置而无须创建多个 portlet 实例。
请参阅部署描述符以获取更多的信息。
迁移 portlet 软件包
portlet 现在封装在 WAR 文件中。在最小值情况下,需要重新封装 portlet。portlet WAR 中的目录结构和 J2EE web 应用程序的目录结构一致。在以前版本中,诸如 Java 类和 JAR 文件的受保护资源,存储在 /PORTLET-INF 目录中。受保护资源现在存储在 /WEB-INF 目录中。
要获取更多的信息,请参阅封装和部署 portlet。