在线帮助系统是任何软件系统整体不可或缺的一部分。帮助系统可提供直观的帮助信息,使用户可以轻松的浏览、查找和显示帮助信息,同时有助于用户学习系统的使用,如此一来,许多应用程序的学习周期就大大缩短。然而,从传统上讲,由于 Java 语言中没有集成帮助系统,那么 Java 开发人员不得不从零开始创建自己定制的帮助系统。这样不仅成本高,而且费时。
现在有了 JavaHelp 技术,Java 开发人员就不再需要为应用程序所运行的每个平台构建自己的帮助系统。JavaHelp 技术的目的是满足当今的工业强度的应用程序。
JavaHelp 技术介绍。
JavaHelp 技术的功能特点和优势的讨论。
开发帮助信息所应用的风格。
可用于您自己应用程序中的示例代码。
帮助系统的可选方案
Java 开发人员可用以下几种方案来实现其应用程序的帮助系统:
无帮助系统:让用户自行判断和领会系统是如何工作的。然而,一个软系统如果没有文档、帮助信息系统、或者手册,那么该软件系统就是不完全的。而且还会影响到使用它的用户。设想一下没有使用手册的 Adobe Photoshop 会是什么一种情况!
使用 HTML:这是一个低成本的选项,但是其功能和导航受到限制。
自定义系统:这是一个高成本的选项,耗费资源和时间。
第三方私有方案:这是一个可替代自定义系统的可行的方案;然而,它也有自己的后果,包括:成本和长期支持。如果软件供应商破产,你能做些什么呢?
这就是为什么要设计 JavaHelp 技术的原因。
JavaHelp 技术
JavaHelp 是一个可扩展的、平台独立的帮助系统,可使作者和开发人员将在线帮助融合到applet、应用程序、操作系统和设备之中。它也可用来 Web 上和公司内部 Intranet 上传递在线文档。它的设计理念之一就是以网络为中心,帮助数据和搜索功能既可以在客户端,也可以在服务器端,同时帮助数据可以通过 Web 进行更新。
JavaHelp 系统是用 Java 语言所写,因此可以运行在任何支持 Java Runtime Environment (JRE)的平台或者浏览器上。这说明,它可用于异构环境中,如 Web 或 公司内部 Intranet。此外,它还可以用来为任何软件应用程序开发和提供在线帮助,而不只是针对那些用 Java 语言开发而成的应用程序。而且,它也可以自我应用,而不需与任何软件相关联--正如以 Web 为中心的分类文档(如人力资源、技术支持、等)的传输机制。
JavaHelp 1.0 在 1999 年首次发布,经历了数年的发展和完善,该技术现在已经成熟。 JavaHelp 2.0 技术由 Java Community Process (JCP) 设计成 JSR-97。这说明和 WinHelp 不同,JavaHelp 具有 HTML 内容的跨平台优势,因为它并不将公司局限于单一的平台。请务必注意:JavaHelp 系统可以用来为部署在任何平台上的任何软件应用程序(而不仅仅是基于 Java 语言的应用程序)传递和提供在线帮助。
JavaHelp 系统得到了来自行业和 主要帮助写作工具供应商 的广泛支持。
JavaHelp 的功能和优势 JavaHelp 提供了几个对文档写作十分有用的功能。此外,它所提供的几个可重用的组件可为 Java 开发人员节省大量的时间。JavaHelp 的一些功能如下:
帮助导航器:内容目录 (TOC) 支持以可折叠和可扩展的方式显示主题、无限分级、多目录合并;一个索引支持多索引合并;和具有灵活和可配置特性的全文检索。
压缩:基于 JavaHelp 的帮助系统可以压缩并封装到一个单一的 Java Archive (JAR)文件中。
可扩展和可定制: JavaHelp API 可用来定制或者扩展用户界面及其功能。 Extensions 可以自定义导航,甚至是语音和声音。这就使得作者在设计帮助系统时有更大的灵活性和控制力。
上下文帮助:这是由 Swing 提供的。
合并功能:在提供给用户之前可以对多个帮助组件进行合并。
动态更新:许在线帮助系统在发布之后进行动态更新。
适应性强:可使帮助系统适用于提供和显示信息。在最终部署环境事先未知的情况下,这将十分有用。
可本地化:Java 支持国际化(I18N),因此 JavaHelp 系统可以轻松进入国际市场。
部署和操作情况
JavaHelp 技术为作者和开发人员提供了几种在应用程序中部署或调用它的方法。由于它是以网络为中心的,所以它可以独立于它所支持的应用程序而运行。它甚至可以嵌入应用程序之中。并且由于它是用 Java 语言所写,因此它具有平台独立和浏览器独立的特点,可运行在任何支持Java Runtime Environment (JRE)的平台和浏览器上。这使得它成为当今异构计算环境中的理想的选择。
这里是 JavaHelp 提供帮助信息的几种情况:
独立应用程序:这是一个运行在桌面上的无需浏览器的本地应用程序。JavaHelp 帮助查看器可以作为一个单独的应用程序或者一个嵌入到该本地应用程序本身的应用程序而运行。
网络应用程序:这些是网络应用程序,它们从远程服务器提取数据。JavaHelp 系统从远程服务器装载帮助信息是可能的。这对软件开发商来说十分有用,它们就可以为其客户提供轻量级的客户端应用程序,这些轻量级的应用程序从远程服务器提取帮助信息。软件供应商可以随意更改帮助信息,而不需要发布新的软件版本。
Applets:运行于 web 浏览器中的小应用程序。JavaHelp 系统本身可以是浏览器的一部分,同时帮助数据可以是,也可以不是应用程序的一部分。
基于服务器的应用程序:这是一个运行于 Java 服务器上的,但使用浏览器作为其 GUI 的应用程序。
参考实现
Sun Microsystems 提供一个参考实现 (JavaHelp System),它将实现 JavaHelp 规范。它具有成熟、健壮和可靠的特点,并可供开发人员所使用。JavaHelp System 下载的地址是: http://java.sun.com/products/javahelp。其最新的版本是2.0_01.
参考实现是以压缩文件的形式出现的,在选择的目录下对它进行解压缩就可以轻松的进行安装。 如果您选择 Windows 的 c: 作为其目的,它将被安装到 c:jh2.0 下。
参考实现附带有文档、工具和几个演示程序。二进制演示程序位于 c:jh2.0demosin, 用 java -jar demoName.jar 命令可以方便的运行这些演示程序。除了这些演示程序外,目录 c:jh2.0javahelpin 含有 jhindexer 和 jhsearch 工具,它们分别用来创建索引数据库和搜索的。最后,目录 c:jh2.0javahelplib 含有 JavaHelp API 的 JAR 文件,它们是:
jh.jar: 使用标准导航器(目录、索引、全文检索)所需的标准库。
jhbasic.jar: 它是 jh.jar 的子集,不包含对全文搜索引擎的支持。对于那些大小很关键的帮助信息系统,或者不需要全文检索数据库的系统来说,这可能会十分有用。
jhall.jar: 含有所有 JavaHelp 系统类,以及创建检索数据库所需的工具。
jsearch.jar: 含有用于 JavaHelp 系统中的全文搜索引擎。
JavaHelp 帮助查看器
参考实现所附带的一个有趣的演示程序是帮助查看器(c:jh2.0demosinhsviewer.jar),它是一个 helpset 查看器,可用来查看本文将要部署的帮助信息。值得注意的是它和 508 兼容。
内容窗格: 使用 HTML 和 frame 、表格和轻量级组件显示帮助主题
导航窗格: 一个标签界面,用户可以在目录、索引和全文搜索显示模式之间进行切换。需要指出的是,导航器和内容查看器是同步的,所以用户总是知晓相对位置和选项。
帮助信息写作
为了用 JavaHelp 系统开发帮助信息,作者需要创建 JavaHelp 系统用来显示信息的元数据文件。此外,作者也需要创建供用户使用的主题。元数据和主题文件被称为 helpset。有一些帮助制作工具对这些 helpset 的创建进行了简化,但在本文中,我们将自己创建这些 helpset。
创建 helpset 包含以下步骤:
使用您所喜欢的编辑器创建 HTML 主题。
创建一个 helpset 文件。
创建一个 map 文件。
创建一个目录。
创建一个索引文件。
创建一个全文检索数据库。
将帮助文件压缩并封装到一个 JAR 文件中,以便提供给客户。
注意:第 5 和第 6 步只有当您的帮助信息系统中集成有索引和全文检索数据库时才是必要的。
要查看您的 helpset,helpset 查看器提供有参考实现(RI)。 helpset 查看器位于
c:jh2.0demosinhsviewer.jar
当查看器处于打开状态时,单击 "Browse" 来定位到一个 helpset (扩展名为 .hs)。您也可以用以下方法进行查看:
java -jar c:jh2.0demosinhsviewer.jar -helpset c:PathToMyHelpSet.hs
帮助主题包含在文件中,这些文件在帮助查看器中一次显示一个,从这个意义上讲,Java Help 系统是基于文件的系统。相互关联的主题应该进行分组。最好用文件夹的分级结构来组织帮助主题。从一个主题到另一个主题的链接应该在含有该链接的文件中进行指定,且不能使用绝对路径。而且,您应该使用正斜杠 "/" 作为文件分隔符。举例如下:
<a href="../subtopicC/topic.html">New Topic</a>
1. 创建 HTML 主题
实际的帮助信息是用 HTML 创建的; helpset 查看器能够解析并运行 HTML。您的 HTML 文件可以含有与其他文件以及图像的链接。示例代码 1 显示了 welcome.html 示例:
注意:HTML 呈现引擎是一个 JRE 组件,且不是 JavaHelp 的一部分,因此呈现根据所用的 Java 的版本会有所变化。呈现引擎只显示 HTML 3.2 (带一些 4.0 版本的功能特点)。然而,它确实包含对 CSS1 样式表的支持。
示例代码 1: welcome.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE> Help Overview </TITLE> </HEAD> <BODY BGCOLOR="#ffffff"> <H1>My Sample Online Help</H1> This help system is organized into the following main <br> topics. You can access these topics directly from the <br> Help menu. <p> <table width=98% border=0 cellpadding=5> <tr valign="top"> <td width=30%><A HREF="manager.html">Managing Projects</A> </td> <td width=70%> How to create and use projects and <br>portfolios </td> </tr> <tr valign="top"> <td width=30%><A HREF="debug.html">Debugging Projects</A> </td> <td width=70%> How to debug Java programs </td> </tr> <tr valign="top"> <td width=30%><A HREF="profile.html">Profiling Projects</A> </td> <td width=70%> How to analyze the performance of <br> Java programs </td> </tr> </table> </ul> <hr> <pre> <font size="-1"> Some Copyright Information Goes Here! </font> </pre> <hr> </BODY> </HTML>
2. 创建 Helpset 文件
helpset 文件是应用程序惟一显式引用的文件。JavaHelp 系统从该文件中抽取所有有关帮助系统的必要信息。 一旦 JavaHelp 系统被某个应用程序所激活,它会首先读取该 helpset 文件,该文件是组成帮助系统的一组数据,包含的信息如下:
Map 文件: 用来联系主题 ID 和 URL 或 HTML 主题文件的路径名。
查看信息: 描述用于 helpset 中的导航器。标准的导航器是:目录、索引和全文检索。其他导航器包括词汇表和收藏导航器。
Helpset 标题: <title> 是在 helpset 文件中定义的,它显示在主窗口和任何在 helpset 文件中所定义的子窗口的顶部。
Home ID: 当调用帮助查看器而不指定 ID 时所显示出的默认 ID 的名称。
Presentation: 显示帮助主题的窗口。 <presentation> 标签用来定义用于 helpset 中的窗口。
Sub-helpsets: 这是一个可选节,它包括 sub-helpset,该 sub-helpset 可以自动合并到包含它的 helpset 中。
Implementation: 这是一个可选节,用来创建一个注册,它提供关键数据映射以定义 HelpBroker 类。
示例代码 2 显示的是一个 helpset 文件 Sample.hs:
示例代码 2: Sample.hs
<?xml version='1.0' encoding='ISO-8859-1' ?> <!DOCTYPE helpset PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp HelpSet Version 2.0//EN" "../dtd/helpset_2_0.dtd"> <helpset version="1.0"> <!-- title --> <title>My Sample Help - Online</title> <!-- maps --> <maps> <homeID>top</homeID> <mapref location="Map.jhm"/> </maps> <!-- views --> <view> <name>TOC</name> <label>Table Of Contents</label> <type>javax.help.TOCView</type> <data>SampleTOC.xml</data> </view> <view> <name>Index</name> <label>Index</label> <type>javax.help.IndexView</type> <data>SampleIndex.xml</data> </view> <view> <name>Search</name> <label>Search</label> <type>javax.help.SearchView</type> <data engine="com.sun.java.help.search.DefaultSearchEngine"> JavaHelpSearch </data> </view> <presentation default="true" displayviewimages="false"> <name>main window</name> <size width="700" height="400" /> <location x="200" y="200" /> <title>My Sample Help - Online</title> <image>toplevelfolder</image> <toolbar> <helpaction>javax.help.BackAction</helpaction> <helpaction>javax.help.ForwardAction</helpaction> <helpaction>javax.help.SeparatorAction</helpaction> <helpaction>javax.help.HomeAction</helpaction> <helpaction>javax.help.ReloadAction</helpaction> <helpaction>javax.help.SeparatorAction</helpaction> <helpaction>javax.help.PrintAction</helpaction> <helpaction>javax.help.PrintSetupAction</helpaction> </toolbar> </presentation> <presentation> <name>main</name> <size width="400" height="400" /> <location x="200" y="200" /> <title>My Sample Help - Online</title> </presentation> </helpset>
正如您在示例代码 2 中所看到的,每个窗口都是由其自己的 <presentation> 标签所定义。presentation 标签包括: <name>: 命名窗口,使得 Java 程序可以通过名称对它进行调用。
<size>: 指定窗口尺寸(宽和高)的像素值。
<location>: 用横坐标(x)和纵坐标(y)指定窗口的位置。
<title>: 定义显示在窗口上部标题栏中的文本。
<toolbar>: 说明该窗口含有一个工具栏。 工具栏上的按钮的定义是这样的:每个动作都使用一个 <helpaction>标签,每个动作也都有一个 Java 类名。例如,代码: <helpaction>javax.help.PrintSetupAction</helpaction>定义了一个打印设置动作,因此用户就可以设置/选择打印机。
3. 创建 Map 文件
在读取 helpset 文件之后,JavaHelp 系统就会读取在 helpset 中所列出的 map 文件。map 文件使用 URL 将主题 ID 和 HTML 主题文件的路径联系起来。示例代码 3 显示了一个 map 文件示例:
示例代码 3: Map.jhm
<?xml version='1.0' encoding='ISO-8859-1' ?> <!DOCTYPE map PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp Map Version 1.0//EN" "http://java.sun.com/products/javahelp/map_1_0.dtd"> <map version="1.0"> <mapID target="toplevelfolder" url="images/toplevel.gif" /> <mapID target="top" url="help/welcome.html" /> <mapID target="intro" url="help/welcome.html" /> <mapID target="start" url="help/start.html" /> <mapID target="overview" url="help/welcome.html" /> <mapID target="one" url="help/start.html" /> <mapID target="two" url="help/start.html" /> <mapID target="bean.story" url="help/welcome.html" /> <mapID target="bean.story" url="help/start.html" /> <mapID target="bean.story" url="help/welcome.html" /> </map>
4. 创建目录(TOC)文件
目录文件描述了将显示在目录导航器中的目录以及目录的布局。目录文件的示例请参见示例代码 4。
示例代码 4: SampleTOC.xml
<?xml version='1.0' encoding='ISO-8859-1' ?> <!DOCTYPE toc PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp TOC Version 2.0//EN" "../dtd/toc_2_0.dtd"> <toc version="2.0"> <tocitem text="My Sample Help" image="toplevelfolder"> <tocitem text="Introduction to Sample Online Help" target="intro"/> <tocitem text="Tutorial" target="start" expand="true"> <tocitem text="Welcome" target="overview"/> <tocitem text="Tutorial One: Help One" target="one"/> <tocitem text="Tutorial Two: Help Two" target="two"/> </tocitem> <tocitem text="Beans In IDE" target="bean.story"/> <tocitem text="Beans In IDE - in SecondaryWindow" target="bean.story" // presentationtype="javax.help.SecondaryWindow" presentationname="main"/> <tocitem text="Beans In IDE - in Popup" target="bean.story" presentationtype="javax.help.Popup"/> </tocitem> </toc>
5. 创建索引文件
索引文件向索引导航器描述索引的内容和布局。示例代码 5 显示了一个索引文件的示例。
示例代码 5: SampleIndex.xml
<?xml version='1.0' encoding='ISO-8859-1' ?> <!DOCTYPE index PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp Index Version 1.0//EN" "http://java.sun.com/products/javahelp/index_1_0.dtd"> <index version="1.0"> <indexitem text=".prof extension (profile data)" target="prof.profile"/> <indexitem text="accelerators (keyboard), see 'keyboard commands'"/> <indexitem text="adding an existing project" expand="false"> <indexitem text="naming the project" target="proj.importdirectory"/> <indexitem text="naming the storage directory" target="proj.importdirectory"/> <indexitem text="procedures for" target="proj.importproject2"/> </indexitem> <indexitem text="arguments" expand="false"> <indexitem text="passing" target="debug.arguments"/> <indexitem text="specifying" target="debug.arguments"/> </indexitem> <indexitem text="beans" expand="false"> <indexitem text="adding existing sources to a bean project" target="proj.existingbeans"/> <indexitem text="changing bean file status" target="proj.existingbeans"/> <indexitem text="creating a bean project" target="proj.beansproject"/> <indexitem text="removing existing sources from a bean project" target="proj.existingbeans"/> </indexitem> </index>