技术开发 频道

groupspace使用IPC创建INTERPORTLET连接

事件处理程序

  下一步是添加一个定制事件处理程序方法到支持文件。这个方法将被IPC框架使用。它将是针对事件的动作,事件是为参与这个框架的不同portlet而定义的。当您了解被要求作为此实现的一部分的Portlet配置时,这一点将变得更加清晰。下面是一个这样的代码示例:

public void gsLink_evalLinkHandler(HttpServletRequest req, HttpServletResponse res, Event event) { String targetPortletId = (String) req.getAttribute("gsLink_targetPortletId"); PortletBackingContext myBacking = PortletBackingContext.getPortletBackingContext(req); String myId = myBacking.getInstanceId(); // Only react to this event if my portlet id matches the // one set in the request. if (targetPortletId != null && targetPortletId.equals(myId)) { MetaData meta = myBacking.getMetaData("gsLink_idAttrName"); if (meta != null && meta.getContents() != null && meta.getContents().length > 0) { // Determine what the content id attribute name should // be as specified in the portlet metadata. // Then set it in the request. String idAttrName = meta.getContents()[0]; req.setAttribute(idAttrName, req.getParameter("gsLink_contentId")); // Flag the request so that the resulting portal page // knows that the details event was handled. req.setAttribute("gsLink_detailsEventHandled", "true"); // Fire off the show details event. This event is only // being listened to by itself. myBacking.fireCustomEvent("showDetailsEvent", "payload"); } } }

  这个方法的第一步是确定当前portlet是否为应当处理事件的portlet(第5行至13行)。通过比较当前portlet实例ID与在事件准备期间在请求中设置的targetPortletId,可以完成这项任务(参阅支持文件一节中代码示例的第58行)。如果当前portlet是应当处理事件的portlet,您必须进一步准备请求,以使最终执行的页面流动作能够确定最初被点击的内容条目。在第22行,从portlet元数据获得ID属性的名称。此元数据将在下一节Portlet配置中做进一步的解释。从请求参数中取得内容ID,并通过输入该ID属性名称将其设置为请求属性。

  在第28行,请求属性“gsLink_detailsEventHaqndled”被设置为“true”,以指示已经有一个portlet对事件做出响应。通过这样设置请求标志,您能够在JSP页面上确定某个portlet是否已经适当地处理了点击事件。如果没有发现portlet去处理给定内容类型的事件,您可以把此信息传递给用户。

  在代码第32行,另外一个定制事件触发了。该事件是整个实现过程中两个IPC事件中的第二个。

0
相关文章