我正在尝试将我支持的应用程序从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>
答案 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 ++等工具可以在多个文件中查找和替换。