内容


使用 Rational Application Developer 8.0.4 创建多渠道复合 portlet 应用程序,第 3 部分

在 portlet 中显示来自 Microsoft SharePoint 的数据

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 使用 Rational Application Developer 8.0.4 创建多渠道复合 portlet 应用程序,第 3 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:使用 Rational Application Developer 8.0.4 创建多渠道复合 portlet 应用程序,第 3 部分

敬请期待该系列的后续内容。

下载 IBM® Rational® Application Developer 试用版  |  在线试用 IBM® Rational® Application Developer
下载 IBM® WebSphere® Application Server 试用版  |  IBM® WebSphere® Application Server for Developers
下载 IBM® DB2® for Linux, UNIX, and Windows 试用版  |   IBM® DB2® Express-C(免费产品)
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

现在,您已了解了如何使用服务数据对象(Service Data Objects,SDO)获取并显示来自数据库表的数据,让我们把精力集中在与其他数据源的集成上。在这一部分中,您将使 portlet 应用程序能够从 Microsoft SharePoint 服务器中获取数据。SharePoint 暴露了不同的 Web 服务,以便使用其大量特性。以下是 SharePoint 暴露的 Web 服务的清单(请参阅本文的 参考资源 小节,以获得相关链接)。通过使用这些 Web 服务,您可以在 IBM® Rational® Application Developer 中生成骨架代码。


在开始本节之前,请参阅第 1 部分的“设置”小节。

使 portlet 能够获取 SharePoint 数据

在本节中,您将使 portlet 能够从 SharePoint 服务器中获取数据。

要点:
在开始本节之前,请务必复习第 1 部分中的“先决条件”和“设置”小节(参阅“本系列的更多内容”)。

下面简要概括了使用 SharePoint 数据的步骤:

  1. 通过使用 SharePoint 暴露的 Web 服务以及 Rational Application Developer 中的 Java API for XML Web Services (JAX-WS) 工具,在 Rational Application Developer 中生成骨架代码。
  2. 在骨架代码上编写业务逻辑,以便适当地使用来自 SharePoint 的数据。
  3. 使用业务逻辑获取并显示来自 SharePoint 文档库的数据。被提取的数据将由 portlet 使用并呈现在一个门户页面中。

从 SharePoint Web 服务生成骨架代码

按照以下步骤,从 SharePoint Web 服务生成骨架代码:

  1. 在工作区中新建一个 Java 项目,并将其命名为 SharePointProject,如图 1 所示。
图 1. Java 项目
工作区中的新 Java 项目
  1. 选择 Windows > Show View > Other > Services 打开 Services 视图,如图 2 所示。
图 2. Services 视图
在 Services 选项卡中选中的 JAX-WS 选项
  1. 右键单击 Services 选项卡下面的 JAX-WS ,并选中 Create Client 选项(参见图 3 ),打开 Web Service Client 向导,如图 4 所示。
图 3. Services 选项卡
在下拉菜单中选中的 Create Client
图 4. Web Service Client 向导
选择一个服务定义的屏幕截图
选择一个服务定义的屏幕截图
  1. 在 Web Service Client 向导中的 Configuration 部分下面,在 Server Runtime 中单击 WebSphere Application Server v8.0 链接来启动 Client Environment Configuration 窗口,然后就可以选择 IBM® WebSphere® Portal v7.0 Server,如图 5 所示。
    注:
    仅当您在 Rational Application Developer 安装过程中选择将 WebSphere Application Server v8.0 安装为其中一个运行时服务器时,WebSphere Application Server v8.0 在图 5 中才是可用的。
图 5. Client Environment Configuration 窗口
选中的 WebSphere Portal v7.0
选中的 WebSphere Portal v7.0
  1. 类似地,将客户端项目更改为 SharePointProject,该项目已在第 1 步中创建,Web Service Client 窗口如图 6 所示。
图 6. Web Services 对话窗口
配置列表显示了 SharePointProject
配置列表显示了 SharePointProject
  1. 单击 Browse 按钮启动 Select Service Implementation 窗口,如图 7 所示。
  2. 输入由 SharePoint 所提供的 Lists Web 服务 的 URL,如有必要,请展开第三层,如图 7 所示。
    注:
    当您首次连接到某个特定的 Web 服务时,会看到提示,要求您输入 SharePoint 特定的用户名和密码。
图 7. Service Implementation 窗口
指定 WDL URL
指定 WDL URL
  1. 单击 OK 返回 Web Service Client 向导。
  2. 单击 Next
  3. 单击 Finish

单击 Finish 之后,请注意,在 SharePointProject 项目的 src 文件夹中已生成了骨架代码,如图 8 所示。

图 8. 生成的骨架代码文件
src 文件夹的内容
src 文件夹的内容
  1. 在本教程中,使用了由 JAX-WS 工具从 Lists Web 服务创建的 ListsSoap.java 接口。

为 SharePoint 编写自定义代码

现在,您已经生成骨架代码,是时候在骨架代码上编写业务逻辑了。实现这一目标的完整代码已打包在本教程的示例中。使用代码中的逻辑,可以从您在“设置”小节中创建的 SharePoint 文档库或图片库中获取内容。在本节中,让我们来看一下相关的代码片段。

通过 SharePoint 服务器进行身份验证

在您能够从一个相关的文档库或图片库中获取内容之前,您需要利用 SharePoint 服务器进行身份验证。这可以通过业务逻辑的代码完成。该代码将利用骨架代码通过 SharePoint 服务器进行连接和身份验证。清单 1 显示了如何利用 SharePoint 服务器进行身份验证。

清单 1. 利用 SharePoint 服务器进行身份验证
     public static ListsSoap authenticateForList(String spUserId, 
                String spPassword, String spWebServiceUrl) {
     ListsSoap listSoapPort = null;
		Map<String,String> authenticationParameters = new  
            HashMap<String,String>();
		authenticationParameters.put(userId, spUserId);
		authenticationParameters.put(password, spPassword);
		authenticationParameters.put(webServiceUrl,spWebServiceUrl);

		if (spUserId != null && spPassword != null && 
                spWebServiceUrl != null) {
	         
        Lists listService = new Lists();
		   listSoapPort = listService.getListsSoap12();
		   
        Map<String,Object> requestContext =  
          ((BindingProvider)listSoapPort).getRequestContext();
		   
        requestContext.put(webserviceUrl, spWebServiceUrl);
		   requestContext.put(webServiceUserName, spUserId);
		   requestContext.put(webServiceUserPassword, spPassword);

		} 
		return listSoapPort;
	}

在该代码清单中,将 SOAP 端口用于 lists 服务,获取了 SharePoint 服务器的上下文,并且将要调用的相应参数传递给上下文,这些参数包括 Web 服务(在本例中为 Lists Web 服务)、SharePoint 站点的用户名和密码等。这样通过 SharePoint 服务器就能够进行身份验证。

注:
正如在第 1 部分的“设置”小节中所述,本教程基于一个假设:在安装了 SharePoint 服务器的 IIS 服务器上,您的身份验证类型被设置为 BASIC。

从文档库或图片库中检索内容

现在,您已通过 SharePoint 服务器进行身份验证,下一步是连接到一个库并从中检索内容。清单 2 显示了如何完成这项工作。在本例中,您将只从文档库中检索内容。可以用类似的方法检索图片库中的内容。

清单 2. 连接到 SharePoint 库并从中检索内容
     GetListItemsResponse.GetListItemsResult resultantList =   
     listSoapPort.getListItems(listToBeRetreived, view, CAMLQuery,   
     fieldsToBeViewed, noOfRows, options, web_id);

在清单 2 的代码中,getListItems 方法查询了 SharePoint 服务器的文档库或图片库。listToBeRetreived 参数指定了您希望从中检索内容的文档或图片库的名称。其他一些参数包括等同于一个 SQL 查询的 CAMLQuery,以及您希望从该库中检索的字段或列。

在您将方法调用的结果存储在 resultantList 变量中之后,就可以使用清单 3 中的代码使一个库实例成为一个对象。然后,您可以使用该对象来检索所需的内容。

清单 3. 使一个 SharePoint 库实例成为一个对象的代码
     Object resultObj = resultantList.getContent().get(0);
   
     if ((resultObj != null) && 
      (resultObj instanceof ElementNSImpl)) 
     {
      ElementNSImpl node = (ElementNSImpl) resultObj;

      NodeList list = node.getElementsByTagName(row);

      MyBean myBean = null;
     
      int i = 0;
      
      while(i < list.getLength()){
   	NamedNodeMap attributes = list.item(i).getAttributes();
	String id = attributes.getNamedItem("ows_ID").getNodeValue();
        String name = attributes.getNamedItem 
                     ("ows_NameOrTitle").getNodeValue();
        myBean = new MyBean();
        myBean.setId(id);
        myBean.setName(name);  
        ...........................................................
        ...........................................................
        ...........................................................

        i++
       }// end of while
     }//end of if

在清单 3 的代码中,resultObj 对象代表 SharePoint 中的文档或图片库的一个行实例。正如在清单 3 中所见,idname 变量包含存在于 SharePoint 库中的某个行的 ID 和标题。

清单 1、2 和 3 的完整代码位于附件示例(参见 下载)中的 SharePointProject 内的 SharePointIntegrationManager 类中。您只需将这些类的内容复制到您自己的自定义类即可。

编写一个实用工具类来获取文档的 URL

您可以使用清单 4 中的代码来获取指向文档库中的某个文档的 URL。

清单 4. 获取指向库中的文档的 URL
public String getUrl(String companyName){
    List<MyBean> myList=null;
	  try {
		  ListsSoap listSoapPort = (ListsSoap)
       SharePointIntegrationManager.authenticateForList 
       (this.userName, this.password, this.spwebServiceUrl);

		  myList = SharePointIntegrationManager.sharePointList
              (listSoapPort, companyName, null, this.rowLimit);

		   } catch (Exception e) {

		     }
     MyBean bean = myList.get(0);
     String docUrl = bean.getFileRef();
     docUrl = docUrl.replace(" ", "%20");

     if(docUrl!=null){
        	return docUrl;
         }
		return null;
	}

注:
getUrl getPicUrl 方法从各自的库中分别获取一个文档和一个图片的 URL。

清单 4 中的完整代码位于示例项目(参阅 下载 小节)中的 SharePointProject 内的 SharePointDataAccess 类中。同样,您只需将该类的内容复制到您自己的自定义类即可。

从 SharePoint 库检索内容

本节将重点放在启用和编写代码上,如上一节所讨论的,这些代码使用 SharePoint 库内容检索代码。您还将修改 portlet JavaServer Page (JSP) 文件,以显示适当的 SharePoint 库内容

使用 SharePoint 库内容检索的业务逻辑

要使用从 SharePoint 库检索内容的 API,第一步是将包含 API 的项目与一个 portlet 项目进行关联。在本例中,关联 SharePointProject 项目与 DealsProject portlet 项目:

  1. 在 Enterprise Explorer 视图中,右键单击 DealsProject,然后在下拉上下文菜单中单击 Properties 选项。
  2. 在 Properties 窗口(图 9)中,选择 Deployment Assembly 选项。
图 9. Web Deployment Assembly 视图
配置依赖项目
配置依赖项目
  1. 单击 Add 按钮,启动 New Assembly Directive 窗口。
  2. 选择 Project 选项,并单击 Next
  3. 选择 SharePointProject,如图 10 所示。并单击 Finish
图 10. 选择部署程序集项目
选择 SharePointProject 作为依赖项目
选择 SharePointProject 作为依赖项目
  1. 在主窗口中单击 OK

现在,您已关联了 SharePointProject 与 portlet 项目,您要编写一些代码来使用 SharePointProject 提供的 API:

  1. 在 DealsProject 中,打开 SDOPropertResolver 类。
  2. 转到 getValue(Object base, Object property) 方法,并将它修改为如清单 5 所示。
清单 5. 方法修改
	public Object getValue(Object base, Object property)
	throws PropertyNotFoundException {
	  try {
	   if (base instanceof DataObject) {
	    if (property != null && !(property.toString().
              equalsIgnoreCase("DOCURL"))) {
		 //First try custom getter...
	       try {
			 return invokeCustomGetter(base, property);
		     } 
              catch (PropertyNotFoundException pne) {
		   //otherwise try the DataObejct getter
		    return (((DataObject) base).get(property.toString
                ()));
		  }
	   }else{
	    String companyDocURL=null;
	    if(property.toString().equalsIgnoreCase("DOCURL")){
	     DataObject account=(DataObject)(((DataObject) base).get  
           ("DEALS_ACCOUNT_DETAILS"));
	     String companyName=account.get("NAME").toString();
	     SharePointDataAccess spDataAccess=
        SharePointDataAccess.getInstance();
	      companyDocURL=spDataAccess.getUrl(companyName);

	     }
	     return companyDocURL;
	    }
	 }
	} catch (NoClassDefFoundError ncdfe) {
			// wdo jars are not available
 }

	if (oldPropResolver != null) {
		return oldPropResolver.getValue(base, property);
	  }
	 throw new PropertyNotFoundException();
	}

在该方法中,每当出现名为 DOCURL 的属性时,就会调用 SharePointAccess 类的 getUrl 方法。这主要是检索托管在 SharePoint 文档中库的文档的 URL。该方法的输入是实际文档库的名称,在本例中为 Liquid Sugar Corp(回忆一下,您在第 1 部分的设置流程中已经创建了一个名为 Liquid Sugar Corp 的文档库)。

显示 SharePoint 内容

现在,您已拥有从 SharePoint 库提取内容的所有代码,您可以将这些内容与之前从 IBM® DB2® 数据库获取的内容一起显示。在 portlet JSP (DealsView.jspNow) 中进行一些修改:

  1. 在 Page Designer 中打开 DealsView.jsp 文件。
  2. 选中您之前在本系列的第 2 部分中所创建的数据表。
  3. 打开 Properties 视图。
  4. 在 Properties 视图中,单击列的 Add 的按钮,如图 11 所示。
图 11. Properties 视图
通过 Properties 视图添加一个列
通过 Properties 视图添加一个列
  1. 输入 Comments 作为列名称,如图 12 所示。
图 12. 在 Properties 视图中添加一个列
在 Properties 视图中指定列名称
在 Properties 视图中指定列名称
  1. Save 文件。
  2. 打开 Palette 视图,展开 Enhanced Faces Component 抽屉。
  3. 从 Enhanced Faces Component 抽屉中选中 Link,如图 13 所示,并将它拖动至 Comments 列上面,以调用 Configure URL 窗口。
图 13. Palette
在 JSP 中插入一个来自 Palette 的 Link
  1. 在 URL 字段中输入以下内容:
    #{vardealsInformationList.DOCURL}
  2. 在 Label 字段中输入以下内容(参见图 14):
    #{vardealsInformationList.DEALS_ACCOUNT_DETAILS.NAME}
图 14. 配置 URL 部分
输入 URL 和标签信息
  1. Save 文件。
  2. 像之前一样,在服务器上运行该 portlet 项目。

您将看到在浏览器中显示的 portlet,如图 14 所示。请注意 Comments 列。它为存储在 SharePoint 文档库中的每个文档都提供了一个 URL。如果您单击 URL,就会打开相应的文档。

图 15. 在 Web 浏览器中显示的 Portlet 以及 SharePoint 数据
在服务器上运行 portlet
在服务器上运行 portlet

这包括 SharePoint 集成说明。您可以通过类似的方法从图片库中提取数据。您也可以为智能手机 JSP 实现 SharePoint 数据用例,就像您在第 1 部分对桌面 portlet JSP 执行的操作一样。

本系列的后续文章

第 4 部分将演示如何创建启用事件的 portlet,从而实现数据共享。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=816951
ArticleTitle=使用 Rational Application Developer 8.0.4 创建多渠道复合 portlet 应用程序,第 3 部分: 在 portlet 中显示来自 Microsoft SharePoint 的数据
publish-date=05212012