如何从 ColdFusion 9 中的单独应用程序访问一个应用程序作用域



我对这个问题有自己的答案,我会发布,但我想看看我是否错过了更简单的方法。 我有两个应用程序在同一台 coldfusion 服务器上运行,我想从另一个访问一个应用程序的范围。 我该怎么做?

更新:

在阅读了@Daniel和@Ben的答案后,我回过头来从子应用程序的角度处理我的问题,事实证明这是解决我最初问题的更好解决方案。 我的答案仍然是访问其他应用程序范围的"快速而肮脏"的方式,但将数据放在服务器范围中是一种更好的做法。

我想你可能应该考虑一下为什么要这样做......从建筑上讲,这似乎不是很合理,即使这是可能的。服务器作用域更适合要在应用程序之间共享的资源。

您甚至可能需要考虑这两个应用程序是否实际上应该是一个具有两个小子应用程序的单个应用程序。

我从两个来源把我的答案放在一起。 首先,Ben Nadel对ColdFusion PageContext对象的大规模探索(感谢Ben)。 其次,ColdFusion 帮助页面关于与 JSP 页面和 servlet 的互操作。 把两者放在一起,我得到这个:

目录结构:

Root
 |_ App1
   |_ Application.cfc
   |_ index.cfm
 |_ App2
   |_ Application.cfc
   |_ index.cfm

App1/Application.cfc:

component
{
 this.name="App1";
 this.application.foo = "bar"
}

App2/Application.cfc:

component
{
 this.name="App2"
}

应用2/索引.cfm

<cfscript>
writeDump(getPageContext().getFusionContext().getServletContext().getAttribute('App1'))
</cfscript>

点击索引后.cfm在 App1 目录中,可以看到 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);

优势:

  • 更简单的语法
  • 共享数据可用于所有应用程序

  • 您必须记住在更新应用程序 scoe 时更新 server.sharedData 范围。
  • 请谨慎选择主结构键。 您不希望过度处理现有的服务器范围数据。
  • 共享数据可用于所有应用程序。 :-)

无论如何,这是我的第一个想法,但在阅读了@Ryan的回答后,我可能只是编写一个采用应用程序名称和 var 名称的 UDF,并将其用作他所做的事情的门面。

但说真的,考虑跨应用程序共享数据是否比合并它们更聪明/更明智。

ColdFusion 应用程序作用域由 ApplicationScopeTracker java 类处理。

可以访问其他应用的应用程序范围。

它是无文档记录的,我不会在生产中将其用于任何内容!

假设您有 2 个名称为 app1app2 的 Web 应用程序。

app1上运行以下命令以访问app2的应用程序范围:

<cfscript>
appTracker = createObject( 'java', 'coldfusion.runtime.ApplicationScopeTracker' );
app2 = appTracker.getApplicationScope('app2');
</cfscript>

如果app2应用程序尚未启动或超时,getApplicationScope()将返回 undefined。

还可以使用 appTracker.getApplicationKeys() 获取所有当前应用程序范围的枚举

相关内容

最新更新