ColdFusion静态键/值列表?

时间:2010-04-19 19:23:17

标签: string coldfusion struct application.cfc

我有一个数据库表,它是定义术语的字典 - 键,值。我想从数据库中加载应用程序范围中的字典,并保持它的性能(它不会改变)。

我认为这可能是某种“结构”,但我非常是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 个答案:

答案 0 :(得分:4)

你问过很多单独的问题,但我会去回答它们!你还没有说过你正在使用什么版本的ColdFusion,所以我将回答使用适用于ColdFusion 8及更高版本的代码。

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

的Application.cfc

<cfcomponent>
  <cffunction name="onApplicationStart">
    <!--- set global constants here --->
    <cfset application.foo = { a=1, b=2, c="my string" }>
  </cffunction>
</cfcomponent>

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

<cfcomponent>
  <cffunction name="onApplicationStart">
    <!--- set global constants here --->
    <cfset application.datasource = "mydsn">

    <cfquery name="qryConstants" datasource="#application.datasource#">
      select key, value
      from tblConstants
    </cfquery>

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

</cfcomponent>

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

somescript.cfm

<cfsavecontent variable="somestring">
Hello, ${key1} how are you? My name is ${key2} 
</cfsavecontent>

<!--- replace the ${key1} and ${key2} tokens --->
<cfloop collection="#application.constants#" item="token">
  <cfset somestring = ReplaceNoCase( somestring, "${#token#}", application.constants[ token ], "all" )>
</cfloop>

<!--- show the string with tokens replaced --->
<cfoutput>#somestring#</cfoutput>

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

祝你好运,欢迎来到ColdFusion!

  • 约翰

答案 1 :(得分:1)

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

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

一旦你做完了,并做了一些Ben提到的改变。该功能应该有效。注意:如果使用CF8 +

,则可以使用较短的&lt; =和++运算符
<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>

答案 2 :(得分:0)

答案 3 :(得分:0)

如果不深入,我会看到这一点:

application.definedterms(thisdef).term

应该是这样的:

application.definedterms[thisdef].term

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