代码之家  ›  专栏  ›  技术社区  ›  richardtallent

ColdFusion静态密钥/值列表?

  •  2
  • richardtallent  · 技术社区  · 15 年前

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

    我想这可能是某种“结构”,但我 极其 新加入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;
    }
    

    当我调用这个函数时,我会返回:“element definedterms is undefined in application”。

    编辑: 强制调用onapplicationstart()有效,显然Cold Fusion的application.cfc与asp.net的web.config不同,更改它不会重置应用程序。

    4 回复  |  直到 13 年前
        1
  •  4
  •   John Whish    15 年前

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

    ColdFusion使用一个名为application.cfc的特殊文件,该文件放在Web应用程序的路径中(类似于ASP.NET中的global.asax)。它在中有一个名为onapplicationstart的方法,该方法仅在应用程序启动时执行(所以不是在每个请求时执行)。这是一个放置常数的好地方。下面是一个简单的示例,它使用{}语法设置结构(类似于其他语言中的映射):

    应用.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!

    • 约翰
        2
  •  1
  •   Leigh josh poley    15 年前

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

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

    一旦你做到了,并且做了本提到的一些改变。这个功能应该起作用。注意:如果使用cf8,则可以使用shorter<=和++运算符+

    <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>
    
        4
  •  0
  •   Ben Doom    15 年前

    不用看得太深,我发现:

    application.definedterms(thisdef).term
    

    应该是这样的:

    application.definedterms[thisdef].term
    

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

    推荐文章