2009-04-08 11 views
5

मुझे अपने फ्लेक्स एप्लिकेशन से रनटाइम के दौरान सक्रिय सर्वर पता, पोर्ट और संदर्भ प्राप्त करने का एक तरीका चाहिए। चूंकि हम अपनी निर्माण प्रक्रिया के लिए चींटी का उपयोग कर रहे हैं, इसलिए सर्वर कनेक्शन जानकारी गतिशील रूप से हमारे निर्माण गुण फ़ाइल में निर्दिष्ट है, और {server.name}, {server.port} और {context.root} प्लेसहोल्डर सेवाओं-कॉन्फ़िगरेशन में उपयोग किए जाते हैं वास्तविक मूल्यों के बजाय .xml फ़ाइल।मैं चल रहे फ्लेक्स एप्लिकेशन में सर्वर एंडपॉइंट कैसे प्राप्त करूं?

हमारे पास कुछ अन्य जावा सर्लेट्स हैं जो हमारे ब्लेज़डीएस सर्वर के समान मशीन पर चल रहे हैं, और मैं प्रोग्राम अंततः सर्वर एंडपॉइंट जानकारी निर्धारित करने के लिए कुछ तरीका चाहता हूं इसलिए मुझे सर्वलेट यूआरएल को एक्सएमएल फ़ाइल में हार्डकोड करने की आवश्यकता नहीं है (जो हम वर्तमान में कर रहे हैं)।

मैं ने पाया है कि मैं कम से कम हमारे मुख्य आवेदन MXML फ़ाइल में निम्न जोड़कर संदर्भ जड़ प्राप्त कर सकते हैं:

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

हालांकि, मैं अभी भी सर्वर पता और पोर्ट प्राप्त करने में कठिनाई का किसी तरह की जरूरत है, और अगर मैं -context-root = http://myserver.com:8080/mycontext देकर पूरा पता निर्दिष्ट करता हूं, तो फ्लेक्स एप्लिकेशन http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf से कनेक्ट करने का प्रयास करता है, जो बिल्कुल बिल्कुल गलत है। संदर्भ रूट और सर्वर यूआरएल निर्दिष्ट करने का सही तरीका क्या है, और मैं उन्हें अपने आवेदन से कैसे प्राप्त कर सकता हूं?

+0

तो तुम जावा सर्वलेट का उपयोग कर या बस httpservice कर रहे हैं? मुझे यकीन नहीं है कि मैं आपके प्रश्न का ठीक से पालन कर रहा हूं या आप वास्तव में क्या कर रहे हैं, लेकिन रिमोट ऑब्जेक्ट के साथ, आप सेवाओं-config.xml फ़ाइल का उपयोग करने या इसे कंपाइलर विकल्पों में रखने के बजाय कोड में भी ऐसा कर सकते हैं। क्या आप विस्तार से समझा सकते हैं? –

+0

हम दोनों का उपयोग कर रहे हैं। हमारे पास कुछ अतिरिक्त कार्यों के लिए HTTP एंडपॉइंट और अलग जावा सर्वलेट हैं। हम * दूरस्थ * वस्तुओं का उपयोग नहीं कर रहे हैं; केर्न्गर्म के माध्यम से सभी संदेश हैंडलिंग किया जाता है। –

उत्तर

3

हम एक आवेदन उपवर्ग कि निम्न विधियों प्रदान करता है का उपयोग करें:

/** 
    * 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 
} 

यह सामान्य आवेदन channelEndPointContext, channelEndPointPathInfo और localServerRootURI गुण (आमतौर पर "mycontext" और समर्थन करता है आपके संदेश में "/ messagebroker/amf /", जब स्थानीय फ्लेक्स बिल्डर के माध्यम से एप्लिकेशन निष्पादित किया जाता है तो स्थानीय सर्वर रूट का उपयोग किया जा रहा है, ऐसे मामलों में इसमेंहैयूआरएल)।
पूर्ण एंडपॉइंट यूआरआई का निर्धारण तब localServerRootURI संपत्ति का उपयोग करके या url का उपयोग करके किया जाता है क्योंकि हमारी सेवाओं को उसी सर्वर द्वारा उजागर किया जाता है जो एप्लिकेशन के एसडब्ल्यूएफ (जहां तक ​​मैं आपके मामले को भी समझता हूं) ।

तो, अपने उदाहरण में, एक ने लिखा है:

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

यहाँ से शुरू करते हुए एक भी स्वतः आवेदन URL से channelEndPointContext निर्धारित कर सकते हैं यह हार्डकोड के रूप में इस उदाहरण में दिखाया गया के बजाय।

1

स्थान इंटरनेशनलफेस के माध्यम से रैपर में जावास्क्रिप्ट फ़ंक्शन को क्यों नहीं रखा जाता है .होस्टनाम का मान वापस करने के लिए?

आवरण में
<mx:Script> 
    <![CDATA[ 
     private var hostname:String; 

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

जावास्क्रिप्ट:

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

यही वह नहीं है जो मैं पूछ रहा हूं। इसके अलावा, आप इसे application.application.url के माध्यम से आसानी से प्राप्त कर सकते हैं और स्ट्रिंग को पार्स कर सकते हैं। –

1

आप BrowserManager का उपयोग यूआरएल के बारे में जानकारी प्राप्त करने के लिए कर सकते हैं।

var bm:IBrowserManager = BrowserManager.getInstance(); 
bm.init(Application.application.url); 
var url:String = bm.base; 

यह भी देखना http://livedocs.adobe.com/flex/3/html/deep_linking_7.html#251252

2

मैंने फ्लैशवर्स का सफलतापूर्वक पहले यूआरएल पास करने के लिए उपयोग किया है।

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

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

और फिर फ्लेक्स में: अपने टेम्पलेट html में

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

अच्छी बात यह है कि आप वास्तव में जो कुछ भी आप सर्वर से इस तरह की तरह में पारित कर सकते हैं है।

1

इन सभी कड़ी मेहनत करने की कोई आवश्यकता नहीं है। बस फ्लेक्स ढांचे से ही प्रदान की URLUtil का उपयोग करें;)

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(); 
संबंधित मुद्दे