Coldfusion 从application.cfm转换为application.cfc时无法访问变量
我正在尝试将我支持的应用程序从application.cfm转换为application.cfc。我遵循了Ben Nadel的方法,但我的页面无法访问应用程序范围中的任何变量,除非在变量中添加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
应用程序。
。作为旁注,此应用程序当前使用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,您可以设置一个默认数据源,如下所示:您将