【问题标题】:ColdFusion static key/value list?ColdFusion 静态键/值列表?
【发布时间】:2010-04-19 19:23:17
【问题描述】:

我有一个数据库表,它是一个定义术语的字典——键、值。我想从数据库中加载应用程序范围内的字典,并将其保留在那里以提高性能(它不会改变)。

我认为这可能是某种“结构”,但我对 ColdFusion(帮助另一个团队)非常陌生。

然后,我想对一些输出到浏览器的字符串做一些简单的字符串替换,循环遍历定义的术语并用一些 HTML 替换这些术语来定义术语(悬停或链接,详细信息后来才算出来,不重要)。

这是当前在 application.cfc 文件中的代码:

<cffunction name="onApplicationStart">
<cfquery name="qryDefinedTerms" datasource="mydsn">
       SELECT term, definition FROM definedterms
    </cfquery>
<cfset application.definedterms = Array(1)>
<cfloop query="qryDefinedTerms">
    <cfset myHash = structNew()>
    <cfset myHash.put("term", qryDefinedTerms.term)>
    <cfset myHash.put("definition", qryDefinedTerms.definition)>
    <cfset ArrayAppend(application.definedterms, myHash)>
</cfloop>
</cffunction>

调用页面尝试如下使用它:

function ReplaceDefinitions(inputstring) {
    for (thisdef = 1 ;
        thisdef LTE ArrayLen(application.definedterms);
        thisdef = (thisdef+1)) {
        inputstring = Replace(inputstring, 
           application.definedterms(thisdef).term, 
           application.definedterms(thisdef).definition, "ALL");
    }
    return inputstring;
}

当我调用该函数时,我返回:“元素 DEFINEDTERMS 在 APPLICATION 中未定义”。

编辑:强制调用 OnApplicationStart() 有效,显然 Cold Fusion 的 application.cfc 不像 ASP.NET 的 web.config,更改它不会重置应用程序。

【问题讨论】:

  • 可能是一个愚蠢的问题,但是自从添加了新代码后,您是否重新启动了应用程序?如果您只是修改了 application.cfc 而不重新启动,则不会创建该结构(因为 onApplicationStart 方法已经运行)。我之前遇到过几次。
  • 欺骗我来自 ASP.NET,我认为编辑 application.cfc 文件可以解决问题 - 特别是因为我对 application.cfc 所做的更改在它不编译时会抛出错误.如何重置应用程序? (我只有文件服务器访问服务器,没有访问 CF 管理工具。)

标签: string coldfusion struct application.cfc


【解决方案1】:

您提出了很多不同的问题,但我会尽力回答它们!您还没有说您使用的是什么版本的 ColdFusion,所以我将使用可在 ColdFusion 8 及更高版本中运行的代码来回答。

ColdFusion 使用一个名为 Application.cfc 的特殊文件,您将其放入 Web 应用程序的路由中(类似于 ASP.Net 中的 Global.asax)。它有一个名为 onApplicationStart 的方法,该方法仅在应用程序启动时执行(因此不是在每个请求上)。这是放置任何常量的好地方。下面是一个使用 {} 语法设置结构(如其他语言中的地图)的简单示例:

应用程序.cfc

函数>

如果您想从数据库中获取数据,这里有一个简单的方法(还有很多其他方法可能更好,但这应该可以帮助您入门!)


      选择键、值
      来自 tblConstants
    函数>

至于替换字符串中的值,你可以这样做:

somescript.cfm


你好,${key1} 你好吗?我的名字是 ${key2}
#somestring#

正如我所说,有很多方法可以解决您的问题,但希望您会发现这是一个很好的起点(尽管我还没有测试过!)。

祝你好运,欢迎来到 ColdFusion!

  • 约翰

【讨论】:

  • 我一定是在使用旧版本的 ColdFusion... 我得到了 Invalid token '{' 在线上的 cfset application.constants
  • 嗯,好的,您可以使用 SERVER.ColdFusion.ProductVersion 找出您正在使用的版本。您不能使用 CF8 之前的结构的简写语法,但您可以像这样创建它们: application.constants = StructNew();应用程序.constants.key1 = 123; application.constants.key2 = "ABC";
【解决方案2】:

另外,修复 Application.cfc 中的数组声明。它应该是 ArrayNew(1) 而不是 Array(1)。然后尝试重新初始化应用程序变量。一种方法是使用 cfinvoke:

<cfinvoke component="Application" method="OnApplicationStart" />

一旦你这样做了,并做出了 Ben 提到的一些改变。该功能应该可以工作。注意:如果您使用的是 CF8+,则可以使用较短的

<cfscript>
   // Added variable scoping
   function ReplaceDefinitions(inputstring) {
      var thisdef = "";
      var newString = arguments.inputstring;
       for (thisdef EQ 1 ; thisdef LTE ArrayLen(application.definedterms); thisdef = thisdef+1) {
           newString = Replace(   newString, 
                                application.definedterms[thisdef].term, 
                                application.definedterms[thisdef].definition, 
                                "ALL" );
       }   
       return newString;
   }
</cfscript>

【讨论】:

    【解决方案3】:

    不用看太深,我看到了:

    application.definedterms(thisdef).term
    

    应该是这样的:

    application.definedterms[thisdef].term
    

    在 CF(与许多语言一样)中,parens 表示函数调用,方括号表示数组引用。

    【讨论】:

    • 谢谢...已更正,但在上面的 ArrayLen() 调用上失败了。
    • 尝试将结构数组作为函数参数传递,而不是尝试从函数内调用应用程序范围。例如 ReplaceDefinitions(inputstring, definedterms) 和引用作为参数范围的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多