我對這個問題有我自己的答案,我將發佈,但我想看看我是否錯過了一個更簡單的方法。我有兩個應用程序在同一個Coldfusion服務器上運行,我想從另一個應用程序範圍訪問它。我該怎麼做?如何在ColdFusion 9中從單獨的應用程序訪問一個應用程序範圍?
UPDATE:
後讀@Daniel和@本的答案,我回去,並從裏面竟然是一個更好的解決方案,我最初的問題的子應用的角度走近我的問題。我的答案仍然是訪問其他應用程序範圍的「快速和骯髒」方式,但將數據放入服務器範圍是一種更好的做法。
我對這個問題有我自己的答案,我將發佈,但我想看看我是否錯過了一個更簡單的方法。我有兩個應用程序在同一個Coldfusion服務器上運行,我想從另一個應用程序範圍訪問它。我該怎麼做?如何在ColdFusion 9中從單獨的應用程序訪問一個應用程序範圍?
UPDATE:
後讀@Daniel和@本的答案,我回去,並從裏面竟然是一個更好的解決方案,我最初的問題的子應用的角度走近我的問題。我的答案仍然是訪問其他應用程序範圍的「快速和骯髒」方式,但將數據放入服務器範圍是一種更好的做法。
我認爲你應該考慮一下爲什麼你要這樣做......從結構上來說,這看起來不是很健全,即使這是可能的。服務器範圍對於希望跨應用程序共享的資源會更好。
您甚至可能想要考慮兩個應用程序是否應該實際上是具有兩個小型子應用程序的單個應用程序。
我把兩個來源的答案放在一起。首先,Ben Nadel的ColdFusion PageContext對象的Massive Exploration(謝謝Ben)。其次,關於Interoperating with JSP pages and servlets的ColdFusion幫助頁面。把這兩者結合起來,我得到這個:
目錄結構:
Root
|_ App1
|_ Application.cfc
|_ index.cfm
|_ App2
|_ Application.cfc
|_ index.cfm
應用1 /的Application.cfc:
component
{
this.name="App1";
this.application.foo = "bar"
}
應用2 /的Application.cfc:
component
{
this.name="App2"
}
應用2 /index.cfm
<cfscript>
writeDump(getPageContext().getFusionContext().getServletContext().getAttribute('App1'))
</cfscript>
點擊App1目錄中的index.cfm後,您可以看到從app1轉儲到app2索引中的應用程序範圍。
我完全同意@Daniel關於這個架構。
@ Ryan的回答是一個很好的答案。
我以爲我會提供我認爲的選擇,它有幾個優點和一些缺點。
基本上,任何要在應用程序之間共享的數據都可以寫入服務器範圍。例如:
// In App 1
application.foo = "bar";
server.sharedData.app1.fpp = "bar";
// In App 2
application.bar = "foo";
server.sharedData.app2.bar = "foo";
// Use shared data from App 1
writeOutput(server.sharedData.app1.foo);
優點:
缺點
無論如何,這是我的第一個想法,但讀@瑞安的回答後,我probaly只寫一個UDF,它接受一個應用程序名稱和變數名稱,並把它作爲一個門面爲他沒有。
但嚴重的是,考慮跨應用程序共享數據是否比合並它們更聰明/更明智。
這是一個很好的解決方案,謝謝你的例子。在我的特殊情況下,我對設置服務器範圍變量很謹慎,因爲我幾乎無法控制服務器,但對於有此控制權的人來說,這是一個很好的解決方案。我喜歡把它放在幕後,我必須在我的應用程序中實現它。 – 2011-05-12 16:14:32
ColdFusion應用程序範圍由ApplicationScopeTracker java類處理。
您可以訪問另一個應用程序的應用程序範圍。
這是無證的,我不會用它來生產任何東西!
假設您有2個網絡應用程序,名稱分別爲app1
和app2
。
運行該上app1
訪問app2
的應用範圍:
<cfscript>
appTracker = createObject('java', 'coldfusion.runtime.ApplicationScopeTracker');
app2 = appTracker.getApplicationScope('app2');
</cfscript>
如果app2
應用程序還沒有開始,或已超時,getApplicationScope()
將返回undefined。
您也可以使用appTracker.getApplicationKeys()
獲得當前所有應用範圍的枚舉當我有一個子應用程序,那麼它有它自己的應用範圍,我要實現相同的解決方案來訪問它。無論如何,這是我的經驗,當我有一個具有application.cfc的父文件夾和一個具有它自己的application.cfc的子文件夾。也許你可以發佈一個子應用程序共享父應用程序範圍的例子嗎? – 2011-05-12 15:15:19
我也應該說我想這樣做的原因是因爲我有一個應用程序使用來自另一個應用程序的服務。我需要從App2中的App1調用CFC,但是它們在App1範圍內而不是App2範圍內執行,就像它們在使用cfinvoke時直接執行或直接實例化它們一樣。 – 2011-05-12 15:20:01
這聽起來像是所有應用程序的候選人。完成共享應用程序範圍的一種方法是在包含每個應用程序的子目錄中使用擴展的application.cfc。應用程序可以有任何自定義app.cfc他們需要的東西,但仍應保持一個通用的應用程序範圍。 – 2011-05-12 16:47:24