不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法

版权声明:转载时请务必保留以下作者信息和链接
作者:陈维([email protected])作者的网站:http://www.chenwei.mobi

在 Java SE 6 中提供了一套桌面 API 实现与本机桌面 API 的无缝集成,这些桌面 API 使用你的主机操作系统的文件关联以启动与特定文件类型相关联的应用程序。但是因为目前许多客户端并没有安装、部署 JRE 6.0 之后的 Java 运行环境,那么在旧的运行环境中怎样才能调用默认浏览器打开指定的链接呢?

这就是本文的主要内容。

我们把目标平台暂定为 Windows XP 和 Mac OS X。

Windows 平台

可以在控制台中使用 rundll32.exe 调用 url.dll 这个动态连接库打开浏览器访问指定的链接。那么,我们在 Java 程序中就可以使用 Runtime.exec 方法来调用这个命令。(关于 Runtime.exec 可以参考我 blog 中的另一篇文章:Java 程序调用 exe

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法Stringcmd="rundll32url.dll,FileProtocolHandlerhttp://www.apple.com";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法Runtime.getRuntime().exec(cmd);

当然,以上程序执行前,首先得判断当前的操作系统平台是否是 Windows。

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法privatestaticfinalStringWIN_ID="Windows";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
publicstaticbooleanisWindowsPlatform(){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法Stringos
=System.getProperty("os.name");
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
if(os!=null&&os.startsWith(WIN_ID))
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
returntrue;
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
else
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
returnfalse;
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}


Mac OS X

在 Mac 里稍微有些复杂。同样,我们需要判断当前操作系统平台是否是 Mac OS X。

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法privatestaticfinalStringMAC_ID="Mac";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
publicstaticbooleanisMacPlatform(){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法Stringos
=System.getProperty("os.name");
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
if(os!=null&&os.startsWith(MAC_ID))
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
returntrue;
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
else
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
returnfalse;
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}

Apple 公司实现的 JDK 里有这么一个类:com.apple.mrj.MRJFileUtils,在 Mac 下可以使用它提供的方法 openURL 打开浏览器访问链接。为了使我们的程序兼容标准 Java 运行环境,所以使用反射技术来使用这个方法。

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法publicstaticvoidopenMacURL(Stringurl){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
try{
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法ClassMRJFileUtils
=Class.forName("com.apple.mrj.MRJFileUtils");
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法MethodopenMethod
=MRJFileUtils.getDeclaredMethod("openURL",newClass[]{String.class});
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法openMethod.invoke(MRJFileUtils,
newObject[]{formatString(url)});
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}
catch(Exceptione){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法e.printStackTrace();
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}

formatString( String ) 顾名思义是用来重新格式化目标 URL。

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法publicstaticStringformatString(Stringstr){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法StringretString
="";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法Stringprotocol
="";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法Stringhost
="";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法Stringpath
="";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
try{
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法java.net.URLurl
=newjava.net.URL(str);
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法protocol
=url.getProtocol();
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法host
=url.getHost();
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法path
=url.getPath();
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}
catch(MalformedURLExceptionex){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法path
=str;
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
for(inti=0;i<path.length();i++){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
if(path.charAt(i)==''){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法retString
+="%20";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}
elseif(path.charAt(i)=='.'){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法retString
+="%2E";
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}
else{
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法retString
+=path.substring(i,i+1);
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
if(!protocol.equals("")){
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法retString
=protocol+"://"+host+retString;
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}
else{
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法retString
=host+retString;
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法
returnretString;
不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法}


Mac 下默认调用的浏览器是 Safari

不使用 java.awt.Desktop API,打开默认浏览器访问指定链接的方法

作者的网站:http://www.chenwei.mobi