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

Coldfusion 从application.cfm转换为application.cfc时无法访问变量,coldfusion,application.cfc,Coldfusion,Application.cfc,我正在尝试将我支持的应用程序从application.cfm转换为application.cfc。我遵循了Ben Nadel的方法,但我的页面无法访问应用程序范围中的任何变量,除非在变量中添加应用程序。。作为旁注,此应用程序当前使用0 cfc 这是我的申请表 <cfcomponent displayname="Application" hint="Handle the application" output="true"> <cfset THIS.Name = "AA

我正在尝试将我支持的应用程序从application.cfm转换为application.cfc。我遵循了Ben Nadel的方法,但我的页面无法访问应用程序范围中的任何变量,除非在变量中添加
应用程序。
。作为旁注,此应用程序当前使用0 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 answer之后添加了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>


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

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

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

如果要在application.cfc中声明可以在其他页面中不使用应用程序作用域访问的变量,只需在任何函数之外声明变量即可

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

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


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

如果要在application.cfc中声明可以在其他页面中不使用应用程序作用域访问的变量,只需在任何函数之外声明变量即可

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

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


您并没有真正尝试使用“应用程序”变量(始终需要确定其作用域)。我怀疑你以前的application.cfm页面有类似的内容

<cfapplicatin name="blah"...>

<cfset dsn = 'mydsn'/>

然后你就能做到:

<cfquery datasource="#dsn#">

此方法不使用应用范围。。。这仅仅是利用了application.cfm始终运行这一事实。它实际做的是将变量放入变量范围。因为CF总是先检查“variables”范围,所以类似于#dsn#的工作原理-但这与应用程序范围不同

要在Application.cfc中模拟此行为(正如所建议的),您需要将变量放在“onRequest()”函数中,而不是放在“onApplicationstart()”函数中-如下所示:

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

您并没有真正尝试使用“应用程序”变量(始终需要确定范围)。我怀疑你以前的application.cfm页面有类似的内容

<cfapplicatin name="blah"...>

<cfset dsn = 'mydsn'/>

然后你就能做到:

<cfquery datasource="#dsn#">

此方法不使用应用范围。。。这仅仅是利用了application.cfm始终运行这一事实。它实际做的是将变量放入变量范围。因为CF总是先检查“variables”范围,所以类似于#dsn#的工作原理-但这与应用程序范围不同

要在Application.cfc中模拟此行为(正如所建议的),您需要将变量放在“onRequest()”函数中,而不是放在“onApplicationstart()”函数中-如下所示:

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

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

<cfset APPLICATION.datasource = 'MyDSN'>
<cfset VARIABLES.DSN = APPLICATION.datasource>

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

<cfset APPLICATION.datasource = 'MyDSN'>
<cfset VARIABLES.DSN = APPLICATION.datasource>

然后,此查询将工作:

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

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

<cfset THIS.datasource = 'MyDSN'>

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

<cfset APPLICATION.datasource = 'MyDSN'>
<cfset VARIABLES.DSN = APPLICATION.datasource>

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

<cfset APPLICATION.datasource = 'MyDSN'>
<cfset VARIABLES.DSN = APPLICATION.datasource>

然后,此查询将工作:

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

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

<cfset THIS.datasource = 'MyDSN'>

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


如果你要做的唯一改变就是将#dsn#更改为#appapplication.dsn#,那么就去做并完成它。有些工具,如WinGrep,甚至Notepad++都可以跨多个文件进行查找和替换。

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


如果你要做的唯一改变就是将#dsn#更改为#appapplication.dsn#,那么就去做并完成它。有一些工具,比如WinGrep甚至Notepad++可以跨多个文件进行查找和替换。

因此,每次我想使用
,我都必须将所有代码更改为
?这似乎不对。我必须检查每个使用
cfquery
标记的页面。我以前使用application.cfm时不必这样做的原因是application.cfm在每个页面请求上都运行?如果您使用的是CF9,您可以设置一个默认数据源,如下所示:您将