首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ColdFusion应用程序数据源属性在CFM模板中不可访问

问ColdFusion应用程序数据源属性在CFM模板中不可访问
EN

Stack Overflow用户
提问于 2022-02-05 19:03:24
回答 1查看 159关注 0票数 2

下面是在一个ColdFusion 2018服务器上运行的(如果这是一个特定于版本的问题)。

我正在onApplicationStart() LifeCycle处理程序中设置Application属性,但是在CFM模板中不能访问该数据源属性。

我认为这可能与this作用域在onApplicationStart()方法中的处理方式有关,但我不确定。我尝试使用this.datasource和Application.datasource设置数据源属性,但在CFM模板中都无法访问它。

Application.cfc

代码语言:javascript
复制
// The usual App config stuff here... (omitted for brevity) 

// Instantiate Instance of Java System Object used to set System Env Vars
this.System = createObject("java", "java.lang.System");

// Include Config files
include "resources/config/AppSettings.cfm";
include "resources/config/onApplicationStart.cfm";

AppSettings.cfm

代码语言:javascript
复制
if (! isDefined(this.System.getProperty("DB_DSN_CREATED")))
{
    // Code to read values from .env file here ... (omitted for brevity) 

    // Set System Env Vars
    this.System.setProperty("DB_USER_NAME",     "DB USERNAME FROM .ENV FILE HERE");
    this.System.setProperty("DB_USER_PASSWORD", "DB PASSWORD FROM .ENV FILE HERE");
}

onApplicationStart.cfm

代码语言:javascript
复制
if (! isDefined(this.System.getProperty("DB_DSN_CREATED")))
{
    this.datasources = {MY_DSN = { PROPS FOR DB CONNECTION HERE }};

    // *** NOTE: This is the Property that isn't accessible in the CFM Template
    //           I also tried Application.datasource, but that didn't work either
    this.datasource = "MY_DSN";

    this.System.setProperty("DB_DSN_CREATED", true);
}

db-test.cfm

代码语言:javascript
复制
<cfscript>
    variables.appInstance = createObject('component', 'Application');

    variables.sql = "SQL STATEMENT HERE";
    variables.sqlParams = {};

    // *** NOTE: variables.appInstance.datasource below isn't accessible 
    //           I also tried Application.datasource but that didn't work either
    variables.sqlResult = queryExecute(variables.sql, variables.sqlParams, {datasource = variables.appInstance.datasource});

    writeDump(variables.sqlResult);
</cfscript>

有人看到我错过了什么吗?谢谢您的指导!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-07 03:25:30

考虑到这一点,我怀疑您可能误解了Application.cfc的this作用域的操作方式。简单回答:this不是持久化的,就像application作用域一样,因为组件在每个请求上都会被实例化

来自

当ColdFusion收到请求时,实例化应用程序CFC并运行Application.cfc代码.

你的代码实际上起作用了。至少在include调用时成功地更改了this.datasource的值的意义上是如此。但是,由于每个请求都会重新实例化Application.cfc,所以组件的this作用域也会被重新创建。本质上消除了以前在OnApplicationStart()中所做的任何更改。这就是为什么当代码实际赋值时,它似乎从未分配数据源值。

总之,Application.cfc的this作用域并不打算以这种方式使用。

测试用例

FWIW,您可以使用下面的测试文件看到实际的行为。只需在浏览器中加载test.cfm (至少两次),然后检查日志。输出显示一个值分配给this.datasource,这是应用程序第一次请求test.cfm时。但是,该值在下一个http请求中消失,因为CF创建了一个新的Application.cfc实例。

Application.cfc

代码语言:javascript
复制
component 
{
    this.name = "myApp_0001";

    function onApplicationStart(){
        writeLog("onApplicationStart()");
        writeLog(serializeJSON({"name": this.name, "datasource": this?.datasource?: "" }));
        include "onApplicationStart.cfm";
    }
    function onRequestStart( string targetPage ) {
        writeLog("onRequestStart()");
        writeLog(serializeJSON({"name": this.name, "datasource": this?.datasource?: "" }));
    }

}

OnApplicationStart.cfm

代码语言:javascript
复制
<cfscript>
    writeLog("onApplicationStart.cfm");
    writeLog(serializeJSON({"name": this.name, "datasource": this?.datasource?: "" }));
    
    writeLog("Assigning this.datasource");
    this.datasource = "MY_DSN";
    
    writeLog("Post Assign this.datasource");
    writeLog(serializeJSON({"name": this.name, "datasource": this?.datasource?: "" }));
</cfscript>

test.cfm

代码语言:javascript
复制
<h3>Test.cfm <cfoutput>#now()#</cfoutput></h3>

结果:

代码语言:javascript
复制
Request #1 - this.Datasource gets assigned
[INFO ] ... - onApplicationStart()
[INFO ] ... - {""datasource"":"""",""name"":""myApp_0001""}
[INFO ] ... - onApplicationStart.cfm
[INFO ] ... - {""datasource"":"""",""name"":""myApp_0001""}
[INFO ] ... - Assigning this.datasource
[INFO ] ... - Post Assign this.datasource
[INFO ] ... - {""datasource"":""MY_DSN"",""name"":""myApp_0001""}
[INFO ] ... - onRequestStart()
[INFO ] ... - {""datasource"":""MY_DSN"",""name"":""myApp_0001""}

Request #2 - this.datasource is no longer assigned
[INFO ] ... - onRequestStart()
[INFO ] ... - {""datasource"":"""",""name"":""myApp_0001""}

Request #3 - this.datasource is no longer assigned
[INFO ] ... - onRequestStart()
[INFO ] ... - {""datasource"":"""",""name"":""myApp_0001""}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71001238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档