如何在ActionScript的class中获得浏览器URL

Jun 05, 2012

其实这个问题本质上不难,API提供了各种接口,但我这次解决的方法比较另类,权当一次个人记录吧。

一般情况下,获得当前执行项目url和项目名的方法有以下几种:

  1. this.parentApplication.loaderInfo.url
  2. mx.managers.BrowserManager.url 「需要先初始化」
  3. FlexGlobals.topLevelApplication.url

之后可以交给mx.utils.URLUtil的各种方法处理(当然方法不够全,这也是写本文的原因)

问题是:在 class 中没办法获得 parentApplication 和 BrowserManager 对象 (我在官方的 BrowserManager.getInstance() 得到对象后,取 url 为 null ),因此只剩下第三种了,貌似只能在 Flex 4 中使用。

现在要获得项目名称,拼接传给后台服务的请求地址,所以需要提取url的分段信息(协议,接口,项目名称等),其他好办,唯独URLUtil不提供项目名称的接口,所以呢,采取的办法就是字符串操作了,我把操作的过程记录如下:

var url:String=FlexGlobals.topLevelApplication.url;
var serverName:String=URLUtil.getServerNameWithPort(url);
// 获取去掉getServerNameWithPort的后半段url
var shortURL:String=url.substring(URLUtil.getProtocol(url).length + serverName.length + 4);
// 截取项目名称
var projName:String=shortURL.substring(0, shortURL.indexOf('/'));
// 拼接带项目名称的url(getProtocol//:serverName/projName)
var uploadURL:String=url.substr(0, URLUtil.getProtocol(url).length + serverName.length + projName.length + 4)
+ "/servlet/MyServlet";

截取长度加4的原因是补足 :// 和项目名称前的 / 详见代码中的注释。

当然处理方法很麻烦,正则表达式应该能解决,后续会不上正则的使用,也欢迎给位高手指点