将 portlet 连接到 Web 资源
将 portlet 连接到 Web 资源![]() |
![]() |
![]() |
级别: 初级 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 作为客户机-服务器模型中的客户机并重用现有的服务器框架。其中一些技术还能让 portlet 抽取来自于运行在其他应用程序服务器上的 Web 资源的内容。 下面几部分阐述了这些设计范例并提供了 样本 portlet 代码(下载)。读者应该对 portlet API、打包和安装 portlet 以及定制页面有一个基本的了解。最好对 Web 服务和 servlet 也有所了解。
WebSphere Portal 为显示资源(包括 HTML 文件、JSP 以及 servlet)中的数据提供了各种预定义的 Java portlet 类。通用 portlet 方面的示例包括 FileServerPortlet、 JSPPortlet和 ServletInvokerPortlet。用于这些通用 portlet 的 Java 类都从 AbstractPortlet类继承而来。要使用这些 portlet,您不需要编写任何 Java 代码。 要使用这些 portlet,请:
下面几部分描述了如何使用 FileServerPortlet类、 JSPPortlet类和 ServletInvokerPortlet类开发 portlet。 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> 下载并安装所附带的 fileserverportletsample.war文件,然后定制一个页面以拥有 FileServerPortletSampleportlet。图 1 显示了 portlet 窗口中显示的 /html/sample.html的内容。 图 1: FileServerPortletSampleportlet 的输出 ![]() 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> 下载并安装所附带的 jspportletsample.war文件。定制一个页面以拥有 JSPPortletSampleportlet。图 2 显示了 portlet 窗口中 /jsp/sample.jsp的执行结果。 图 2: JSPPortletSampleportlet 的输出 ![]() 为了演示 ServletInvokerPortlet以及使用 ContentAccessService的 portlet(我们将在接下来的两部分中讨论它们),您需要安装所附带的 helloworldservlet.war。本部分一步一步地指导您如何将这个 servlet 安装到 WebSphere Application Server 中。要将这个 WAR 文件安装到其他应用程序服务器中,请参考那些应用程序服务器的相关文档。 提示:您可以用一个现有的 servlet 来测试 ServletInvokerPortlet和 ContentAccessService这两个 portlet,而不是安装 helloworldservlet。因为这些 portlet 中每一个的输出都嵌入在一个表格单元元素( <TD>...</TD>)中, 所以要选择这样一个 servlet:它不会生成不适合于放入表格单元中的 HTML 标记。 要安装 helloworldservlet.war,请:
要访问 HelloWorldServlet,请:
重要的:在本文发表时,需要一个修订包才能运行 ServletInvokerPortlet。要获得用于 ServletInvokerPortlet 类的修订包,请与 IBM 技术支持联系并参考APAR #PQ67305。 FileServerPortlet和 JSPPortlet只能访问本地资源, 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:定义 ServletInvokerPortlet的 url配置参数 <config-param> <param-name>url</param-name> <param-value>http://sukumar2.svo.dfw.ibm.com/myhello/MyHelloWorld</param-value> </config-param> 下载并安装所附带的 servletinvokerportletsample.war文件,然后使用下列步骤修改 urlportlet 配置参数的值。
定制一个页面时向该页面添加一个 ServletInvokerPortletSampleportlet 实例。图 4 显示了 portlet 窗口中 MyHelloWorldservlet 的输出。 图 4: ServletInvokerPortletSample的输出 ![]()
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 样本代码。 您可以在 portlet 中使用 ContentAccessService类的下列方法来访问 Web 资源。
ContentAccessService portlet 服务属性 当对 ContentAccessService初始化后,portlet 服务从位于 WebSphere\PortalServer\app\wps.ear\wps.war\WEB-INF\conf目录下的 PortletServices.properties文件中读取属性。 如果 WebSphere Portal 需要通过代理启动一个 URL 连接,那么就在 PortletServices.properties中设置下列属性。
ContentAccessService可以启动一个到 Web 资源的 SSL 连接。要创建一个 SSL 套接字,您可以在 PortletServices.properties中指定下列属性。
清单 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>"); } } 下载并安装所附带的 contentaccessservicesample.war文件。要修改 url的 portlet 配置参数值,请:
定制一个页面时添加一个 ContentAccessServicePortletSampleportlet 实例。图 5 显示了在 portlet 窗口中显示 MyHelloWorldservlet 的输出。 图 5: ContentAccessServicePortletSample的输出 ![]()
portlet 可以使用 IFRAME标记在它的 portlet 窗口中显示来自外部 Web 资源的内容。 src属性可以指向任何现有的 URL。与所有其他的 portlet 不同,生成 IFRAME标记的 portlet 不直接与 Web 资源通信;相反,浏览器将启动连接。 url中指定的 Web 资源可以发送任何 HTML 标记,包括 BODY、 HTML以及其他标记。 Internet Explorer 版本 5.x 和 Netscape 版本 6.x 都支持 IFRAMEHTML 标记。 清单 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>"); } } 下载并安装所附带的 iframeportletsample.war。定制一个页面时添加一个 IFramePortletSampleportlet 实例。图 6 阐述了 IFramePortletSampleportlet,它抽取来自于外部 Web 站点的内容并在 portlet 窗口中显示输出。 图 6: IFramePortletSampleportlet 的输出 ![]()
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 文件需要提供下列属性的值:
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); } 下载并安装所附带的 webserviceportletsample.war。定制一个页面时向该页面添加一个 WebServicePortletSampleportlet 实例。图 7 显示了 WebServicePortletSampleportlet,这个 portlet 抽取来自于外部 Web 站点的内容并在 portlet 窗口中显示输出。 图 7: WebServicePortletSampleportlet 的输出 ![]()
本文演示了 portlet 可以从各种 Web 资源抽取数据的几种方式。这些技术包括使用预定义的通用 portlet、编写 portlet 代码以访问 Web 服务以及创建一项使用 ContentAccessService 的 portlet技术。本文不涵盖使用 Web 裁剪 portlet 生成 portlet 以连接到现有的 Web 站点,也不涵盖使用凭证保管库连接到需要认证的 Web 站点。 因为 portlet 对于生成某些 HTML 标记(例如 body和 title 标记)有限制,所以如果现有 Web 资源的响应包含这些标记的话,您可能需要修改现有的 Web 资源。由于性能方面的原因,对这些标记进行解析以及从 portlet 中删除它们都是不可取的。
|