zoukankan      html  css  js  c++  java
  • 将 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
    8. 在显示了消息 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.zip 37 KB HTTP
    关于下载方法的信息


    关于作者

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


  • 相关阅读:
    Codeforces Round #693 (Div. 3) G. Moving to the Capital (图,dp)
    Educational Codeforces Round 102 (Rated for Div. 2) B. String LCM (构造,思维)
    Hadoop离线计算——环境搭建(一)
    大数据项目开发进度(实时更新)
    【迭代式开发】v1架构设计文档——大数据开发实战项目(三)
    【迭代式开发】V1软件需求规格说明书——大数据开发实战项目(二)
    Flume安装——环境搭建(二)
    【中英双语】Spark官方文档解读(一)——Spark概述
    TortoiseSVN使用教程【多图超详细】——大数据开发实习day1
    【深度学习TPU+Keras+Tensorflow+EfficientNetB7】kaggle竞赛 使用TPU对104种花朵进行分类 第十八次尝试 99.9%准确率
  • 原文地址:https://www.cnblogs.com/kentyshang/p/1214660.html
Copyright © 2011-2022 走看看