如何运行 Portal Scripting Interface
Portal Scripting Interface 是 WebSphere Portal Server 提供的基于 JACL 的管理程序。在 WPS_HOME/bin 下有一个脚本程序 wpscript.bat(非 windows 平台对应于 wpscript.sh),它就是 WebSphere Portal 的脚本管理接口。wpscript.bat 需要在命令行下运行,有两种方式使用 Portal Scripting Interface:
- 交互方式:在命令行下一边输入 JACL 脚本一边解释运行,比较适用于一些简单的和一次性的操作;
- 提交脚本方式:事先编写好 JACL 脚本,然后将 JACL 脚本文件名作为命令行的参数传入执行,适用于复杂操作和需要重复执行的操作。
wpscript.bat 调用方式如下所示:
清单 1 运行Portal Scripting Interface
wpscript.bat –conntype |
下面我们对以上命令中所使用的参数做出说明:
- -conntype:连接方式,可选参数,默认为 SOAP;
- -port: 连接端口,对应于 wpconfig.properties 中的 WpsSoapPort 属性值;
- -user 和 -password:用于创建连接的用户名和密码;
- -f:JACL 文件的路径名,如果通过交互方式,省略这个参数。
打开 wpscript.bat,可以看到它的内容很简单,传入一些参数调用 wsadmin。wsadmin 是 WebSphere Application Server 的脚本管理接口,支持 JACL 和 Perl 脚本。wpscript.bat 是对 wsadmin 的扩展,传入 Portal 管理对象,在 JACL 脚本里通过对 Portal 管理对象的方法调用实现对 WebSphere Portal Server 的管理。
PSI 为用户提供了如下几个 Portal 管理对象:
- Portal:Portal 登录接口
- Content:内容组织管理接口
- Layout:页面布局接口
- Portlet:Portlet 管理接口
- Look:Portal 外观主题管理接口
- Access 和 PacList:这两个对象一起实现对 Portal 的 ACL 控制
本文不是 Portal Scripting Interface 的参考手册,因此只对示例中用到的对象和方法进行介绍。其他对象和方法可参考WebSphere Portal 信息中心,或者在 wpscript.bat 中使用 help 方法。
Portal 对象提供了 Portal 登录认证的接口。登录 WebSphere Portal 需要提供用户名和密码,通过 JACL 脚本访问 Portal 也同样需要提供登录认证信息,只有先登录成功之后才能对 Portal 中的各种对象进行操作,这是每个实现 Portal 管理的 JACL 脚本首先必须要做的事情。
用文本编辑工具新建一个文件 stock.jacl 并输入如下内容:
清单 2 实现登录和退出 Portal
$Portal login |
这已经是一个可以被 wpscript.sh 调用的 JACL 脚本了,只是简单的登录 Portal 然后再退出。JACL 支持命令行参数,我们可以把 Portal 登录信息通过命令行传入,这样 Portal 的用户名或密码变化后不用修改 JACL 脚本。修改后的脚本如下所示:
清单 3 从命令行接收登录 Portal 的用户名和密码
if { $argc != 2 } {
puts "Syntax: wpscript. sample.jacl |
在后面的介绍中,将逐步扩充这个脚本,使它完成管理功能。
除了登录验证的接口外,Portal 对象还提供了 Virtual Portal 选择的接口,如下所示:
$Portal setvp
通过这个方法用户可以指定要登录哪个 Virtual Portal。
Content Bean-管理 Portal 内容(页面,标签和 URL)
Content 对象负责 Portal 内容的管理,这里的内容指页面、标签和 URL。通过 Content 对象我们可以遍历 Portal 中的所有页面、标签和URL。定位到操作的页面后,还可以通过Content对象对页面进行创建、删除和修改等操作。比如,要在实现在某个页面上部署一个 Portlet,就必须先通过这个接口定位要部署 Portlet 的页面。
在使用这个对象前,我们必须先弄清楚 Portal 中的内容是如何的管理的。在 WebSphere Portal 中,内容被组织成树状结构,并以一个不存在的虚节点 root 为根。每一个页面、标签和 URL 都是树中的一个节点。每个节点都有一个全局唯一的标志,通过遍历和查找,可以访问内容树中的每一个节点。Portal 的内容组织可以通过 Web 方式进行浏览,如下图所示:
Content 对象提供的方法可分为以下几类:
- 遍历和搜索:快速准确的定位到要指定的节点;
- 属性:获取和设置节点的属性,如uniquename,commonname,language等;
- 生命周期:节点的创建,删除等;
- 组织结构:节点在整个组织树中的位置变更。
本文将结合例子只讲述搜索和生命周期管理的方法,其他可参考WebSphere Portal 信息中心。
在脚本中通常要对某些指定的节点进行操作,之前必须找到并选定这个节点。每个节点都由全局唯一的 uniquename 标志的。脚本接口提供了如下两类查询方式:
$Content search
search方法是返回所有符合条件的节点列表。
$Content find
find 是返回唯一一个符合条件的节点,如果符合条件的节点多于一个或者不存在,find 调用将失败。
type 是查询类型,可以是 page,label,url 等,或者不带 type 参数,返回符合条件的任意类型的节点。
By 是查询标准,下面是一些常用的查询标准。
- id:全局唯一标志;
- uniquename:全局唯一名称;
- commonnameis: 节点的通用名称;
- commonnamehas: 节点通用名称中含有特定字符串。
通过调用 $Content help search-types 可以获取查询标准列表。
此示例中我们要在 My Work 目录下创建页面,因此必须先找到 My Work 节点,如下所示:
$Content find label uniquenane "wps.My Portal.My Work" select
在最后加上 select 方法表示查找到这个节点后并选中这个节点,以后所有的操作都是针对这个节点。
Content 提供的搜索是针对事先指定的节点以及它的子节点树的,如果事先没有选中哪个节点,将从虚节点 root 开始搜索。
Content 提供了创建和删除节点的方法。
创建节点:
$Content create
type 可以是 page,label,externalurl,分别表示创建页面、标签和 url。在 create 调用中还可以加上 public,private 等标志,表示创建的页面是公共的还是私有等。
以父节点页面为模板创建新页面:
$Content derive
name 是新页面的名称,id 是父节点的 ID 值,只有父节点是共享的页面时才可以调用。
删除节点:
$Content delect
继续扩充 stock.jacl,在 Home 下创建一个标题为 Stock 的新页面。
清单 4 在 Home 下创建名为 Stock 的新页面并选定
# 找到并选中Home,新页面的父节点将是Home。 $Content find label uniquename " ibm.portal.Home " select # 创建标题为Stock的页面并选中 set thePage [$Content create page "Stock" html public] $Content select $thePage |
Portlet 对象提供了对 WebSphere Portal 中部署的 Portlet 的控制,它提供了对 Portlet 部署的层次结构的访问。通过 JACL 脚本访问某个 Portlet,必须先通过 Portlet 对象进行定位,然后才能进行相应的操作。
在 Portal Scripting Interface 中所有的 Portlet 也是以树状结构组织的,但与 Content 不同,Portlet 组织树有特定的结构。
- Portlet 组织树也以一个不存在的 root 节点为根;
- 它的所有子节点是 web module,对应于 Portlet 所在的 war 包;
- 第二层是 application,对应于 war 中所包含的 portlet application;
- 第三层是 portlet,对应于 application中所包含的所有 portlet。
- 每个 web module 节点的结构同 portlet.xml 中的组织结构一致。
对于 Portlet 组织树结构,是在 Portlet 打包时决定的,不能通过 Portlet 对象进行修改。
Portlet 对象提供了两类方法,搜索遍历和属性操作,具体的方法调用同 content 对象类似。Portlet 查询支持这些类型:webmodule,application,portlet,concrete(portlet或application),abstract,all 或 any。具体的查询标准可以参考 $Portlet help search-criteria 的输出。
继续扩充我们的例子,我们要通过 Portlet 对象搜索到 My Stock Portlet。
# 找到 My Stock Portlet set pid [$Portlet find portlet cn "My_Stock"] |
Layout 对象提供了页面布局管理的接口。我们知道 Portal 里的页面是用来放置 Portlet 的,页面可以划分成多个区域,每个区域上放置一个 Portlet,Layout 对象正是提供了对应的管理接口,允许用户控制页面的区域划分和每个区域中部署的 Portlet。
要使用 Layout 对象,必须先通过 Content 对象选中某个页面,然后Layout对象才能生效并指向该页面,当 dselect 该节点后 Layout 对象就不可用了。
我们先来看看 portal 中对页面布局的管理,页面的布局中只允许两种类型的组件存在,container 和 control。
- Container 里可以包含 container 和 control,与 html 中的 table 概念类似,相当于行和列,在 $Layout 中可以创建水平或垂直 container。
- Control 是叶子节点,对应于 portlet。
下面是一个含有两个 portlet 的页面的布局结构。
图 2. 页面布局结构
Layout 对象提供了三类方法调用,
- 搜索和遍历,同 Content 类似,支持 container,control 和 all or any 查询标准;
- 属性操作,具体参考 Info Center;
- 生命周期管理,container 或 control 的创建和删除。
创建一个container:
$Layout create container
创建一个control:
$Layout create control
回到本文的例子,我们在页面上部署一个 Portlet。参照上面的例子,只需要在页面中创建一个 container,并在该 container 中创建一个 control,结构如下图所示:
图 3. 页面 Stock 布局结构
清单 6 在页面 Stock 上部署 My Stock Portlet
$Layout create container horizontal select $Layout create control $pid |
其中,$pid 是 My Stock Portlet 的 id。
Access Bean 和 PacList Bean-控制 Portal 对象 ACL
WebSphere Portal 提供了完备的权限管理,其中的每个对象(页面、Portlet 等)都有自己的访问控制列表,可以对每个对象单独设置哪些用户进行访问。Access 和 PacList 这两个对象提供了对 Portal 中这套完备的权限管理体系的访问接口。通过这两个对象提供的接口,用户在 JACL 脚本中,可以对任何一个可以被访问到的 Portal 对象(页面、Portlet 等)进行访问控制列表的设置。
访问权限控制对 Content 和 Portlet 有效,在做相应操作前必须先选中 Content 节点或者 Portlet。
Access 对象用于读写控制对象,在读出控制对象后由 PacList 对象进行操作,最后再由 Access 对象写入。基本步骤如下所示:
1. 通过 Access 对象获取指定对象的访问权限对象并载入 PacList 对象。
set acl [$Access getacl Content [$Content current]]
$PacList view acl 或 $PacList edit acl
2. 通过 PacList 提供的方法对访问权限对象进行操作,如 grant,block,unblock 等。
3. 通过 Access 对象将访问权限对象写回。
$Access setacl $acl
在本文的例子,普通用户不能访问页面 Stock,如下所示:
清单 7 设置页面 Stock 的访问控制
set acl [$Access getacl Content [$Content current]] $PacList block User propagation $PacList block User inheritance $PacList block PrivilegedUser propagation $PacList block PrivilegedUser inheritance $Access setacl $acl |
至此对 Portal Scripting Interface 提供的管理对象介绍完毕,下面是本文例子的完整脚本,在 WebSphere Portal Server V6.0 中调试通过。
清单 8 完整的stock.jacl
# stock.jacl
if { $argc != 2 } {
puts "Syntax: wpscript. stock.jacl |
在命令行下运行 wpscript.sh,如下图所示:
图 4. 脚本运行结果
成功运行后,用管理员登录,结果如下所示:
图 5. 管理员登录后的Portal页面
用普通用户登录访问,在 Home 下看不到 Stock 页面,如下所示:
图 6. 普通用户登录后的Portal页面
本文对 Portal Scripting Interface 进行了简要的介绍,WebSphere Portal Server 通过这些对象提供了强大的管理接口,用户可以通过这些接口编写出功能强大的管理脚本。