在商业活动中,信息决定一切。随着企业门户的出现,获取相关信息已经变得象登录一个网站并使用一个口令那样简单。
企业门户已经不仅仅是自定义的执行仪表板,而成为一种必不可少的背景,所有最终用户(员工、市民和客户等等)可以通过它立即获得所需的信息,而不必安装非凡的软件(除一个标准浏览器外)、使用特定的操作系统和/或设备或者打开多个窗口。
对于位置信息而言同样如此。在先前的一篇文章(“在企业报表中使用位置信息”)中,我指出“位置信息无处不在;可以在各种公司、所有行业,以及几乎世界上每一个机构和部门中找到位置信息。”随着该文章的发表和像 2005 年位置技术与商务智能大会这样场合中对基于位置的智能的推崇,从未如此明显地表明,找出位置数据中的模式(就像它与关系数据共存一样)即使不是必需的,也是越来越重要。现在,治理人员、分析人员和市民都需要了解与位置有关的信息,并且他们希望随时都可以获得这些信息。
现在,我们有能力满足这些需求。随着企业门户逐渐成为所有机构和各行业的标准,找到将不同信息和应用程序集成到所有门户框架中的新方法已经变得非常必要。在某种意义上,门户的确切定义应该是:“一个汇集内容、应用程序和服务的地方”(Laura Ramos,Forrester Research,“门户定义更新:发展成为协作业务平台”,2002 年 12 月 18 日),而不必重新定义或重新开发内容、应用程序和/或服务。
因此,为了能够将内容、应用程序和服务汇集到门户以实现共享,企业门户供给商们已经协助通过了两个以通过 portlet 共享这些内容为中心的新门户标准:用于远程 Portlet 的 OASIS Web 服务 (WSRP) 和 java 规范请求 168 (JSR 168)。因为这些新标准使得将所有信息和应用程序作为 portlet 进行共享变得很轻易,所以将位置加入方程式也就变得轻易了 — 如在商务智能 portlet 的旁边构建位置 portlet(地图)。
在本文中,我将讨论如何使用诸如 WSRP 和 JSR 168 等开放标准来开发那些将位置信息与应用程序(如地理地图)合并在一起的 portlet。本文介绍的所有 portlet 代码都可以注册到支持 portlet 标准 WSRP 和 JSR 168 的任何供给商的门户解决方案中。
定义地图
以下示例使用 Oracle 应用服务器 MapViewer (Oracle MapViewer) 和 Oracle JDeveloper 10g 来定义和开发基于 Web 的动态地图。虽然从理论上讲,使用任何基于 Web 的地图制作技术都可以获得同样的效果,但是使用 Oracle MapViewer 会更简单,这是因为它提供 Java 和 xml API 以及一个 JavaServer Page 标记库,所以任何人(从初学的开发人员到较高级的开发人员)都将发现,将地图集成到现有的和新的开发项目中是何等简单(而且功能相当强大)。有关更多信息(包括下载和安装说明),请参见 http://www.oracle.com/technology/PRodUCts/mapviewer/index.Html。
在我的上一篇文章“在企业报表中使用位置信息”中,我讲述了如何使用地图定义工具和/或 Oracle SQL*Plus 为 Oracle MapViewer 定义地图。出于连贯性和简单性考虑,本文使用同一示例(包括 OE 模式中所的示例数据,这些数据最初是在 Oracle 示例:“进行基于位置的分析”建立起来)。
与其他地图呈现工具一样,Oracle MapViewer 使用样式(颜色、标记、线、面积、文本、符号以及高级样式)和主题(有时称为图层)的概念来创建动态地图。这些属性的定义以及实际地图的定义以 XML 格式和位置信息一起存储在数据库中。
要创建属性和/或地图定义,可以对数据库执行标准 SQL 插入/更新操作,如:
SQL> insert into USER_SDO_STYLES values(
'V.PIECHART1', 'ADVANCED', null,
'<?xml version="1.0" ?>
<AdvancedStyle>
<PieChartStyle pieradius="10">
<PieSlice name="A" color="#ffff00" />
<PieSlice name="B" color="#000000" />
<PieSlice name="H" color="#ff00ff" />
<PieSlice name="I" color="#0000ff" />
<PieSlice name="W" color="#ffffff" />
</PieChartStyle>
</AdvancedStyle>', null, null);
或者可以使用所提供的地图定义工具(见图 1),它可以为您完成大部分工作。
点击查看大图图 1:地图定义工具
Oracle Internet 应用服务器附带的标准 Oracle MapViewer 下载或部署包含一组样式、主题、基本地图和示例代码。对于我们的示例而言,您只需复制一个基本地图、添加两个主题即可。因为您可以使用 SQL 和工具访问数据库中的地图定义,所以复制地图定义的最简单方法就是执行一个 SQL 语句,如下所示。(在执行语句之前,请仔细看看与 Oracle MapViewer 相关的视图 user_sdo_styles、user_sdo_themes 和 user_sdo_maps,以更好地理解它们的工作原理。)
SQL> insert into user_sdo_maps
2 values('WAREHOUSES_AND_CUSTOMERS', 'customers and warehouses',
3 (select definition from user_sdo_maps where name='DENSITY_MAP'));
1 row created.
SQL> commit;
Commit complete.
现在您就有一个名为 WAREHOUSES_AND_CUSTOMERS 的新基本地图了,您将使用地图定义工具向它添加一些主题。首先,切换到包含 mapdef.jar 的目录,执行以下命令连接到存储着我们地图定义的 Oracle 数据库实例:
java -classpath mapdef.jar;d:\oracle\ora92\jdbc\lib\classes12.jar
-Dhost="localhost" -Dsid="orcl" -Dport="1521"
oracle.eLocation.console.GeneralManager
接着,创建两个主题,CUSTOMERS 和 WAREHOUSES(见图 2 和图 3)。
点击查看大图图 2:创建 CUSTOMERS 主题
点击查看大图图 3:创建 WAREHOUSES 主题
在创建 customers 和 warehouses 主题后,将它们添加到我们新的 WAREHOUSES_AND_CUSTOMERS 基本地图中(见图 4)。
点击查看大图图 4:创建 WAREHOUSES_AND_CUSTOMERS 地图定义
请注重 Min Scale 元素和 Max Scale 元素,它们用于定义根据请求的缩放级别在给定地图上显示哪些主题。在更新地图定义(通过单击 Update 按钮)后,您可以开始使用它们来构建基于客户请求的动态地图了。测试我们的地图是否可用的一个简单方法就是把这个新地图定义的名称 WAREHOUSES_AND_CUSTOMERS 插入我们的 Oracle MapViewer 演示应用程序中。为此,切换到我们的 Oracle MapViewer 简单地图客户端(Oracle MapViewer URL 上的 mapclient.jsp),输入必要的值(见图 5)。
点击查看大图图 5:演示地图客户端
请注重,mapclient.jsp 示例应用程序还会显示向 Oracle MapViewer 服务器发出的执行请求 — 这是任何客户端或开发语言都能够发出的 XML 请求。假如所有的定义和连接值都正确,则会根据请求构建一幅地图(或者是一个指向地图图像的 URL)。
构建 Portlet 框架
假如使用恰当的工具,则使用诸如 JSR 168 和 WSRP 等最新标准开发 portlet 就可以相当省事。幸运的是,Oracle Internet 应用服务器门户小组已经为 Oracle JDeveloper 10g 开发了这样的一种工具,即“门户插件”。门户插件是 Oracle JDeveloper 10g 的一个扩展,它实现了使用向导快速轻松地生成 Java (JSR 168) portlet 框架。一旦您使用 JSR 168 规范开发出 portlet,就可以将其部署到任何支持此标准的应用服务器(包括 Oracle Internet 应用服务器)上,并通过 WSRP 调用它们。有关门户插件或 portlet 标准的信息,请参见:http://portalstandards.oracle.com。
为使用 JDeveloper 10g 开发我们的 portlet 框架,首先创建一个名为 WSRPMapPortlet 的新工作区;对于此工作区,使用默认的 Web 应用程序模板(见图 6)。
图 6:创建新的应用程序工作区
在新创建的工作区中单击 ViewController 项目,选择“new”从多个扩展中启动一个扩展。虽然您在“Web Tier”部分中可能没有看到 portlet 向导,但是假如您选择根据“all technologies”而非“project technologies”来进行筛选,则 portlet 向导将会出现。在这里,您选择 Java Portlet 向导,它会指引您完成创建 Java 标准 portlet 的全过程(见图 7)。
点击查看大图图 7:Java portlet 的创建
虽然在 Java Portlet 向导中有很多可定义的选项,但对于本示例您将主要选择默认值(见图 8 到图 11)。有关其他 Java Portlet 向导选项的完整文档,请参见 Oracle Internet 应用服务器门户开发人员指南。
点击查看大图图 8:指定 portlet 类
点击查看大图图 9:指定 portlet 名称
点击查看大图图 10:查看 portlet 模式
点击查看大图图 11:Portlet view.jsp 页面
既然我们的开放 portlet 框架已经完成,那就可以将我们的 Oracle MapViewer 代码添加到其中了。
将 Oracle MapViewer 与开放标准的 Portlet 相集成
为简单起见,您将使用 MapViewer JSP 标记库调用我们的 MapViewer 实例,并将基于 Web 的动态地图返回到我们的 portlet 中,就像先前的 Oracle MapViewer 示例那样。总的来说,使用 MapViewer JSP 标记库不仅简单,而且文档翔实,堪称一个灵活的解决方案。有关方法文档,请参见 http://www.oracle.com/technology/products/jdev/howtos/10g/map/mv_jdev_howto.htm。
现在,为将代码添加到我们新近创建的 portlet 框架中,在 JDeveloper 中双击 view.jsp 文件将其打开。在 JDeveloper 设计模式中,您现在可以随意添加任何格式或内容,而无需钻研复杂的 HTML — 对于此项目,使用居中图标将内容居中。当您处于设计视图中时,您还可以拖曳、删除和定义我们的标记。要使用 Oracle MapViewer 标记,从 Component Palette(通常在 JDeveloper 10g 的右上角)中选择 MapViewer 标记库。从 MapViewer 标记库中,将 init 标记拖到页面中,紧挨着 Portlet 向导添加的 defineObjects 标记下方放下。可以看到,init 标记有三个字段,其中两个必须填写 — 用以下信息填写所有三个字段:URL (http://www.yourserver.com/mapviewer/omserver)、datasource (mvdemo) 和 用户定义的 ID (mvHandle) — 见图 12。
点击查看大图图 12:添加 init 标记和适当的说明
下一步是将 setParam 标记添加到页面中。请注重,虽然 setParam 标记不弹出信息窗口,但假如您在页面中选中该标记,则可以在 Property Inspector(通常在 JDeveloper 10g 的右下角)中设置 Oracle MapViewer 参数。在选中 setParam 标记时,填写以下参数:antialiasing (true)、basemap (WAREHOUSES_AND_CUSTOMERS)、centerX (-122.4)、centerY (37.8)、height (450)、size (10)、title (My Map Portlet) 和 width (600) — 见图 13。
点击查看大图
图 13:添加 setParam 标记和适当的说明
在填写完 setParam 标记的参数之后,将 run 标记(它不需要任何参数)拖到页面中(见图 14)。
点击查看大图图 14:添加 run 标记
最后,您已经能够在 portlet 的上下文环境中呈现我们的地图了。在先前用标记库对我们的 Oracle MapViewer 实例的调用中,您基本上建立了整个地图环境,Oracle MapViewer 实例随后根据接收的 Run 命令已经构建了地图图像。现在您要做的就是将该图像放在页面上。为此,您必须首先将一个标准 HTML 图像标记拖到页面上(假如图像是 SVG,则拖到一个对象标记上)。从 Component Palette 中选择 HTML,将图像标记拖到页面上,单击 source 选项卡,查看我们页面的 JSP/HTML 源代码。再次在 Component Palette 中选择 MapViewer 标记库,这次将 getMapURL 标记拖到图像标记的空引号之间(现在图像标记看上去应该如同这样:<img src="<mapviewer:getMapURL />"/>)。一旦页面运行并且 Oracle MapViewer 创建该图像,则 getMapURL 标记将会把一个实际的图像 URL 返回给 HTML 图像标记(图 15)。
点击查看大图图 15:添加 HTML 图像标记和 Oracle MapViewer getMapURL 标记
这时,您已拥有足够的代码来部署我们的 portlet,使之可在任何门户上使用来查看我们的地图。这还为您添加更多逻辑提供了一个好的起点,从而能够为不同的请求添加不同版本的地图。但是,就本示例而言也就这些了。
部署和注册支持位置的 Portlet
您现在可以将我们的 portlet 部署到符合 WSRP/JSR 168 标准的 portlet 容器中,如 Oracle Container for J2EE (OC4J)。为此,在 Web Content>WEB-INF 文件夹的 ViewController 项目中右键单击 web.xml 文件,并选择“Create WAR deployment profile”。选择 WSRPMapPortlet 作为部署配置文件的名称,还要用同一名称 (WSRPMapPortlet) 指定我们的 J2EE Web 上下文根目录 — 见图 16。
点击查看大图图 16:创建部署配置文件
一旦您构建了部署配置文件,就可以右键单击它,选择将项目部署为 WAR 或 EAR 文件,或者部署到您选择的应用服务器上。在我们这种情况下,选择将项目直接部署到我们的 portlet_container 所在的 OC4J 实例中(图 17)。
点击查看大图图 17:将 portlet 部署到 portlet 容器
在成功部署之后,您可以通过导航到 http://www.yourserver.com/WSRPMapPortlet/portlets?WSDL 查看 WSRP-WSDL 页面。这一地址就是您用来将我们新的 portlet 注册到门户的地址(图 18)。
点击查看大图图 18:Portlet WSRP 规范
测试新创建的 WSRPMapPortlet 的最简单方法是使用 Oracle Portal/WSRP 验证服务器,它是 Oracle 应用服务器门户的一个托管预发行版本,能够与 WSRP 生成器/portlet 进行通信。只要能够从我们公司的防火墙之外调用我们的 portlet,通过此服务来验证其生成您刚刚创建的内容的能力就相当简单(图 19)。
点击查看大图图 19:测试 WSRP 地图 portlet
有关验证过程的信息,请参见此文档。
结论
由于诸如门户和智能数据等集成技术成为业务基础架构的要害部分,因此共享我们所使用的信息和我们所构建的应用程序 (portlet) 的能力就变得非常必要(假如不是法定要求的话)。如今,我们不仅拥有创建符合开放标准的新应用程序所需的所有要素,而且我们拥有框架标准,如 JSR 168 和 WSRP,它们能够将现有的技术和数据集成到新的应用程序中。这些新技术与现有技术(如 GIS 和门户)的交汇点是我们最终能够从所有数据中获得实际智能并能避免复杂难关的突破口。