【问题标题】:Externalizing client ChannelSet configuration for Flex/Java web application为 Flex/Java Web 应用程序外部化客户端 ChannelSet 配置
【发布时间】:2010-12-10 02:48:32
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java apache-flex web-applications configuration blazeds


    【解决方案1】:

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

    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(); 
    

    【讨论】:

    • 这太棒了。我知道您如何从 Application.url 推断主机名、端口和协议。但是,我是一个完全的 JSP 新手……你能帮我解决另一部分吗?你是说你把你的 SWF html 包装器变成了一个 JSP 页面吗?或者您是否将 javascript 放在调用 JSP 页面的 html 包装器中?它是如何工作的?
    • 正如你所说。我已将 FlexBuilder 生成的 index.html 中包含的所有 html 代码移动到 JSP 页面中,这得益于 JSP 技术提供的所有动态内容。如果您可以指定您计划如何部署您的应用程序,我们可以找出专门满足您需求的东西。
    • 我们在 Jetty 或 Tomcat 中进行生产部署(不过,Websphere 和 JBoss 在待办事项列表中)。当使用应用服务器时,这种方法会很好用。我也可以通过 flashvars 传递端口号,而不是推断它,这样我就可以插入我的 CharlesPoxy 进行调试。我无法克服的主要问题是,当 Flexmojos 与独立播放器一起运行我的 Flexunit 集成测试时,它将如何与 Flexmojos 一起工作。在这种情况下,我不知道如何处理 flashvars。有任何想法吗?还是你不这样做?
    • 不幸的是,我没有在独立播放器上测试我的应用程序(我使用 FlexBuilder 的 Tomcat 插件来自动部署我的应用程序),所以我无法帮助您。考虑到 Tomcat 或 Jetty 并且不了解 JSP 意味着您的 Flex 应用程序应该是您的应用程序的主要和唯一的一部分。如果这是真的,那么 JSP 应该足以满足您的需求。只需将您的 index.html 更改为 index.jsp,阅读一些有关 scriptlet(或 EL,如果您喜欢“坏习惯”的东西)并将您获得的新知识与上面的代码一起使用 :)
    • @2DH - 还有一个问题。这如何与 Flash Builder 调试器一起工作?这意味着您使用哪种启动配置来调试 Flex 应用程序。目前,我真的很喜欢编辑代码并在我整天运行的 Java 服务器上快速启动应用程序。似乎这种方法需要我在启动调试器之前重建和重新部署 WAR 文件。这对你有什么作用?
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多