从application.cfm转换为application.cfc时无法访问变量

时间:2012-03-30 18:41:07

标签: coldfusion application.cfc

我正在尝试将我支持的应用程序从application.cfm转换为application.cfc。我关注了Ben Nadel的ColdFusion Application.cfc Tutorial And Application.cfc Reference,但是我的页面无法访问APPLICATION范围中的任何变量,而没有将APPLICATION.添加到变量中。作为旁注,此应用程序目前使用0 cfc。

这是我的application.cfc。

<cfcomponent displayname="Application" hint="Handle the application" output="true">

    <cfset THIS.Name = "AAS" />
    <cfset THIS.ApplicationTimeout = CreateTimeSpan( 0, 60, 0 , 0) />
    <cfset THIS.SessionManagement = true />
    <cfset THIS.setClientCookies = false />
    <cfset THIS.versionNum = '1'>
    <cfset THIS.genericUserID = 'o005265'>
    <cfset THIS.genericPassword = 'zo005265'>

    <cffunction 
        name="OnApplicationStart" 
        hint="Fires when the application is first created." 
        access="public" 
        output="false" 
        returntype="boolean">

       <cfset APPLICATION.aasURL = 'http://127.0.0.1:8500/aaas'>
       <cfset APPLICATION.dsn = 've0_aaas'>
       <cfset APPLICATION.aas_system = 'development (studio)'>

    <cfreturn true />
  </cffunction>
</cfcomponent>

基本上我只是复制了application.cfm页面中的内容,并认为它的工作原理相同。我猜我必须在某个地方调用它?这是我唯一能想到的。任何帮助都会很棒。

---编辑---

我在@EvikJames回答后添加了OnRequest和OnApplicationStart方法

<cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false" hint="Fires when the application is first created.">
    <!--- Return out. --->
    <cfset APPLICATION.aasURL = 'http://127.0.0.1:8500/aaas'>
    <cfset APPLICATION.datasource = 've0_aaas'>
    <cfset APPLICATION.aas_system = 'development (studio)'>
    <cfreturn true />
</cffunction>


<cffunction name="OnRequest" access="public" returntype="void" output="true" hint="Fires after pre page processing is complete.">
    <!--- Define arguments. --->
    <cfargument name="TargetPage" type="string" required="true">
    <!--- Include the requested page. --->
    <cfinclude template="#ARGUMENTS.TargetPage#" />

    <cfset VARIABLES.dsn = APPLICATION.dsn>
    <cfset VARIABLES.aasURL = APPLICATION.aasURL>
    <cfset VARIABLES.aas_system = APPLICATION.aas_system>
    <!--- Return out. --->
    <cfreturn />
</cffunction>

5 个答案:

答案 0 :(得分:4)

您并没有真正尝试使用“应用程序”变量(总是需要作用域)。我怀疑你的旧application.cfm页面有类似的东西。

<cfapplicatin name="blah"...>

<cfset dsn = 'mydsn'/>

然后你就能做到:

<cfquery datasource="#dsn#">

这种方法不能应用程序范围 ...它只是利用了application.cfm无论如何总是运行的事实。它实际上做的是将变量放在变量范围内。因为CF总是首先检查“变量”范围,所以你可以像#dsn#works一样 - 但这与应用程序范围不同。

要在Application.cfc中模仿这种行为(如建议的那样),你需要将你的变量放在“onRequest()”函数而不是“onApplicationstart()”函数中 - 就像这样:

<cffunction name="onRequest">
<cfset dsn = 'mydsn'/>
</cffunction>

答案 1 :(得分:3)

这是预期的。要引用应用程序变量,您需要在应用程序变量前加上它们。

答案 2 :(得分:2)

在onApplication start方法中,执行以下操作:

<cfset APPLICATION.datasource = 'MyDSN'>

在onRequest方法中,执行以下操作:

<cfset VARIABLES.DSN = APPLICATION.datasource>

然后,此查询将起作用:

<cfquery datasource="#dsn#">
// sql
</cfquery>

我应该补充一点,当你完全升级后,你可以删除上面的所有代码,只需设置默认数据源:

<cfset THIS.datasource = 'MyDSN'>

答案 3 :(得分:1)

如果变量在应用程序范围内,您将始终需要在.cfm页面中以这种方式识别它。如果使用不带范围前缀的变量名称,则不会查看应用程序范围。

如果要在application.cfc中声明可以在其他页面中没有应用程序范围的情况下访问的变量,只需在任何函数之外声明变量。

<component>
   <cfset this.name = "applicationName">
   <cfset otherVar = 'something'>
   <cfset otherVar2 = 'something else'>

   <cffunction name="onApplicationStart>.....</cffunction>
</component>

可以在所有.cfm页面上调用otherVar和otherVar2而不使用范围前缀。

答案 4 :(得分:0)

听起来你最初并没有使用应用程序作用域变量。如果变量最初不是“应用程序”的范围。然后他们只是在“变量范围”(我知道的令人困惑的措辞),这可以通过cfm页面命中和其他包含。在application.cfm和application.cfc之间移动时,这是一个很大的变化。一般的想法遵循包含CFM文件共享变量范围和CFC文件不包含的原则。

如果您需要进行的唯一更改是将#dsn#更改为#appplication.dsn#,那么只需执行此操作即可完成。 WinGrep甚至Notepad ++等工具可以在多个文件中查找和替换。