发布日期: 7/5/2004 | 更新日期: 7/5/2004
Visual J# .NET 小组
Microsoft Corporation
摘要:通过 Microsoft J# 浏览器控件,开发人员可以将所编写的在 Java 虚拟机上运行的 Java 小程序迁移到 .NET 框架。本文向开发人员介绍 J# 浏览器控件,并说明将 Java 小程序迁移到 .NET 框架的步骤。本文还讨论了其他一些主题,如 J# 浏览器控件的安全性和调试,以及当前版本中不受支持的功能。
下载 HTML 小程序到对象标记转换器 (95KB)
本文假设开发人员熟悉 .NET 框架和 Visual J# .NET。要下载 J# 浏览器控件运行库,请参阅 http://msdn.microsoft.com/vjsharp/downloads/browsercontrols/。
本页内容
简介
已经使用 Visual J# .NET 迁移到 .NET 框架的 Java 小程序称为 J# 浏览器控件。J# 浏览器控件旨在让客户能够将其现有的 Java 小程序迁移到 .NET 框架。
经过迁移得到的 J# 浏览器控件与原来的 Java 小程序具有类似的运行时行为,并保留了 Java 语言语义。如果在计算机上安装了 J# 浏览器控件运行库,用户甚至可能意识不到特定的 Web 站点已将其 Java 小程序升级到了 J# 浏览器控件。
要将 Java 小程序迁移到 J# 浏览器控件,您必须安装 Visual J# .NET 1.1 版可重新发布软件包以及 .NET 框架 SDK 1.1 版或 Visual Studio .NET 2003。同样,如果用户希望运行由 Web 站点承载的 J# 浏览器控件,则必须在自己的计算机上安装 .NET 框架 1.1 版可重新发布软件包和 J# 浏览器控件运行库。J# 浏览器控件不能在 Java 虚拟机上运行。J# 浏览器控件只能在 Microsoft Internet Explorer(5.1 版和更高版本)中运行。
将 Java 小程序迁移到 J# 浏览器控件的过程包括三个步骤:
1.
使用 Visual J# 编译器将 Java 小程序编译为 J# 浏览器控件。
2.
将 HTML 页更新为使用 J# 浏览器控件而不是使用 Java 小程序。
3.
将 J# 浏览器控件和 HTML 页复制到 Web 服务器。
新增功能
J# 浏览器控件 1.1b 版中添加了以下功能:
脱机支持
Microsoft J# 浏览器控件 1.1b 版现在支持在没有 Web 服务器的情况下,在 Internet Explorer 中加载控件。目前支持以下方案:
•
从本地文件系统加载控件
•
从网络共享位置加载控件
•
从网络驱动器加载控件
在上述所有方案中,J# 浏览器控件在默认情况下都将通过 Intranet 权限运行。
脚本支持
Microsoft J# 浏览器控件 1.1b 版支持以下脚本方案。
•
脚本调用 J# 浏览器控件的方法并访问其属性
•
从 J# 浏览器控件调用脚本事件
•
J# 浏览器控件使用 Netscape JavaScript API 来访问由 Internet Explorer 对象模型公开的网页中的元素。
J# 浏览器控件 1.1b 版还提供对 Netscape JavaScript API 功能的完整支持。netscape.javascript 小程序 API 软件包具有以下类:
•
netscape.javascript.JSObject
•
netscape.javascript.JSException
将 Java 小程序编译为 J# 浏览器控件
可以通过使用 Visual J# 编译器 (vjc.exe) 将 Java 小程序编译为托管库,从而将其迁移到 J# 浏览器控件。可以从命令提示符下也可以从 Visual Studio .NET 中将 Java 小程序源代码编译为 J# 浏览器控件。如果 Java 小程序是使用 Microsoft Visual J++ 6.0 开发的,可能只须使用 Visual Studio .NET 将项目升级到 Visual J# .NET。
将 Java 小程序编译为托管库类似于在 Visual J# 中编译任何其他库。大多数情况下,在将 Java 小程序编译为托管库时,不需要对 Java 小程序源代码进行任何更改,这是因为 J# 浏览器控件运行库提供了对 Microsoft Java 虚拟机中许多功能的支持。这包括对 JDK 1.1.4 级软件包和 java.applet 软件包中的功能的支持。
包含 J# 浏览器控件的托管库与 .NET 框架中的其他托管库没有什么不同。当用户访问承载了 J# 浏览器控件的 Web 站点时,J# 浏览器控件运行库将下载该托管库并在 Internet Explorer 中运行它。
使用 Applet Class 文件创建 J# 浏览器控件
如果只存在 Java 小程序的 Java 语言字节码(.class 文件),则可以使用 Visual J# 二进制转换器工具 (JbImp.exe) 将 Java 小程序转换为托管库。
从命令提示符下编译 Java 小程序
您可以使用 Visual J# 编译器 (vjc.exe) 从命令行编译 Java 小程序。例如:
C:\AppletSources>vjc.exe /target:library /out:MyApplet.dll *.java
该命令会将 Java 小程序源文件(带有 .java 扩展名)编译为名为 MyApplet.dll 的新 .NET 框架 DLL。
您还可以使用 Visual J# 二进制转换器工具:
C:\AppletSources>jbimp.exe /target:library /out:MyApplet.dll *.class
如果您安装了 Visual Studio .NET,则可以从 Visual Studio .NET 命令窗口中访问 Visual J# 编译器 (vjc.exe) 和 Visual J# 二进制转换器工具 (JbImp.exe)。如果您未安装 Visual Studio .NET,则必须确保这些工具位于您在命令提示符下键入的路径中。
在迁移使用资源的 Java 小程序时,您必须按照 Upgrading Visual J++ 6.0 Applications That Use Resources 和 HowTo:Resources in Visual J# .NET 中描述的步骤操作。
使用 Visual Studio .NET 迁移 Java 小程序
如果 Java 小程序是一个 Visual J++ 6.0 项目,则还可以使用 Visual Studio .NET 来迁移它。
使用 Visual Studio .NET 升级 Visual J++ 6.0 项目
1.
在 Visual Studio .NET 中打开 Visual J++ 6.0 项目。这将启动 Visual J# .NET 项目升级向导。
2.
在该升级向导的所有步骤中都单击 Next。升级向导将把该 Visual J++ 项目转换成 Visual J# .NET 类库项目。
3.
打开升级报告,以便了解向导是否在升级过程中检测到问题。
注 报告中将提到 Applet projects are not supported。您可以忽略该错误。在生成项目之前,您必须解决升级报告中列出的所有其他问题。
4.
生成项目。这会将 Java 小程序编译为托管库。
在 Visual Studio 中,您无法通过单击 Debug 然后单击 Start 或者通过按 F5 来在 Internet Explorer 中启动 J# 浏览器控件。您必须将控件复制到 Web 服务器的虚拟目录中,才能运行它。有关详细信息,请参阅部署 J# 浏览器控件和 How to:Debug J# Browser Controls。
有关将 Visual J++ 6.0 项目升级到 Visual J# .NET 的详细信息,请参阅 Upgrading from Visual J++ 6.0。
与使用 Netscape LiveConnect API 的小程序有关的其他步骤
除了上述白皮书中介绍的迁移步骤以外,开发人员在编译使用 Netscape LiveConnect API 的小程序时,将需要引用一个附加的程序集。J# 浏览器控件 1.1b 版中提供了对 LiveConnect API 功能的支持。
注 如果开发人员迁移利用 Netscape Jscript API 的小程序,则需要在其开发计算机上安装 J# 浏览器控件 1.1b 版,然后才能包含对该程序集的引用。
要从命令行编译,请按以下方式包含该引用:
vjc /r:??%ProgramFiles%\Microsoft JSharp Browser Controls v1.1\vjsjbc.dll??
/t:l MyApplet.java
如果您使用的是 Visual Studio .NET 2003,则需要在引用列表中添加对该程序集的引用。有关详细信息,请参阅 Add Reference Dialog Box。
如果您使用的是 JbImp,请使用以下命令将 Java 小程序 .class 文件转换为 J# 浏览器控件程序集。
jbimp /r:??%ProgramFiles%\Microsoft JSharp Browser Controls
v1.1\vjsjbc.dll?? /t:l MyApplet.class
将 HTML 页更新为使用 J# 浏览器控件
将 Java 小程序编译为 J# 浏览器控件以后,下一步是将 HTML 页更新为开始使用迁移后的控件。HTML 页中的 <APPLET> 标记或 Java <OBJECT> 标记必须转换为引用 J# 浏览器控件的 <OBJECT> 标记。
本白皮书包含一个称为“HTML 小程序到对象标记转换器”(TagConvert.exe) 的示例工具,它能够自动将 HTML 页升级为使用 J# 浏览器控件。用于下载该示例工具的链接位于本白皮书的开头部分。请下载并运行 TagConvertSetup.exe 以便安装“HTML 小程序到对象标记转换器”(TagConvert.exe)。
可按以下方式使用该工具:
TagConvert [options] <source files>
例如:
TagConvert.exe MyAppletPage.html
该工具的输入可以是任何文本文件,其扩展名可以是 .html、.htm、.asp 和 .aspx。
该工具可将 <APPLET> 标记或 Java 小程序 <OBJECT> 标记替换为包含以下 J# 浏览器控件 <OBJECT> 标记的 HTML 代码:
<OBJECT
CLASSID="clsid:a399591c-0fd0-41f8-9d25-bd76f632415f"
WIDTH= pixels
HEIGHT= pixels
ID=browserControlName
ALIGN= alignment
HSPACE= pixels
VSPACE= pixels
VJSCODEBASE = codebaseURL
>
<PARAM NAME = parameter1 VALUE = value>
<PARAM NAME = parameter2 VALUE = value>
. . .
alternateHTML
</OBJECT>
其中:
CLASSID
下载并执行 J# 浏览器控件的 ActiveX 控件的 CLASSID。必须在 J# 浏览器控件 <OBJECT> 标记中使用这一确切的 CLASSID。
VJSCODEBASE
J# 浏览器控件类的 URL 以及包含该类的托管库。符号“#”用于将托管库文件名与 J# 浏览器控件类名分隔开来。如果该文件名包含空格字符,则需要将 VJSCODEBASE 属性值放在引号内。该文件名还必须包括文件扩展名。例如:
VJSCODEBASE =
http://www.microsoft.com/MyApplet/MyAppletClass.dll#MyAppletClass
基本代码 (Codebase) 还可以是相对 URL。例如:如果页面位于 http://www.microsoft.com/MyApplet/MyAppletPage.htm,则
VJSCODEBASE =
MyAppletClass.dll#MyAppletClass
引用位于 http://www.microsoft.com/MyApplet/ 的 MyAppletClass.dll 中的浏览器控件 MyAppletClass。
如果您选择手动更新 HTML 页,则可以通过将 <APPLET> 或 Java 小程序 <OBJECT> 标记替换为上述 J# 浏览器控件 <OBJECT> 标记来完成操作。不过,建议您使用示例工具,因为它能够生成附加的 HTML 代码,从而使您在浏览时获得更美好的体验。
转换过程
在转换 HTML 页时,该工具会删除原来的 <APPLET> 标记或 Java 小程序 <OBJECT> 标记,并将其替换为还包含前面描述的 J# 浏览器控件 <OBJECT> 标记的 HTML 代码。
在转换标记之前,该工具会创建原文件的备份。文件的备份副本将带有 .vjsbak 扩展名。例如,index.htm 将被备份为 index.htm.vjsbak。备份文件创建于原文件的目录中。
该工具使用原来 <APPLET> 标记(或 Java 小程序 <OBJECT> 标记)的 CODE 和 CODEBASE 属性中的值来创建 VJSCODEBASE 属性的值。例如:
CODE = "MyAppletClass"
CODEBASE = http://www.microsoft.com/MyApplet
被修改为:
VJSCODEBASE =
http://www.microsoft.com/MyApplet/MyAppletClass.dll#MyAppletClass
默认情况下,该工具假设 J# 浏览器控件类的名称(例如,MyAppletClass)与 DLL (MyAppletClass.dll) 的名称相同。如果 J# 浏览器控件类与 DLL 的名称不同,您必须相应地修改 VJSCODEBASE 属性值。因此,在使用该工具时,建议您将 Java 小程序编译为与小程序类具有相同名称的托管库。例如:
C:\MyAppletClassSources>vjc /target:library /out:MyAppletClass.dll *.java
J# 浏览器控件运行库在 VJSCODEBASE 属性中只支持 HTTP、FILE 和 HTTPS 协议。指定相对路径后,将使用加载 html 页时所用的协议来加载 J# 浏览器控件。J# 浏览器控件不支持从 DOCBASE 之外的位置来加载控件。VJSCODEBASE 中的值必须与 DOCBASE 相同,或者必须是 DOCBASE 的子目录之一。DOCBASE 所引用的位置就是从中加载 HTML 页的位置。
在转换过程中,OBJECT 的许多属性保持不变。以下部分中说明了 TagConvert 所转换的属性的详细信息。J# 浏览器控件 <OBJECT> 标记中的许多参数与 <APPLET> 或 Java 小程序 <OBJECT> 标记的相应参数相同。
命令行选项
受支持的命令行选项包括:
/recurse:<wildcard>
根据通配符规范,在当前目录及其所有子目录中搜索要转换的文件。例如:
TagConvert /recurse *.htm *.html
升级当前目录及其子目录中具有 .htm 和 .html 扩展名的所有文件。
/verbose
打印在转换过程中发生更改的文件的名称。文件名包括文件的完全限定路径。该工具还可打印所分析文件的总数以及所转换文件的总数。例如:
TagConvert /verbose \AppletSources\Pages\*.htm > changedfiles.txt
升级指定目录中具有 .htm 扩展名的所有文件,并将经过修改的文件的名称转储到 changedfiles.txt 文件中。
/nologo
取消显示版权信息。例如:
TagConvert /nologo \AppletSources\Pages\*.htm
升级指定目录中具有 .htm 扩展名的所有文件,并取消显示版权信息。
<APPLET> 标记与 J# 浏览器控件 <OBJECT> 标记之间的属性映射
下表显示了 <APPLET> 标记中的属性与 J# 浏览器控件 <OBJECT> 标记中的属性之间的映射。
<APPLET> 标记语法(包括 Internet Explorer 扩展)
J# 浏览器控件 <OBJECT> 标记语法
CODEBASE
VJSCODEBASE
CODE
VJSCODEBASE
WIDTH
WIDTH
HEIGHT
HEIGHT
NAME
ID
ID
ID
ALIGN
ALIGN
VSPACE
VSPACE
HSPACE
HSPACE
ARCHIVE
在当前版本中已删除并且不受支持
ALT
ALT
<PARAM>
<PARAM>
<PARAM NAME = FireScriptEvents VALUE = True>
在当前版本中保留不变但不受支持
<PARAM NAME = cabbase VALUE = cabFileName>
<PARAM NAME = cabinets VALUE = cabFileNames>
在当前版本中保留不变但不受支持
<PARAM NAME = useslibrary VALUE = DUFriendlyName>
<PARAM NAME = useslibrarycodebase VALUE = DUFileName>
<PARAM NAME = useslibraryversion VALUE= DUVersionNumber>
在当前版本中保留不变但不受支持
<PARAM NAME = namespace VALUE = applicationNamespace>
在当前版本中保留不变但不受支持
在当前版本中,<APPLET> 标记中的以下属性不受支持,并且在 J# 浏览器控件 <OBJECT> 标记中没有等效属性。
•
archive、cabbase 和 cabinets 属性。在当前版本中,不支持将 J# 浏览器控件打包成 .cab、.zip 或 .jar 文件。J# 浏览器控件必须作为独立的 .dll 文件部署到 Web 服务器上。
•
useslibrary、useslibrarycodebase、useslibraryversion 和 namespace 属性。J# 浏览器控件运行库不支持 MSJVM 的 Java 包管理器语义。
<APPLET> 标记中的那些在 <OBJECT> 标记中具有直接等效属性的属性可以按原样复制。它们在 J# 浏览器控件 <OBJECT> 标记中和在原来的 <APPLET> 标记中具有相同的含义。
如果 <APPLET> 或 Java 小程序 <OBJECT> 标记除了具有 ID 属性以外,还具有 NAME 属性,则将删除 NAME 属性,并使用 ID 属性中的值。
部署 J# 浏览器控件
部署 J# 浏览器控件就像将托管库和更新过的 HTML 页复制到 Web 服务器或用户计算机上的相应目录中一样简单。Web 服务器不再是部署 J# 浏览器控件的必要条件。必须将托管库复制到 HTML 页所在的目录中或者某个子目录中。
使用 IIS Web 服务器时,必须将虚拟目录上的 ExecutePermissions 字段设置为 Scripts only,即 IIS 中的虚拟目录的默认权限级别。
部署多 DLL 浏览器控件
可以将一个 J# 浏览器控件拆分为多个 DLL 文件。在这种情况下,必须在 HTML 页中引用包含主要 J# 浏览器控件类的 DLL。J# 浏览器控件运行库将在运行时根据需要下载其他 DLL。
在部署多 DLL 控件时,必须将与同一 J# 浏览器控件相关的所有文件复制到同一目录中。这些文件必须作为独立文件进行复制,并且不能打包成 .cab、.zip 或 .jar 文件。
将多个 J# 浏览器控件打包到同一个库中
您还可以将多个 J# 浏览器控件打包到同一个托管库中。在这种情况下,每个 J# 浏览器控件的 <OBJECT> 标记均必须指向同一个托管库,但指向不同的类名。例如,如果虚拟目录 AppletDir 中的 MyApplets.dll 包含名为 MyApplet1 和 MyApplet2 的 J# 浏览器控件,则您可以按以下示例所示来引用这两个 J# 浏览器控件:
VJSCODEBASE="http://www.microsoft.com/AppletDir/MyApplets.dll#MyApplet1"
VJSCODEBASE="http://www.microsoft.com/AppletDir/MyApplets.dll#MyApplet2"
因为 J# 浏览器控件只能从 HTML 页所在的目录或其某个子目录中下载,所以如果 HTML 页的目录不同,您可能需要将托管库复制到多个位置。
在用户计算机上运行 J# 浏览器控件
最终用户除了在自己的计算机上安装 J# 浏览器控件运行库以外,不需要了解 J# 浏览器控件。
在用户计算机上安装 J# 浏览器控件运行库支持
用户必须在自己的计算机上安装 J# 浏览器控件运行库后,才能在 Internet Explorer 中查看和使用 J# 浏览器控件。您和您的网站管理员需要为最终用户提供下载和安装 J# 浏览器控件的方法。J# 浏览器控件运行库还支持使用 SMS 或组策略进行安装。有关使用 SMS 或组策略部署 J# 浏览器控件的详细信息,请参阅 http://www.microsoft.com/smserver/techinfo/deployment/20/default.asp 或 http://www.microsoft.com/windows2000/techinfo/reskit/dpg/default.asp。
J# 浏览器控件的安全行为
默认情况下,J# 浏览器控件运行库在运行 Internet 网页上承载的控件之前,会提示最终用户。当用户浏览到含有 J# 浏览器控件的 Internet Web 站点时,将显示以下对话框:
如果用户单击 Yes,将下载并运行 J# 浏览器控件。单击 No 将禁止 J# 浏览器控件运行。
如果选中 Add this site to the list of sites allowed to run J# Browser Controls and don't ask me again 复选框并单击 Yes,则会将该 Web 站点添加到允许运行 J# 浏览器控件的网站列表中,并且当用户以后访问该 Web 站点上的网页时,将不会提示用户。该复选框的默认值被设置为已选中。
J# 浏览器控件运行库在从 Intranet 上的 Web 站点中运行时,不会提示用户。
用户还可以使用“Control Panel”中“Administrative Tools”下提供的“J# Browser Controls Security Options”对话框,来管理允许运行 J# 浏览器控件的网站列表。在 Windows XP 中,您可以从“Control Panel”中的 Performance and Maintenance 访问该对话框。在 Windows 98 和 Windows Millennium Edition 中,您可以从“Start”菜单中的“Administrative Tools”菜单访问该对话框。双击 J# Browser Control Security 图标可打开以下对话框:
选项包括:
Disable J# Browser Controls
禁止来自任何 Web 站点的 J# 浏览器控件在计算机上运行。
Only from Web sites in this list
只允许来自列表中 Web 站点的 J# 浏览器控件运行。
Only on the Intranet and from Web sites in this list
只允许来自 Intranet 或来自列表中 Web 站点的 J# 浏览器控件在计算机上运行。这是默认设置。
On any Web site
允许来自任何 Web 站点的 J# 浏览器控件在计算机上运行。建议不要使用该选项,如果使用应十分小心。
在 Add Web site 文本框中输入一个 Web 站点的地址,然后单击 Add,就会将该 Web 站点添加到允许运行 J# 浏览器控件的网站列表中。同样,从 Web sites allowed to run J# Browser Controls 列表中选择某个 Web 站点,然后单击 Remove,就会将该网站从列表中删除。将某个 Web 站点添加到允许运行 J# 浏览器控件的网站列表中以后,用户在运行该 Web 站点上的 J# 浏览器控件之前将不会得到提示。
默认情况下,将选中 Prompt to add new Web sites to this list in the future 复选框,这会使 J# 浏览器控件运行库在运行来自该列表外部的 Web 站点的 J# 浏览器控件之前提示用户。当该复选框被清除后,将不会运行来自该列表外部的 Web 站点的 J# 浏览器控件,并且不会提示用户。
当前版本中不受支持的功能
在当前版本的 J# 浏览器控件中,以下功能不受支持:
•
基于信任的安全
不支持 MSJVM 所支持的基于信任的安全语义。将 Java 小程序迁移到 J# 浏览器控件以后,这些小程序将使用 Security Semantics for J# Browser Controls 中描述的安全语义。
•
Java 包管理器
MSJVM 中支持的 Java 包管理器功能在 J# 浏览器控件中不受支持。J# 浏览器控件不支持对象缓存(对象缓存可用来在本地安装类,然后使用权限签名通过一组受限制的权限来运行这些类)。因此,也不支持安装和运行 Distribution Units。
•
存档文件
存档文件不受支持。一个 J# 浏览器控件可以拆分为多个托管库。然而,将多库控件部署到 Web 服务器时,这些文件必须作为独立文件进行复制,并且不能打包成 .cab、.zip 或 .jar 文件。
•
Java 控制台支持
J# 浏览器控件 1.1b 版不支持 Internet Explorer 中的 Java 控制台。不过,为了从代码中使用控制台打印语句来调试 J# 浏览器控件,可以将 Internet Explorer 的输出重定向到某个文件。
%Program Files%\Internet Explorer\IExplore.exe [html address] >
[output file path] 2> [error file path]
•
对所有事件语法的支持
该版本不支持任何事件语法,只支持以下语法。
<SCRIPT language="JavaScript" for="MyAxClass1"
event="dataUpdated(atTime, msg)">
alert("Event occurred. Event Name= dataUpdated, " +
"Time= " + atTime + ", Message= " + msg );
</SCRIPT>
•
没有设计器支持
Visual Studio .NET 中没有针对 J# 浏览器控件的设计器支持。
小结
J# 浏览器控件为开发人员提供了一种迁移自己的 Java 小程序以便在 .NET 框架上运行的方法。经过迁移得到的 J# 浏览器控件与原来的 Java 小程序具有相同的运行时行为,并保留了 Java 语言语义。J# 浏览器控件还具有对 .NET 框架的完整访问权限,包括访问针对 XML Web 服务的本机支持的能力。它们还为 J# 开发人员提供了一种在基于 Web 的应用程序中添加丰富的客户端功能的方法。
另请参阅
Visual J# .NET Articles | Classes Accessible to a J# Browser Control | How to:Debug J# Browser Controls | Security Semantics for J# Browser Controls | Supporting J# Browser Controls and Java Applets in the Same Page