支持文件
第一步是建立一个portlet支持文件,框架中所有参与的portlet都必须使用它。当用户点击一个内容链接时,这个支持文件将运行。handlePostbackData()方法将用于确定某个链接是否被点击,并且将准备正确处理portlet的事件。下面是该例子的代码:
第5行用于确定一个链接是否被点击。此动作可以通过检查一个已知的请求参数来验证。在本文后续内容中,您将看到当一个链接被点击时,特定的请求参数是如何被设定的。如果一个链接被点击,下一步您必须确定以前运行的支持文件已经准备了事件(代码第10行)。同样,这将通过检查一个已知的请求参数来验证。public boolean handlePostbackData(HttpServletRequest req, HttpServletResponse res) { // Determine if a GroupSpace content link was clicked. String linkClicked = req.getParameter("gsLink_linkClicked"); if (linkClicked != null && linkClicked.equals("true")) { // Determine if the event was already prepared by a // previously run portlet backing file. String eventPrepared = (String) req.getAttribute("gsLink_eventPrepared"); if (eventPrepared == null) { // Find all portlets that can handle the type. String type = req.getParameter("gsLink_contentType"); if (type != null) { String[] values = a; MetaData[] metaData = {new MetaData("gsLink_contentType", values)}; DesktopBackingContext dback = DesktopBackingContext.getDesktopBackingContext(req); PortletBackingContext[] pback = dback.getPortletBackingContextsByMeta(metaData, 0); if (pback != null && pback.length > 0) { String instanceId = pback[0].getInstanceId(); // Determine which portlet is the best to handle the // displaying of the content details based on the // current portlet and current page. String curPortletId = req.getParameter("gsLink_currentPortletId"); String curPageId = req.getParameter("gsLink_currentPageId"); if (curPageId != null) { for (int i = 0; i < pback.length; i++) { PageBackingContext pContext = pback[i].getPageBackingContext(); if(curPageId.equals(pContext.getInstanceId())) { instanceId = pback[i].getInstanceId(); } } } if (curPortletId != null) { for (int i = 0; i < pback.length; i++) { if (curPortletId.equals(pback[i].getInstanceId())) { instanceId = pback[i].getInstanceId(); } } } // Set the target portlet id (the one that will // display the details) as a req attribute. req.setAttribute("gsLink_targetPortletId", instanceId); } } req.setAttribute("gsLink_eventPrepared", "true"); req.setAttribute("gsLink_detailsEventHandled", "false"); PortletBackingContext myBacking = PortletBackingContext.getPortletBackingContext(req); myBacking.fireCustomEvent("linkClickedEvent", "payload"); } } return false; }
下一步是准备事件。代码第15行通过检查一个请求参数来确定被点击的内容类型。接下来的几行代码用来确定哪个portlet应该处理该内容类型的事件。这使用portlet元数据来完成。下面的Portlet配置一节解释了元数据的设置。
在代码第32行到35行,通过请求参数获得两方面的更多信息。当前的portlet ID表明被点击的链接所属的portlet。当前的页ID表明该页所属的当前portlet。这两项信息在以下两种特定情况下很重要:
- 如果当前portlet能够处理此内容类型,则此portlet将被指定去处理事件。
- 如果能够处理这种内容类型的portlet作为当前portlet存在于同一页上,则此portlet将被指定去处理事件。
当导航链接时,这些特殊情况帮助减少用户体验的“四处乱跳“。
代码第37行至54行确定最适合处理这种内容类型事件的portlet的实例ID。第58行说明这个ID作为请求属性被添加。
最后,另外两个请求属性被设置用来表明事件已经准备好,但还没有处理。接着,一个定制的事件触发了。这是两个IPC事件中的第一个。在Portlet 配置一节中,您将学会如何配置这些事件。