外部化Flex / Java Web应用程序的客户端ChannelSet配置

时间:2010-12-10 02:48:33

标签: java flex web-applications configuration blazeds

我正在寻找一种方法,允许我(以某种方式)动态地将服务器名称,服务器端口和Web上下文传递给我的Flex客户端,以便它可以为其RemoteObjects创建一个ChannelSet来使用。当然,我的Java服务器端代码可以使用这三个属性,因此我只需要一种方法将它们传送到客户端。

默认情况下,Adobe says您应该针对服务器配置文件“services-config.xml”编译Flex应用程序。这是一种非常不灵活的做法,Spring says应该避免(我同意)。

一个popular approach是使用Flex的http服务下载XML配置文件。我喜欢这个想法,但我不想硬编码XML文件并将其保存在我的WAR文件中。有没有办法从Java代码动态生成它?

我的另一个想法是以某种方式使用flashvars将属性从包含HTML页面传递到SWF文件。但同样,我不想将它们硬编码到HTML页面中。是否有办法(可能使用Javascript?)在页面加载时动态设置这些值?

1 个答案:

答案 0 :(得分:3)

我就是这样做的。我希望你会发现它很有用:

public static function getRemoteObject(destination:String, channelName:String,
    showBusyCursor:Boolean=true):RemoteObject{
    var remoteService:RemoteObject=new RemoteObject(destination);
    var channelSet:ChannelSet=new ChannelSet();
    var url:String = Application(Application.application).url;
    var secure:Boolean = URLUtil.isHttpsURL(url);
    var protocol:String = URLUtil.getProtocol(url);
    var amf:AMFChannel;
    if (secure){
        amf = new SecureAMFChannel(channelName, protocol +
            "://{server.name}:{server.port}" +
            (Application.application as Application).parameters.contextRoot +
            "/graniteamf/amf");
    }else{
        amf = new AMFChannel(channelName, protocol +
            "://{server.name}:{server.port}" +
            (Application.application as Application).parameters.contextRoot
            + "/graniteamf/amf");
    }
    channelSet.addChannel(amf);
    remoteService.channelSet=channelSet;
    remoteService.showBusyCursor=showBusyCursor;
    return remoteService;
}

因此,您可以看到您需要提供的唯一内容是目标 - 必须在服务器端XML和contextRoot中配置 - 作为flashVar传递。在我的情况下(通过JSP)传递为flashVar看起来像这样:

String flashVariables = "contextRoot=" + request.getContextPath() +
    "&locale=" + request.getLocale().getLanguage();