2

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

我认为这可能是某种“结构”,但我对 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 在应用程序中未定义”。

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

4

3 回答 3

4

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

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

应用程序.cfc

<cf组件>
  <cffunction name="onApplicationStart">
    <!--- 在此处设置全局常量 --->
    <cfset application.foo = { a=1, b=2, c="我的字符串" }>
  </cf函数>
</cfcomponent>

如果你想从数据库中获取数据,这里有一个简单的方法(还有很多其他方法可能更好,但这应该让你开始!)

<cf组件>
  <cffunction name="onApplicationStart">
    <!--- 在此处设置全局常量 --->
    <cfset application.datasource = "mydsn">

    <cfquery name="qryConstants" datasource="#application.datasource#">
      选择键、值
      来自 tblConstants
    </cfquery>

    <cfset application.constants = {}>
    <cfloop query="qryConstants">
      <cfset application.constants[ qryConstants.key ] = qryConstants.value>
    </cfloop>
  </cf函数>

</cfcomponent>

至于替换字符串中的值,那么您可以执行以下操作:

一些脚本.cfm

<cfsavecontent 变量="somestring">
你好,${key1} 你好吗?我的名字是 ${key2}
</cfsavecontent>

<!--- 替换 ${key1} 和 ${key2} 标记 --->
<cfloop collection="#application.constants#" item="token">
  <cfset somestring = ReplaceNoCase( somestring, "${#token#}", application.constants[ token ], "all" )>
</cfloop>

<!--- 显示替换标记的字符串 --->
<cfoutput>#somestring#</cfoutput>

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

祝你好运,欢迎来到 ColdFusion!

  • 约翰
于 2010-04-19T20:15:16.070 回答
1

此外,修复 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>
于 2010-04-19T21:58:19.987 回答
0

不用看太深,我看到:

application.definedterms(thisdef).term

应该是这样的:

application.definedterms[thisdef].term

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

于 2010-04-19T20:48:38.043 回答