Portal Server 2.1 的动态主题定制

介绍

这是介绍使用 IBM WebSphere® Portal Server 进行开发的系列文章的第一篇。首先,该系列将展示 WebSphere Portal Server 2.1 能够如何扩展以提供动态主题选择。然后,该系列将展示如何使用 IBM WebSphere Studio Application Developer 来快速开始所有 WebSphere Portal Server 开发活动。

该系列的第 1 部分将介绍如何实现 Portal Server 的动态主题定制。第 2 部分将更详细地探讨使用 Application Developer 的 Portal Server 项目开发。我们将一步一步地指导您在 Application Developer 中创建 Portal Server 项目。第 3 部分将探讨如何设置 Application Developer 从而调试 Portal Server 应用程序和查找它们的故障。

本文假定您已经安装了 WebSphere Portal Server 2.1 和 WebSphere Application Server 3.5.4。您还应该熟悉 Portal Server 和 Application Server 管理。要查看本文提供的项目源代码,您必须安装 WebSphere Studio Application Developer 4.0。

WebSphere Portal Server

WebSphere Portal Server 2.1 是一种能够在 IBM WebSphere Application Server 3.5.4 上托管聚集信息和协作应用程序的产品。Portal Server 通过 portlet 这种概念为站点用户提供了对多种信息和应用程序的单点访问。portlet 是可视的窗口,它将不同来源的内容组织到单独的界面供个人或群组访问。Portal Server 所使用的大部分底层技术都是基于 J2EE 规范的标准。Portlet 为向用户传送信息同时提供了可视的和编程的方法。因此,我们可以通过集成若干 portlet 从而快速构建企业门户网站,而这些 portlet 集成了 Portal Server 框架所提供的基础结构服务。所提供的大部分服务都可以通过一定的编程进一步定制。随着 WebSphere Portal Server 的普及,开发社区中越来越多的人开始有兴趣了解可用来加速开发过程的工具,并深入了解如何执行定制。

图 1. 没有用户登录的 WebSphere Portal Server 缺省主页
没有用户登录的 WebSphere Portal Server 缺省主页抓屏

图 2. 用户 wpsadmin 登录之后的 WebSphere Portal Server
用户 wpsadmin 登录之后的 WebSphere Portal Server 抓屏

WebSphere Studio Application Developer

WebSphere Studio Application Developer 为基于 Java™ 的软件开发提供了一种可扩展的集成开发环境。Application Developer 带有众多的插件,这些插件能缩短非常复杂的项目的开发周期。Application Developer 内建的功能和函数使其最适合开发 WebSphere Portal Server 项目。

如果开发者选择了 VisualAge® for Java 作为开发平台,那么支持 WebSphere Portal Server 的开发和调试环境就是 WebSphere Portal Server Testing Environment。在撰写本文的时侯,Application Developer 带有内建的对 WebSphere Application Server 4.0 和 Tomcat 的开发支持。因为 Portal Server 建立在 WebSphere Application Server 3.5 之上,所以它没有对如何使用 Application Developer 进行 Portal Server 开发的直接参考。因此,“如何”使用 Application Developer 创建和管理 Portal Server 项目就变成了 Portal Server 开发者中的一个常见问题。要了解关于 WebSphere Portal Server Testing Environment 的更多信息,请访问 WebSphere Portal Server Support 页

主题(Theme)和皮肤(Skin)

WebSphere Portal Server 提供了一种易于定制门户网站的外观和感觉的方法。定制功能是通过主题(Theme)皮肤(Skin)的概念实现的。门户网站管理员或开发者可以通过为主题和皮肤创建所需的位图和 JSP™ 文件来决定站点的外观和感觉。WebSphere Portal Server 内含五种不同的主题和四种皮肤。可以使用的主题有:

  • DefaultTheme
  • GreyTheme
  • KhakiTheme
  • LilacTheme
  • TealTheme

可以使用的皮肤有:

  • Album
  • Hint
  • Outline
  • Shadow

主题决定横幅图像、选项卡图像、图标和门户网站的颜色方案(使用级联样式表实现),而皮肤则指定每个页面上每个 portlet 的外观和感觉。WebSphere PortalServer InfoCenter 的 Portal Modification 部分提供了关于主题和皮肤的文件位置的详细描述。InfoCenter 还提供了对如何应用不同位图方案的很好的描述,还有这些位图所需的大小和尺寸。为了说明起见,我们参考 InfoCenter,改编出下面的表 1。

表 1. 关于 Default Theme 概要文件的位图

资源类型图像样本注释
横幅banner.jpg出现在横幅左上方的背景中
导航图标nav_customize.gif
nav_customize.gif
链接到定制门户网站的页面
导航图标nav_create_account.gif
create_account.gif
链接到自注册的页面
导航图标nav_forgot_password.gif
nav_forgot_password.gif
链接到帮助用户从站点管理员请求凭证的页面
导航图标nav_help.gif
nav_help.gif
链接到门户网站帮助页面
导航图标nav_login.gif
nav_login.gif
链接到登录页面
导航图标nav_logoff.gif
nav_logoff.gif
链接到注销页面
导航图标nav_profile.gif
nav_profile.gif
链接到更新帐户信息的页面
选项卡一角tab_left.gif
tab_left.gif
出现在选项卡左侧
选项卡一角tab_right.gif
tab_right.gif
出现在选项卡右侧
Portlet 标题栏title_back.gif
title_back.gif
将 portlet 从帮助模式返回到视图模式
Portlet 标题栏title_help.gif
title_help.gif
打开 portlet 帮助模式
Portlet 标题栏title_edit.gif
title_edit.gif
打开 portlet 编辑模式
Portlet 标题栏title_maximize.gif
title_maximize.gif
将 portlet 打开为最大化视图
Portlet 标题栏title_minimize.gif
title_minimize.gif
将 portlet 缩小为标题栏
Portlet 标题栏title_restore.gif
title_restore.gif
从最大化或最小化状态恢复 portlet

对不同主题的选择可以通过修改 TurbineResources.Properties 文件的 theme.default 字段来激活。您可以在 <WPS_Install_Root>/app/web/WEB-INF/conf 文件夹中找到该属性文件的位置。

图 3. TurbineResources.Properties 文件的目录位置
展示 TurbineResources.Properties 文件的目录位置的抓屏

当 WebSphere Portal Server 启动时,此文件被读取并解析,只要门户网站会话可用,theme.default 字段被指定的值就保持有效。

另外,theme.default 字段不允许任何形式的键-值映射,这会导致单个主题被所有 Portal Server 用户会话使用。

清单 1. TurbineResources.Properties 的片段

# ...Some code truncated above... 
#
# This is the default theme to apply to the L&F
#
# Default: DefaultTheme

theme.default=DefaultTheme

# ...Some code truncated below... 

这种缺省行为(即单个主题被所有 Portal Server 用户会话使用)在需要提供更好的粒度以定制 Portal Server 的用户界面时,将变成一种限制。通常,所需的粒度是下面环境参数的因素。

  • 用户会话(例如,登录用户标识)
  • 位置(例如,用户从哪里浏览,或用户的 IP 地址)
  • 时间(例如,是否为学校假期时间)

动态主题选择

当 WebSphere Portal Server 站点需要根据某个环境参数改变外观和感觉时,这个参数必须在运行时(可能是在作出对 Portal Server 的用户请求时)能够检索。举例来说,这种情况可能是,不同用户或不同用户组需要使用不同的颜色和位图的集合。对门户网站来说,根据用户喜好提供 UI 个性化是很常见的。有时候,选择逻辑的编程建立在公司策略之上,但更常见的是用户指定其喜好。根据主题选择的操作需求,实现动态主题选择所需的逻辑可能稍微有所不同。

目前,WebSphere Portal Server 并不支持动态主题选择,因为在 TurbineResources.Properties 文件中,对于所有用户只有一个单独的 theme.default 字段被定义。幸运的是,只要作一些简单的编程,WebSphere Portal Server 就可以被扩展为处理动态主题选择。实现这些改变所需的步骤如下所示:

  1. 决定环境参数如何以及何时可以被检索。请参阅下载文件的 MyThemeTag.javagetEnvironParam() 的实现(下面提供了更多细节)。
  2. 使用环境参数作为到一个散列的键,从而派生出 Theme 值。请参阅下载文件的 MyThemeTag.javagetTheme() 的实现(下面提供了更多细节)。
  3. 分发 Theme 值。请参阅下载文件的 MyThemeTag.javadoStartTag() 的实现(下面提供了更多细节)。

我将提供功能性框架代码来说明这些概念,从而详细描述上面的步骤 1 和步骤 3。至于步骤 2,从环境参数派生 Theme 值通常是特定于个别门户网站的。通常,这可以通过使用简单的查找表或从数据库表读取值来实现。现在,我们将通过使用一个每当 WebSphere Portal Server 启动时被初始化到内存中的散列表来展示。

下一部分将描述如何扩展 Portal Server 以提供 UI 定制,这种定制允许使用扩展环境参数来影响主题选择。

<wps:theme> 揭开秘密

正如在前面部分提到过的,WebSphere Portal Server 中定义的每个主题都由一组用户界面实体或资源组成。Portal Server 开发者可以灵活地定制如图像、横幅和各种样式表(.css 文件)这些资源。这些样式表包含主题的颜色和字体类型方案。当 Portal Server 内核从 JSP 文件生成 HTML 代码时,对这些 .css 文件的引用就被插入,这样用户的浏览器就会从浏览器端查找这些样式表来定制页面。

Portal Server 使用了 JSP 标记的概念来执行动态字段替换的任务。JSP 标记本质上有两个组件:一个使用 Java 代码实现的标记处理程序和一个 XML 标记元素。每当 JSP 文件中出现标记元素时,相关的标记处理程序 Java 代码就会被执行。Java 执行代码也会影响实际生成标记时标签的处理方式。

WebSphere Portal Server 允许开发者实现和提供用户定义的定制标记库。这些用户定义的标记可以用于进一步加强 portlet 页面处理过程。除了开发者的定制标记库之外,Portal Server 还实现 Portal Server 引擎所使用的一套标记库函数。这被称为引擎标记库(Engine Tag Library)或 Engine.tld。您可以在 <WPS_Install_Root>/app/web/WEB-INF/tld 文件夹中找到该文件的位置。您可以在 WebSphere PortalServer InfoCenter 的 Changing the Portal layout 部分找到对每个引擎标记的功能的详细描述。

图 4. Engine.tld 文件的目录位置
展示 Engine.tld 文件的目录位置的抓屏

如果您更仔细的研究 Engine.tld 文件,就会发现标记库的标记命令是如何被注册和声明的。

清单 2. Engine.tld 的片段

...Some code truncated above...

<tag>
   <name>url</name>
   <tagclass>com.ibm.wps.engine.tags.UrlTag</tagclass>
   <bodycontent>empty</bodycontent>
   <attribute>
      <name>type</name>
      <required>true</required>
   </attribute>
</tag>

...Some code truncated below...

请在引擎标记两端加入 <tag> 元素来声明它。<name> 元素将定义 JSP 文件中使用的标记元素名。<tagclass>元素标识 tag 元素的实现部分。<attribute> 标记中可以包括 JSP 标记的实现类所需的更多参数。

清单 3. Engine.tld 中的主题标记注册

...Some code truncated above...

<tag>
   <name>theme</name>
   <tagclass>com.ibm.wps.engine.tags.ThemeTag</tagclass>
   <bodycontent>empty</bodycontent>
</tag>

...Some code truncated below... 

由 WebSphere Portal Server 定义的主题标记不接受任何参数,主题标记处理程序的实现将返回主题的名称。返回的值将成为实际的文件,这个文件由 Portal Server 导出到它的 Web 文件夹中。举例来说,在 Banner.jsp 中使用 <wps:theme> 是这样的:

清单 4. Banner.jsp 的片段

// ...Some code truncated above...

<TD class="wpsPortalBanner" valign="middle" align=left width="499" height=43
   background='<wps:url type="base"/>images/themes/<wps:theme/>/banner.jpg'>

// ...Some code truncated below... 

Banner.jsp 被编译并返回到用户的浏览器,就会生成下面的 HTML 代码:

清单 5. 从 Banner.jsp 生成的 HTML 文件片段

// ...Some code truncated above...

<TD class="wpsPortalBanner" valign="middle" align=left width="499" height=43
   background='http://babylon5.sg.ibm.com/wps/
   portal/images/themes/TealTheme/banner.jpg'>

// ...Some code truncated below... 

根据 WebSphere Portal Server 服务器安装的位置和方式,JSP 标记引擎将用相关 URL 路径替换 <wps:url> 标记命令。<wps:theme> 标记被替换为 TurbineResources.Properties 文件的 theme.default 字段指定的 TealTheme 值。

作出改变

要实现动态主题选择,需要对 Portal Server 系统作出两处改动:

  • 修改 Engine.tld 来反映新的处理主题选择的 Java 代码。
  • 实现一个新的执行动态主题选择的 ThemeTag 类,并将其装入 Portal Server 实例。

其实我们可以实现一个新的标记(例如 <mywps:dyna_theme>)并避免修改 Engine.tld 文件。这种方法的不好之处在于,您将必须在所有涉及到 Portal Server 使用的主题处理的 JSP 文件中添加这个新引入的标记。

让我们使用更常用的方法 — 覆盖 Portal Server 提供的 ThemeTag 的原始行为。

Engine.tld

您需要对 Engine.tld 文件作出下面的改变。

清单 6. Engine.tld 中要作出的改变

<tag>
   <name>theme</name>
   <tagclass>com.ibm.etc.wps.tags.MyThemeTag</tagclass>
   <bodycontent>empty</bodycontent>
</tag>

请注意,我们使用自己的 com.ibm.etc.wps.tags.MyThemeTag 来替换 <tagclass> 中的 Java 类。这样做的效果是请求 Portal Server 的 JSP 处理器执行我们自己的主题标记处理程序。

MyThemeTag.java

MyThemeTag.java 类实现动态选择逻辑,它继承了 com.ibm.wps.engine.tags 包中原来的 ThemeTag 类。当标记处理程序代码被 JSP 处理器调用时,doStartTag() 方法将首先被调用。结果,环境参数通过 getEnvironParam() 方法获得。如果您要检索一个不同的环境参数,那么这就是您应该插入改变之处的地方。否则,代码会保持不变,并获取从 RunData 对象派生的用户登录标识。使用环境参数作为键,getTheme() 方法被调用以获取想要的主题值。我们的实现是要将用户标识的散列表与主题值匹配。在您的具体实现中,该字段可以被存储为 Portal Server 按用户喜好使用的关系数据库表的一部分,也可以从某种逻辑派生出来。更精巧的实现可能是从接受用户标识、IP 地址和日期/时间组的散列表检索主题值。这种形式的定制向 Portal 用户提供了更好的 UI 定制粒度。

请参阅下面的下载文件以了解 MyThemeTag.java 的实现。

运行改变

下面的下载 ZIP 文件中,您会找到一个 mytheme.jar 项目的一个预先建立的版本、一个修改过的 engine.tld 文件和本文中出现的所有源代码。该项目创建时嵌入了所有所需的 JAR 文件。所以当您试图使用 Application Developer 重新编译时不会碰到任何丢失 JAR 文件的错误。我在本系列的第 2 部分将更详细地讨论 Portal Server 项目开发。

如果您对使用 Application Developer 很熟悉,那么请继续将项目导入至工作区环境中,并开始构建代码。否则,只要将 mytheme.jar 文件复制到 <WPS_Install_Root>/app/web/WEB-INF/lib 目录中,并将 engine.tld 文件复制到 <WPS_Install_Root>/app/web/WEB-INF/tld 目录中。如果您愿意,请备份 engine.tld 文件。

图 5. 向 Portal Server 类路径添加 mytheme.jar
展示如何向 Portal Server 类路径添加 mytheme.jar 的抓屏

接下来,请启动您的 WebSphere Application Server 管理控制台,然后将 mytheme.jar 路径添加到 Portal Server Web Application 的类路径中。这将确保 Portal Server 的 JSP 处理器能够定位新的主题标记处理程序。最后,请删除存储在 <WAS_Install_Root>/temp/default_host 目录中的任何缓存的门户网站页面副本。您可以安全地删除在该文件夹下找到的所有文件,因为它们通常是出于性能原因生成并缓存的。

一旦作出了所有这些改变,请从 WebSphere Application Server 管理控制台重新启动 WebSphere Portal Server Application Server 查看所作的改变!

图 6. 没有用户登录的 WebSphere Portal Server 缺省主页
没有用户登录的 WebSphere Portal Server 缺省主页的抓屏

图 7. 用户 wpsadmin 登录之后的 WebSphere Portal Server
用户 wpsadmin 登录之后的 WebSphere Portal Server 的抓屏

上面的图 1 和图 6 都展示了没有用户登录到 Portal Server 的缺省 WebSphere Portal Server 主页。请注意它们颜色方案的不同。在图 6 中,动态主题选择被触发,并为“guest”或没有用户标识的页面选择 GreyTheme。类似地,在图 7 中,登录的用户“wpsadmin”收到一个不同的主题 TealTheme(请将这与图 2 所示的缺省实现相比较)。这种不同组主题之间的切换是根据 MyThemeTag::doStartTag() 方法的实现动态发生的。请记住,TurbineResources.Properties 文件没有作任何改变,而且 WebSphere Portal Server Application Server 没有重新启动。

总结

本文和其中的代码展示了通过覆盖 Portal Server 类的缺省行为来扩展 WebSphere Portal Server 的可能性。使用覆盖标记处理程序缺省实现的相同原理,有很多不同的定制可以添加到一个高度个性化的门户网站的 Portal Server 中。举例来说,可以是覆盖 <wps:page> 标记处理程序并向每页的名称提供增值服务(例如国际化)。

您还可以进一步扩展本文中所示的示例代码以提供定制器页,用于用户对主题选择(或其它类型的 UI 习惯选项)的请求,并向某种存储器(如数据库)持久存储值。

最初对这种方法的实现是在 Portal Server 1.2 代码的基础之上开发的,因为撰写本文的原因,已经被移植到了 Portal Server 2.1 上。在 Portal Server 1.2 和 Portal Server 2.1 之间,标记引擎类工作的方式还有点小小的区别。如果您需要为使用 Portal Server 1.2 而设计的代码,请联系作者。

相关参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值