在开始之前,应该先完成练习 1.2:两种 API 在概念方面的差别。
在此练习中,您将了解两个 portlet API 在 Java 类编码方面的差别。研究两个版本的 BookmarkPortlet Java 类。注意两种 API 之间的基本差别:
这两种 API 导入的 portlet 类是不同的。
import org.apache.jetspeed.portlet.*;
import javax.portlet.*;
这两种 API 是从不同的类继承的。IBM portlet API 扩展 org.apache.jetspeed.portlet.PortletAdapter(它提供了 org.apache.jetspeed.portlet.Portlet 接口的缺省实现)。此 Portlet 类扩展 HttpServlet,因此,IBM portlet 是一种类型的 servlet。JSR 168 portlet API 提供了 javax.portlet.GenericPortlet 类,该类将实现 javax.portlet.Portlet 接口。
public class BookmarkPortlet extends PortletAdapter implements ActionListener
public class BookmarkPortlet extends GenericPortlet
render(JSR 168 API)或 service(IBM API)方法(例如,doView() 和 doEdit())上的请求和响应对象的名称不同。IBM portlet API 使用 PortletRequest 和 PortletResponse 对象;而 JSR 168 API 使用 RenderRequest 和 RenderResponse 对象。RenderRequest 和 RenderResponse 将分别扩展 PortletRequest 和 PortletResponse 对象,并提供常见功能。
public void doEdit(PortletRequest request, PortletResponse response)
public void doEdit(RenderRequest request, RenderResponse response)
IBM portlet API 使用 PortletContext 对象来包含 JSP 文件;而 JSR 168 portlet API 使用 PortletRequestDispatcher 对象来包含 JSP 文件。包含操作将调用指定的 JSP 文件。
getPortletConfig().getContext().include(EDIT_JSP, request, response);
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(jspName);
rd.include(request, response);
IBM portlet API 将用户数据存储在 PortletData 对象中。JSR 168 portlet API 将类似信息存储在 PortletPreferences 对象中。
PortletData prefs = portletRequest.getData()
PortletPreferences prefs = renderRequest.getPreferences()
在 IBM portlet API 中,Java 类必须通过提供 actionPerformed() 方法来实现 ActionListener 接口。使用 JSR 168 portlet API 时,Java 类必须提供 processAction() 方法;不需要侦听器。
public void actionPerformed(ActionEvent event) throws PortletException
public void processAction(ActionRequest request, ActionResponse response)
名称空间编码可用来确保 portlet 中使用的变量在门户网站容器内是唯一的。下面的摘录还说明了可在 JSP 文件中使用的名称空间编码方法。
在 Java 类中:PortletResponse.encodeNamespace()
在 JSP 文件中: <portletAPI:encodeNamespace/>
在 Java 类中:RenderResponse.getNamespace()
在 JSP 文件中: <portlet:namespace/>
现在,您可以开始进行练习 1.4:比较部署描述符差别了。