Websphere Portal Server 虚拟门户 IBM 门户 API

Websphere Portal Server Virtual Portal IBM Portal API

我正在使用 IBM Portal API 在 Websphere Portal Server 中开发一些页面,但我想在嵌套在我的主要门户中的虚拟门户的上下文中工作。我已经阅读了 IBM 的文档,但我不明白它是如何工作的,所以我决定问问你们。你们中有人已经这样做了吗? 这就是我尝试从虚拟门户获取 ContentNode 的方式:

private void createPortalContent(HttpServletRequest request, HttpServletResponse response) throws InterruptedException, ModelException{
    Context ctx = null;
    try {
        ctx = new InitialContext();

        portletModelHome = (PortletModelHome) ctx.lookup(PortletModelHome.JNDI_NAME);
        if(portletModelHome == null){
            Thread.sleep(5000);
            portletModelHome = (PortletModelHome) ctx.lookup(PortletModelHome.JNDI_NAME);
        }

        contentModelHome = (ContentModelHome) ctx.lookup(ContentModelHome.JNDI_NAME);
        if(contentModelHome == null){
            Thread.sleep(5000);
            contentModelHome = (ContentModelHome) ctx.lookup(ContentModelHome.JNDI_NAME);
        }

        contentModelControllerHome = (ContentModelControllerHome) ctx.lookup(ContentModelControllerHome.JNDI_NAME);
        if(contentModelControllerHome == null){
            Thread.sleep(5000);
            contentModelControllerHome = (ContentModelControllerHome) ctx.lookup(ContentModelControllerHome.JNDI_NAME);
        }

        contentMappingInfoHome = (ContentMappingInfoHome) ctx.lookup(ContentMappingInfoHome.JNDI_NAME);
        if(contentMappingInfoHome == null){
            Thread.sleep(5000);
            contentMappingInfoHome = (ContentMappingInfoHome) ctx.lookup(ContentMappingInfoHome.JNDI_NAME);
        }

        virtualPortalList = (VirtualPortalListHome) ctx.lookup(VirtualPortalListHome.VIRTUAL_PORTAL_LIST_JNDI_NAME);
    } catch (NamingException e) {
        e.printStackTrace();
    }

    ContentModelController contentModelController = getController(request, response);
    //LOGGER.info("### CONTENT MODEL CONTROLLER: " + contentModelController.getLocator() + " " + contentModelController.getRoot().toString());
    ContentNode contentNode = (ContentNode) contentModelController.getLocator().findByUniqueName("ro.ram.comunicate");
    //LOGGER.info("### CONTENT NODE: " + contentNode);
   // LOGGER.info("#### VIRTUAL PORTAL LIST: " + virtualPortalList);

    //VirtualPortal virtualPortal = virtualPortalList.getVirtualPortalListProvider().getVirtualPortalList().getLocator().findByUniqueName("");
   // LOGGER.info("### VIRTUAL PORTAL: " + virtualPortal.getTitle(Locale.ENGLISH));
    //Iterator<VirtualPortal> it=virtualPortalList.getVirtualPortalListProvider().getVirtualPortalList().iterator();
   // while(it.hasNext()){
   //     LOGGER.info("### VIRTUAL PORTAL LIST ITERATOR: " + it.next().getDescription(Locale.ENGLISH) + " " + " " + it.next().getTitle(Locale.ENGLISH));
  //      it.next();
    //}
}

谢谢,

因此寻找唯一名称不是一个好主意,在门户范围之外工作时必须寻找页面的 objectid。来自信息中心的评论 ” 虚拟门户的概念将某些模型的范围限定为用户在其中操作的虚拟门户。目前,此范围概念适用于内容模型、导航模型和导航选择模型。这些模型将其资源限定为虚拟用户操作的门户。” 我认为您最好将此代码移动到 portlet 的资源请求中,然后通过它进行更新,以便确定范围。如果您想继续沿着这条路走下去,那么在使用 Identification 包将 objectid 的字符串表示形式转换为实际对象之后,代码不会查找 uniquename 而是查找实际的对象 id,然后在该对象上使用定位器

对于每个想做类似事情的人来说,解决方案(这是给我的)可能是:

  1. 使用 IBM WCM API 创建一个 class 来实现 VirtualPortalScopedAction。在此 class 中,您必须覆盖 运行 方法。这个接口的实现是很有必要的。
  2. 在 运行 方法中,您可以进行所有计算。在这里,您必须实例化 IBM Portal API 和 SPI 公开的对象(ContentModelController、ContentModelHome、ContentModelControllerHome)。所有这些都是在 IBM Websphere Portal 中进行操作所必需的。
  3. 在实现 VirtualPortalScopedAction 的 class 中,您必须传递 HttpServletRequest 和 HttpServletResponse,因为实例化所有这些对象会使用请求和响应。为此,很明显您在 class 中声明了两个属性并使用 setter 来设置请求和响应的实例。

谢谢大家:)希望这对你有帮助!