将 portlet 连接到 Web 资源

将 portlet 连接到 Web 资源

developerWorks
文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码


级别: 初级

Sukumar Konduru, 顾问软件工程师, IBM 达拉斯,Developer Technical Support Cente

2002 年 12 月 01 日

通过开发可以使用预定义的普通的 portlet 或您自己的代码的 portlet 来了解用于从 Web 资源抽取数据的四项不同的技术。

© Copyright International Business Machines Corporation 2002. All rights reserved.

引言

许多现有的 Web 站点使用各种 Web 资源(例如 servlet、JSP 以及 Web 服务)在浏览器窗口中显示数据。开发者通过使用 WebSphere Portal 4.1 Enable Offering 可以编写 portlet 来访问这些各种各样的 Web 资源并在 portlet 窗口中显示这些资源的数据。

本文描述了下列技术,这些技术可用来开发能访问 Web 资源的 portlet。

  • 利用预定义的 portlet 显示来自于静态 HTML、JSP 以及 servlet 的数据
  • ContentAccessServiceportlet 服务与现有的 Web 站点通信
  • 在 portlet 的流的输出中生成 IFRAME 标记
  • 用 SOAP(简单对象访问协议(Simple Object Access Protocol))API 访问 Web 服务

通过使用这些技术,您可以编写一个 portlet 作为客户机-服务器模型中的客户机并重用现有的服务器框架。其中一些技术还能让 portlet 抽取来自于运行在其他应用程序服务器上的 Web 资源的内容。

下面几部分阐述了这些设计范例并提供了 样本 portlet 代码(下载)。读者应该对 portlet API、打包和安装 portlet 以及定制页面有一个基本的了解。最好对 Web 服务和 servlet 也有所了解。





回页首


利用预定义的 portlet

WebSphere Portal 为显示资源(包括 HTML 文件、JSP 以及 servlet)中的数据提供了各种预定义的 Java portlet 类。通用 portlet 方面的示例包括 FileServerPortletJSPPortletServletInvokerPortlet。用于这些通用 portlet 的 Java 类都从 AbstractPortlet类继承而来。要使用这些 portlet,您不需要编写任何 Java 代码。

要使用这些 portlet,请:

  1. Web.xml中指定 portlet 的类名。
  2. portlet.xml中设置相应的本地或远程资源位置,作为具体的 portlet 配置参数。在大多数情况下,这个参数名为 url。这个参数可以指向一个静态的 HTML、JSP 或其他文件。
  3. WEB-INF\lib目录下创建 dummy.jar,或者在 WEB-INF\classes目录下创建 dummy.class。文件名可以随意且大小可以为零字节。需要将其中一个文件打包到 WAR 文件中才可以成功安装这些 portlet。

下面几部分描述了如何使用 FileServerPortlet类、 JSPPortlet类和 ServletInvokerPortlet类开发 portlet。

使用 FileServerPortlet

FileServerPortlet将一个静态的 HTML 文件作为文件流读取并在 portlet 窗口中显示它的内容。清单 1 显示了如何在 web.xml中定义样本 servlet(即 FileServletPortletSample)。这个 servlet 使用 org.apache.jetspeed.portlets.FileServerPortlet类。清单 2 显示了如何在 portlet.xml文件中定义 url属性。HTML 文件应该和 portlet 代码位于同一个 WAR 文件中。这个 portlet 应用程序的代码在所附带的 fileserverportletsample.war文件中。

清单 1:在 web.xml中定义 FileServerPortletSample的类名

<servlet-name>FileServerPortletSample</servlet-name>
            <servlet-class>org.apache.jetspeed.portlets.FileServerPortlet</servlet-class>
            

清单 2:在 portlet.xml中定义 url

<config-param>
            <param-name>url</param-name>
            <param-value>/html/sample.html</param-value>
            </config-param>

安装样本 portlet 并定制页面

下载并安装所附带的 fileserverportletsample.war文件,然后定制一个页面以拥有 FileServerPortletSampleportlet。图 1 显示了 portlet 窗口中显示的 /html/sample.html的内容。

图 1: FileServerPortletSampleportlet 的输出

FileServerPortletSample portlet 的输出

使用 JSPPortlet

JSPPortletportlet 执行一个 JSP 并在 portlet 窗口中显示输出。这个 portlet 用 PortletContext 来包括 JSP 资源。清单 3 显示了 web.xml文件中对样本 servlet 的定义,这个样本 servlet 使用 JSPPortlet。清单 4 显示了如何在 portlet.xml 文件中定义 url 属性。

清单 3:在 web.xml中定义 JSPPortletSample的类名

<servlet-name>JSPPortletSample</servlet-name>
            <servlet-class>com.ibm.wps.portlets.JSPPortlet </servlet-class>
            

清单 4:在 portlet.xml中定义 url

<config-param>
            <param-name>url</param-name>
            <param-value>/jsp/sample.jsp</param-value>
            </config-param>

安装样本 portlet 并定制页面

下载并安装所附带的 jspportletsample.war文件。定制一个页面以拥有 JSPPortletSampleportlet。图 2 显示了 portlet 窗口中 /jsp/sample.jsp的执行结果。

图 2: JSPPortletSampleportlet 的输出

JSPPortletSample portlet 的输出

安装样本 servlet

为了演示 ServletInvokerPortlet以及使用 ContentAccessService的 portlet(我们将在接下来的两部分中讨论它们),您需要安装所附带的 helloworldservlet.war。本部分一步一步地指导您如何将这个 servlet 安装到 WebSphere Application Server 中。要将这个 WAR 文件安装到其他应用程序服务器中,请参考那些应用程序服务器的相关文档。

提示:您可以用一个现有的 servlet 来测试 ServletInvokerPortletContentAccessService这两个 portlet,而不是安装 helloworldservlet。因为这些 portlet 中每一个的输出都嵌入在一个表格单元元素( <TD>...</TD>)中, 所以要选择这样一个 servlet:它不会生成不适合于放入表格单元中的 HTML 标记。

要安装 helloworldservlet.war,请:

  1. 打开 WebSphere 管理控制台。
  2. 选择 Console -> Wizards -> Install Enterprise Application
  3. 选择 Install stand-alone module(*.war, *.jar)并输入以下值:

    设置
    路径helloworldservlet.war
    应用程序名称MyHelloWorld
    Web 模块的上下文根/myhello


  4. 在接下来的八个窗口中的每个窗口上单击 Next
  5. 在 Selecting Virtual Hosts for Web Modules 窗口上,仍然将虚拟主机设为 default_host,然后单击 Next
  6. 在 Selecting Application Servers 窗口上,单击 Select Server... ,选择 Default Server或任何其他的应用程序服务器,然后单击 Ok。单击 Next
  7. 在 Completing the Application Installation Wizard 窗口上单击 Finish
在显示了消息 Command EnterpriseApp.install completed successfully的对话框上单击 Ok

要访问 HelloWorldServlet,请:

  1. 展开位于 WebSphere Administrative Domain下的 Enterprise Applications。选择 MyHelloWorld,单击右键启动此应用程序。
  2. 选择节点,单击右键,然后单击 Regen WebServer Plugin
  3. 输入下列内容,打开 servlet:
      http://machinename.domain.com/myhello/MyHelloWorld

    HelloWorldServlet 显示的内容如图 3 所示。

    图 3: HelloWorldServlet

    HelloWorldServlet

使用 ServletInvokerPortlet

重要的:在本文发表时,需要一个修订包才能运行 ServletInvokerPortlet。要获得用于 ServletInvokerPortlet 类的修订包,请与 IBM 技术支持联系并参考APAR #PQ67305。

FileServerPortletJSPPortlet只能访问本地资源, ServletInvokerPortlet与它们不同,它可以访问本地或远程 Web 资源并在一个 portlet 中显示这些 Web 资源的内容。

您需要通过更改主机名(将在下一部分对此进行讨论)来修改 url的值。清单 5 阐述了对 portlet 的定义,而清单 6 阐述了对 url属性的定义。

清单 5:定义 ServletInvokerPortletSample

  <servlet-name>ServletInvokerPortletSample</servlet-name>
            <servlet-class>com.ibm.wps.portlets.ServletInvokerPortlet </servlet-class>
            

清单 6:定义 ServletInvokerPortleturl配置参数

<config-param>
            <param-name>url</param-name>
            <param-value>http://sukumar2.svo.dfw.ibm.com/myhello/MyHelloWorld</param-value>
            </config-param>

安装样本 portlet 并定制页面

下载并安装所附带的 servletinvokerportletsample.war文件,然后使用下列步骤修改 urlportlet 配置参数的值。

  1. 选择 Portal Administration区域。
  2. 在 Portlets 页面上单击找到的 Manage Portlets
  3. 选择 ServletInvokerPortletSample concrete
  4. 单击 Modify Parameters
  5. 修改 url的值,将其指向已安装的 servlet。
    例如: http://machinename.domain.com/myhello/MyHelloWorld
  6. 单击 Save

定制一个页面时向该页面添加一个 ServletInvokerPortletSampleportlet 实例。图 4 显示了 portlet 窗口中 MyHelloWorldservlet 的输出。

图 4: ServletInvokerPortletSample的输出

ServletInvokerPortletSample 的输出




回页首


使用 ContentAccessService

WebSphere Portal 提供 ContentAccessServiceportlet 服务,portlet 可以用该服务检索远程和本地 Web 资源的内容。该服务使用 HttpRLConnection类打开了一个到 Web 资源的连接。如果需要从门户到远程 Web 站点的连接,那么显然该服务可以针对 HTTP 协议和 HTTPS 协议使用一台代理服务器。

如果 portlet 需要打开一个 URL 连接,那么使用 ContentAccessService比直接使用 HttpURLConnection 要好。您可以在一台受代理服务器保护的门户服务器上部署一个 portlet,因为 ContentAccessService使用门户配置文件看管 HTTP 代理设置。

ServletInvokerPortlet(我们在前面讨论过)使用 ContentAccessService访问远程 Web 站点。然而,当您从一个 portlet 处以编程方式使用这项服务时,您可以对内容进行操作。例如,您可以将接收到的数据中的相对 URL 更改为绝对 URL。下面几部分描述了 ContentAccessService类方法、描述了您可以设置的服务属性并阐述了 portlet 样本代码。

ContentAccessService 类方法

您可以在 portlet 中使用 ContentAccessService类的下列方法来访问 Web 资源。

  • getInputStream方法连接到 urlString中指定的 Web 资源,并返回 Web 资源的输出作为一个流对象。
    public java.io.InputStream getInputStream(java.lang.String urlString, PortletRequest req, PortletResponse resp)
  • getMarkup方法的作用与 getInputStream类似,但它将从 Web 资源中检索的流存储为一个 String 对象。
    public java.lang.String getMarkup(java.lang.String urlString, PortletRequest req, PortletResponse resp)
  • 如果资源是内部的, include方法就使用一个 RequestDispatcher类型的对象;否则,该方法使用一个 URL 连接访问外部 Web 资源。 include方法将 Web 资源输出直接写到 portlet 的流中。
    public void include(java.lang.String urlString, PortletRequest request, PortletResponse response)

ContentAccessService portlet 服务属性

当对 ContentAccessService初始化后,portlet 服务从位于 WebSphere\PortalServer\app\wps.ear\wps.war\WEB-INF\conf目录下的 PortletServices.properties文件中读取属性。

如果 WebSphere Portal 需要通过代理启动一个 URL 连接,那么就在 PortletServices.properties中设置下列属性。

  • org.apache.jetspeed.portletcontainer.service.ContentAccessServiceImpl.proxy.http.host
  • org.apache.jetspeed.portletcontainer.service.ContentAccessServiceImpl.proxy.http.port
  • org.apache.jetspeed.portletcontainer.service.ContentAccessServiceImpl.proxy.https.host
  • org.apache.jetspeed.portletcontainer.service.ContentAccessServiceImpl.proxy.https.port

ContentAccessService可以启动一个到 Web 资源的 SSL 连接。要创建一个 SSL 套接字,您可以在 PortletServices.properties中指定下列属性。

  • org.apache.jetspeed.portletcontainer.service.ContentAccessServiceImpl.trust.store.url
  • org.apache.jetspeed.portletcontainer.service.ContentAccessServiceImpl.trust.store.pswd
  • org.apache.jetspeed.portletcontainer.service.ContentAccessServiceImpl.key.store.url
  • org.apache.jetspeed.portletcontainer.service.ContentAccessServiceImpl.key.store.pswd

样本 portlet 代码

清单 7 显示了一个使用 ContentAccessServiceportlet 服务的 portlet。这个 portlet 使用 getMarkup方法连接到一个 Web 站点并在 portlet 窗口中显示它的数据。

清单 7:使用 ContentAccessService的 portlet

public class MyContentAccessServicePortlet extends PortletAdapter {
            public void doView( PortletRequest portletRequest, PortletResponse portletResponse)
            throws PortletException, IOException{
            PortletContext context = this.getPortletConfig().getContext();
            PrintWriter pw = portletResponse.getWriter();
            //Reads url as configuration parameter
            String url = portletRequest.getPortletSettings().getAttribute("url");
            // Accesses ContentAccessService
            ContentAccessService service = (ContentAccessService) context.
            getService(ContentAccessService.class);
            //getMarkup opens a URL connection and returns output of the URL as String
            StringservletOutput = service.getMarkup(url,portletRequest,portletResponse);
            pw.println("Servlet says <b>" + servletOutput + "</b>");
            }
            }

安装样本 portlet 并定制页面

下载并安装所附带的 contentaccessservicesample.war文件。要修改 url的 portlet 配置参数值,请:

  1. 选择 Portal Administration区域。
  2. 在 Portlets 页面上单击 Manage Portlets
  3. 选择 ContentAccessServicePortletSample concrete
  4. 单击 Modify Parameters
  5. 修改 url的值,将其指向已安装的 servlet。
    例如: http://machinename.domain.com/myhello/MyHelloWorld
  6. 单击 Save

定制一个页面时添加一个 ContentAccessServicePortletSampleportlet 实例。图 5 显示了在 portlet 窗口中显示 MyHelloWorldservlet 的输出。

图 5: ContentAccessServicePortletSample的输出

ContentAccessServicePortletSample 的输出




回页首


生成 IFRAME 标记

portlet 可以使用 IFRAME标记在它的 portlet 窗口中显示来自外部 Web 资源的内容。 src属性可以指向任何现有的 URL。与所有其他的 portlet 不同,生成 IFRAME标记的 portlet 不直接与 Web 资源通信;相反,浏览器将启动连接。 url中指定的 Web 资源可以发送任何 HTML 标记,包括 BODYHTML以及其他标记。

Internet Explorer 版本 5.x 和 Netscape 版本 6.x 都支持 IFRAMEHTML 标记。

样本 portlet 代码

清单 8 显示了 MyIFramePortlet样本 portlet。这个 portlet 生成一个 IFRAME标记,该标记的 src属性是从 portlet 配置参数中被作为 url读取的。

清单 8:一个生成 IFRAME标记的 portlet

public class MyIFramePortlet extends PortletAdapter {
            public void doView (PortletRequest portletRequest, PortletResponse portletResponse)
            throws PortletException, IOException{
            PrintWriter pw = portletResponse.getWriter();
            //reads url, height, and width,name as concrete portlet configuration parameters
            String url = portletRequest.getPortletSettings().getAttribute("url");
            String height= portletRequest.getPortletSettings().getAttribute("height");
            String width= portletRequest.getPortletSettings().getAttribute("width");
            String name = portletRequest.getPortletSettings().getAttribute("name");
            name= portletResponse.encodeNamespace(name);
            //Generating IFRAME in the output of the portlet.
            //src attribute of IFRAME is pointing toURL.
            pw.println("<IFRAME src=\"" + url + "\" name=\"" + name +"\"  width=\"" +
            width+ "\" height=\""+ height+ "\"  >");
            pw.println("Sorry, your browser doesn't support inline frames.");
            pw.println("</IFRAME>");
            //When portlet is maximized, following javascript makes it 2/3 screen size
            if ( portletRequest.getWindow().getWindowState() == PortletWindow.State.MAXIMIZED )
            pw.write("<script language=\"javascript\">document.all." + name +
            ".height=(screen.availHeight-(screen.availHeight/3));</script>");
            }
            }

安装样本 portlet 并定制页面

下载并安装所附带的 iframeportletsample.war。定制一个页面时添加一个 IFramePortletSampleportlet 实例。图 6 阐述了 IFramePortletSampleportlet,它抽取来自于外部 Web 站点的内容并在 portlet 窗口中显示输出。

图 6: IFramePortletSampleportlet 的输出

IFramePortletSample portlet 的输出




回页首


访问 Web 服务

WebSphere Application Server 4.0 支持 SOAP(简单对象访问协议)实现的 Apache 2.2 版本,该版本基于 SOAP 1.1 规范。这个 SOAP 实现提供客户机 API 以通过 servlet 或 portlet 代码访问 Web 服务。Web 服务是用 WSDL(Web 服务描述语言(Web Service Description Language))描述的。要使用 SOAP 客户机端 API 访问 Web 服务,WSDL 文件需要提供下列属性的值:

  • Web 服务名称,在 SOAP 服务器内是唯一的。这个名称的前缀通常是 urn:
  • 方法名
  • 输出参数和输入参数
  • 托管 Web 服务的服务器的 URL

样本 portlet 代码

WebServicePortletSampleportlet 显示了一个 HTML 表单,该表单让用户输入邮编(Zip code)以获取该区域的天气预报。提交表单之后,门户调用 actionPerfomed方法,如清单 9 所示。该方法连接到天气 Web 服务(由 xmethods.net 托管)并检索要在 portlet 窗口中显示的响应。

actionPerfomed方法创建了一个 Call类型的对象。这个对象用于设置方法名、输入参数以及 Web 服务名。 Call对象使用 invoke方法连接到托管 Web 服务的 SOAP 服务器的 URL 上,然后检索响应。这个响应存储在 PortletRequest对象中。当门户为这个 portlet 调用 doView方法时,它抽取来自于 PortletRequest对象的响应并在 portlet 窗口中显示它。

清单 9:使用 actionPerformed方法访问 Web 服务

public void actionPerformed(ActionEvent event)throws PortletException
            {
            PortletRequest portletRequest = event.getRequest();
            // End point URL for SOAP server read from portlet config parameter
            String endPointURL = portletRequest.getPortletSettings().getAttribute("url");;
            String zipCode = portletRequest.getParameter("zipCode");
            Call call = new Call();//Represents RPC Call
            call.setMethodName("getTemp");
            call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
            call.setTargetObjectURI("urn:xmethods-Temperature");
            Vector params = new Vector();
            /*Parameter represents argument to RPC call. The constructor takes
            name, type, and value of the input argument and encoding style */
            Parameter newParam =
            new Parameter("zipcode", java.lang.String.class, zipCode, Constants.NS_URI_SOAP_ENC);
            params.addElement(newParam);
            call.setParams(params); //setting arguments to RPC Call
            Response webServiceResponse = null;
            try{
            webServiceResponse = call.invoke(new URL(endPointURL), "");
            }catch(SOAPException e){
            ;//pw.println("soap exeception" + e);
            }catch(MalformedURLException e){}
            portletRequest.setAttribute("webServiceResponse",webServiceResponse);
            }

安装样本 portlet 并定制页面

下载并安装所附带的 webserviceportletsample.war。定制一个页面时向该页面添加一个 WebServicePortletSampleportlet 实例。图 7 显示了 WebServicePortletSampleportlet,这个 portlet 抽取来自于外部 Web 站点的内容并在 portlet 窗口中显示输出。

图 7: WebServicePortletSampleportlet 的输出

WebServicePortletSample portlet 的输出




回页首


结束语

本文演示了 portlet 可以从各种 Web 资源抽取数据的几种方式。这些技术包括使用预定义的通用 portlet、编写 portlet 代码以访问 Web 服务以及创建一项使用 ContentAccessService 的 portlet技术。本文不涵盖使用 Web 裁剪 portlet 生成 portlet 以连接到现有的 Web 站点,也不涵盖使用凭证保管库连接到需要认证的 Web 站点。

因为 portlet 对于生成某些 HTML 标记(例如 bodytitle 标记)有限制,所以如果现有 Web 资源的响应包含这些标记的话,您可能需要修改现有的 Web 资源。由于性能方面的原因,对这些标记进行解析以及从 portlet 中删除它们都是不可取的。





回页首


相关信息






回页首


下载

名字大小下载方法
sample_portlet_code.zip37 KBHTTP
关于下载方法的信息


关于作者

 

Sukumar Konduru是 IBM 达拉斯 Developer Technical Support Center 的一名顾问软件工程师。他在 University of Houston 获得计算机科学硕士学位。您可以通过 mailto:konduru@us.ibm.com?cc=与 SukumarKonduru 联系。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值