2009-04-08 16 views
5

Çalışma zamanı sırasında etkin sunucu adresim, bağlantı noktası ve bağlamı esnek uygulamamdan almam gerekiyor. Oluşturma işlemimiz için karınca kullandığımız için, sunucu bağlantı bilgileri yapı özellikleri dosyamızda dinamik olarak belirtilir ve {server.name}, {server.port} ve {context.root} yer tutucuları, services-config dosyasında kullanılır. .xml dosya yerine gerçek değerler.Sunucu uç noktasını çalışan bir esnek uygulamada nasıl alabilirim?

Aynı makinede blazeDS sunucumuzla çalışan başka Java sunucularımız var ve sunucu uç noktası bilgilerini program aracılığıyla belirlemenin bir yolunu kullanmak istiyorum, böylece sunucu URL'sini bir XML dosyasına sabitlemem gerekiyor. şu anda yaptığımız şeydir).

Ben en azından bizim ana uygulama MXML dosyasına aşağıdaki ekleyerek bağlam kökü alabilirsiniz bulduk

:

<mx:Application ... > 
    <mx:HTTPService id="contextRoot" rootURL="@ContextRoot()"/> 
</mx:Application> 

Ancak, ben yine de sunucu adresi ve port alma bazı yolu gerekir ve -context-root = http://myserver.com:8080/mycontext vererek tüm adresi belirtirseniz, esnek uygulama http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf'a bağlanmayı dener, ki bu elbette tamamen yanlıştır. Bağlam kökü ve sunucu URL'sini belirtmenin uygun yolu nedir ve bunları uygulamalarımızdan nasıl alabilirim?

+0

Yani java servlet kullanarak ya da sadece HTTPService edilir? Tam olarak ne yaptığınızı ya da tam olarak ne yaptığınızı bilmiyorum, ancak uzak nesne ile, hepsi de services-config.xml dosyasını kullanmak veya derleyici seçeneklerine koymak yerine kod içinde de yapabilirsiniz. Detaylandırır mısın? –

+0

İkisini de kullanıyoruz. Bazı ek görevler için bir HTTP son noktamız ve ayrı bir Java servletimiz var. Uzak nesneleri kullanarak değiliz *; Tüm mesaj kullanımı Cairngorm üzerinden yapılır. –

cevap

3

Biz aşağıdaki yöntemleri sunan bir uygulama alt sınıfını kullanın:

/** 
    * The URI of the AMF channel endpoint. <br/> 
    * Default to #rootURI + #channelEndPointContext + #this.channelEndPointPathInfo 
    */ 
public function get channelEndPointURI() : String 
{ 
    return this.rootServerURI + (this.channelEndPointContext ? this.channelEndPointContext : "") + this.channelEndPointPathInfo 
} 

/** 
    * The root URI (that is scheme + hierarchical part) of the server the application 
    * will connect to. <br/> 
    * If the application is executing locally, this is the #localServerRootURI. <br/> 
    * Else it is determined from the application #url. <br/> 
    */ 
public function get rootServerURI() : String 
{ 
     var result : String = "" 
     if (this.url && (this.url.indexOf("file:/") == -1)) 
     { 
      var uri : URI = new URI(this.url) 
      result = uri.scheme + "://" + uri.authority + ":" + uri.port 
     } 
     else 
     { 
      result = this.localServerRootURI 
     } 

     return result 
} 

Bu genel uygulama (tipik "mycontext" channelEndPointContext, channelEndPointPathInfo ve localServerRootURI özelliklerini destekler ve "/ messagebroker/amf /" örneğinizde, uygulama Flex Builder ile yürütüldüğünde kullanılan yerel sunucu kökü, bu gibi durumlarda file:// URL).
Tam son nokta URI'sinin belirlenmesi daha sonraözelliğini kullanarak veya url uygulamasını kullanarak gerçekleştirilir; hizmetlerimiz uygulamanın SWF'sine hizmet veren aynı sunucu tarafından (yani, sizin davanızı anladığım kadarıyla) açık olduğu için uygulanır. .

Yani, örnekte, bir yazarsınız:

<SuperApplication ...> <!-- SuperApplication is the enhanced Application subclass --> 
    <mx:HTTPService id="myHTTPService" url="{this.channelEndPointURI}"/> 
</SuperApplication> 

buradan itibaren bir zamanda otomatik olarak bu örnekte görüldüğü gibi bunu hardcoding yerine uygulama URL'den channelEndPointContext belirleyebilir.

1

Neden location.hostname değerini döndürmek için ExternalInterface aracılığıyla sarmalayıcıda javascript işlevini çağırmıyorsunuz? ambalajında ​​

<mx:Script> 
    <![CDATA[ 
     private var hostname:String; 

     private function getHostName():void 
     { 
      hostname = ExternalInterface.call(getHostName); 
     } 
    ]]> 
</mx:Script> 

javascript:

<script type="text/javascript"> 
    function getHostName() 
    { 
     return location.hostname; 
    } 
</script> 
+1

Bu benim sorduğum şey değil. Ayrıca, bunu Application.application.url aracılığıyla kolayca ve dizeyi ayrıştırarak alabilirsiniz. –

2

Daha önce URL'leri başarıyla geçmek için FlashVars kullandım.esnek içinde

var rootURL = location.href.substring(0,location.href.indexOf("flexBin"));  
... 

AC_FL_RunContent(
    "src", "${swf}", 
    "FlashVars", "rootURL="+rootURL, 
    "width", "${width}", 
... 

Ve sonra: şablonunuzu html

service.rootURL = Application.application.parameters.rootURL; 

güzel bir şey gerçekten sunucudan bu şekilde ne gibi geçirebilirsiniz olduğunu.

1

Tüm bu zor işleri yapmanıza gerek yok. Sadece Flex çerçevesi kendisi tarafından sağlanan URLUtil kullanın;)

2
var url:String = (FlexGlobals.topLevelApplication as Application).url 
      //var fullURL:String = mx.utils.URLUtil.getFullURL(url, url); 

      var serverName:String = mx.utils.URLUtil.getServerNameWithPort(url); 
      listContents.url = mx.utils.URLUtil.getProtocol(url)+"://"+serverName+"/custom_message.html"; 
      //isSecure = mx.utils.URLUtil.isHttpsURL(url); 

      //pageURL = pageURL.substring(0, pageURL.indexOf("/")); 
      listContents.send(); 
İlgili konular