Как получить доступ к одной области приложения из отдельного приложения в ColdFusion 9? - PullRequest
7 голосов
/ 12 мая 2011

У меня есть свой ответ на этот вопрос, который я опубликую, но я хотел посмотреть, пропустил ли я более простой путь.У меня есть два приложения, работающие на одном сервере Coldfusion, и я хочу получить доступ к области приложения одного из другого.Как я могу это сделать?

ОБНОВЛЕНИЕ:

После прочтения ответов @Daniel и @ Ben я вернулся и подошел к своей проблеме с точки зрения подпрограмм, которые оказались лучшеРешение моей первоначальной проблемы.Мой ответ по-прежнему остается «быстрым и грязным» способом доступа к другим областям применения, но лучше поместить данные в область сервера.

Ответы [ 4 ]

7 голосов
/ 12 мая 2011

Думаю, вам следует подумать о том, почему вы хотите это сделать ... Архитектурно это не кажется очень здравым, даже если это возможно. Область Сервер будет лучше для ресурсов, которые вы хотите использовать в разных приложениях.

Возможно, вы даже захотите подумать, действительно ли два приложения должны быть одним приложением с двумя небольшими вложенными приложениями.

4 голосов
/ 12 мая 2011

Я собрал свой ответ из двух источников. Во-первых, Массивное исследование Бена Наделя объекта ColdFusion PageContext (Спасибо, Бен). Во-вторых, справочная страница ColdFusion на Взаимодействие со страницами и сервлетами JSP . Соедините их вместе, и я получу это:

Структура каталогов:

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

App2 / index.cfm

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

После нажатия на index.cfm в каталоге App1 вы можете увидеть область приложения из app1, выгруженную в индекс app2.

2 голосов
/ 12 мая 2011

Я полностью согласен с @Daniel по поводу архитектуры.
@ Райан хороший ответ.

Я подумал, что предложу альтернативу, о которой я думаю, которая имеет несколько преимуществ и несколько недостатков.

В принципе, любые данные, которые будут использоваться приложениями, могут быть записаны в область сервера. Например:

// 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);

Преимущества:

  • более простой синтаксис
  • общие данные доступны для всех приложений

Недостатки

  • Вы должны помнить, чтобы обновлять область server.sharedData каждый раз, когда обновляете приложение scoe.
  • будьте осторожны при выборе вашего основного ключа структуры. Вы не хотите перезаписывать существующие данные области сервера.
  • Общие данные доступны для всех приложений. : -)

В любом случае, это была моя первая мысль, но после прочтения ответа @ Райана я, вероятно, просто написал UDF, который принимает имя приложения и имя переменной, и использовал бы его как фасад для того, что он сделал.

А если серьезно, подумайте о том, является ли обмен данными между приложениями разумнее / мудрее, чем их объединение.

1 голос
/ 19 января 2012

Области применения ColdFusion обрабатываются Java-классом ApplicationScopeTracker.

Вы можете получить доступ к области приложения другого приложения.

Это недокументировано, и я бы не использовал его для производства!

Допустим, у вас есть 2 веб-приложения с именами app1 и app2.

Запустите это на app1 для доступа к области применения app2:

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

Если приложение app2 не запущено или истекло время ожидания, getApplicationScope() вернет неопределенное значение.

Вы также можете получить список всех текущих областей применения, используя appTracker.getApplicationKeys()

...