2010-12-10 30 views
2

Je cherche une approche qui me permette de transmettre (en quelque sorte) dynamiquement le nom du serveur, le port du serveur et le contexte web à mon client Flex afin qu'il puisse créer un ChannelSet pour c'est RemoteObjects à utiliser. Ces trois propriétés sont, bien sûr, facilement disponibles pour mon code côté serveur Java, donc j'ai juste besoin d'un moyen de les amener au client.Externalisation de la configuration du client ChannelSet pour l'application Web Flex/Java

Par défaut, Adobe says vous devez compiler votre application Flex par rapport au fichier de configuration du serveur "services-config.xml". C'est une pratique très inflexible que Spring says devrait être évitée (je suis d'accord). Un popular approach utilise le service http de Flex pour télécharger un fichier de configuration XML. J'aime cette idée, mais je ne veux pas coder en dur un fichier XML et le garder dans mon fichier WAR. Est-il possible de générer dynamiquement à partir du code Java?

Une autre idée que j'ai eu est d'utiliser les flashvars pour passer les propriétés de la page HTML contenant au fichier SWF. Mais encore une fois, je ne veux pas les coder en dur dans la page HTML. Existe-t-il un moyen (peut-être avec Javascript?) De définir dynamiquement la valeur de ceux-ci lorsque la page se charge?

Répondre

3

Voici comment je le fais. J'espère que vous trouverez utile:

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; 
} 

Donc, comme vous pouvez voir les seules choses que vous devez fournir sont la destination - qui doit être configuré en XML côté serveur et contextRoot - passé en flashVar. Passer comme flashVar dans mon cas (via JSP) ressemble à ceci:

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

Ceci est génial. Je comprends comment vous déduisez le nom d'hôte, le port et le protocole de Application.url. Cependant, je suis un débutant JSP total ... pouvez-vous m'aider avec l'autre partie? Êtes-vous en train de dire que vous avez transformé votre wrapper html SWF en une page JSP? Ou avez-vous mis javascript dans le wrapper html qui appelle une page JSP? Comment ça marche? – HDave

+0

C'est comme tu l'as dit. J'ai déplacé tout le code html contenu dans index.html généré par FlexBuilder dans une page JSP bénéficiant de tout le contenu dynamique fourni par la technologie JSP. Si vous pouviez spécifier comment vous envisagez de déployer votre application, nous pourrions trouver quelque chose de spécifique à vos besoins. – 2DH

+0

Nous faisons des déploiements de production dans Jetty ou Tomcat (Websphere et JBoss sont cependant sur la liste des tâches). Lorsque vous utilisez un serveur d'applications, cette approche fonctionne bien. Je pourrais également passer le numéro de port via flashvars plutôt que de l'inférer afin que je puisse insérer mon CharlesPoxy pour le débogage. La principale chose que je n'arrive pas à faire est de savoir comment cela fonctionnera avec Flexmojos quand il exécutera mes tests d'intégration Flexunit avec le lecteur autonome. Je ne sais pas comment gérer flashvars dans ce cas. Des idées? Ou ne faites-vous pas ça? – HDave