1

我正在尝试将我支持的应用程序从 application.cfm 转换为 application.cfc。我遵循了 Ben Nadel 的ColdFusion Application.cfc 教程和 Application.cfc 参考,但我的页面无法访问 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>
4

5 回答 5

4

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

<cfapplicatin name="blah"...>

<cfset dsn = 'mydsn'/>

然后你就可以做到:

<cfquery datasource="#dsn#">

这种方法没有利用应用程序范围......它只是利用了您的 application.cfm 无论如何都会运行的事实。它实际上所做的是将变量放在变量范围内。因为 CF 总是首先检查“变量”范围,所以像 #dsn# 这样的东西可以工作——但这​​与应用程序范围不同。

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

<cffunction name="onRequest">
<cfset dsn = 'mydsn'/>
</cffunction>
于 2012-03-30T19:31:47.433 回答
3

这是意料之中的。要引用应用程序变量,您需要在它们前面加上 application。

于 2012-03-30T18:59:15.577 回答
2

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

<cfset APPLICATION.datasource = 'MyDSN'>

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

<cfset VARIABLES.DSN = APPLICATION.datasource>

然后,此查询将起作用:

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

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

<cfset THIS.datasource = 'MyDSN'>
于 2012-03-30T19:31:48.193 回答
1

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

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

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

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

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

于 2012-03-30T19:00:08.213 回答
0

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

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

于 2012-03-30T19:53:52.417 回答