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/。
本页内容
简介
新增功能
将 java 小程序编译为 j# 浏览器控件
将 html 页更新为使用 j# 浏览器控件
部署 j# 浏览器控件
在用户计算机上运行 j# 浏览器控件
当前版本中不受支持的功能
小结
简介
已经使用 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 dont 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 的应用程序中添加丰富的客户端功能的方法。