ColdFusion中的全局变量

时间:2015-08-21 01:49:01

标签: coldfusion coldfusion-10 railo application.cfc

2个问题 -

在application.cfm中的CF8中,我设置了一个全局变量 像这样

<cfset DSN = "dej6_42">

我现在正在尝试调整CF10 / Lucee中的Application.cfc,并且无法弄清楚如何设置这个相同的变量。

这是我目前的Application.cfc

<cfcomponent output="false"> 

    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">

    <cfset DSN = "dej6_42">
</cfcomponent>

我试过了

<cfset This.DSN = "dej6_42">

然后尝试在单独的页面中调用

<cfoutput>#Applicaton.DSN#</cfoutput>

我认为从我的研究中我需要同时使用application.cfc和application.cfm来完成上述工作。 *编辑 - 我试图在application.cfc文件的末尾添加一个include到applciation.cfm,但它没有用。

2问题。 当我在Application.cfc中放置任何标准函数时,我的网站将变为空白页

这是Application.cfc - 如果我删除DSN集下面的所有内容,那么它将显示该网站。

<cfcomponent output="false"> 

    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">

    <cfset DSN = "dej6_42">

    <cffunction name="onApplicationStart"> 

    </cffunction> 

    <cffunction name="onApplicationEnd"> 

    </cffunction> 


    <cffunction name="onRequestStart">  

    </cffunction> 

    <cffunction name="onRequest"> 

    </cffunction> 


    <cffunction name="onRequestEnd"> 

    </cffunction> 

    <cffunction name="onSessionStart"> 

    </cffunction> 

    <cffunction name="onSessionEnd"> 

    </cffunction> 

    <cffunction name="onError"> 

    </cffunction> 



</cfcomponent>

2 个答案:

答案 0 :(得分:5)

您的示例未设置全局变量。它在变量范围中设置变量:任何基于CFC的代码都不能访问它,也不能在请求中使用任何自定义标记。它只能在Application.cfm,请求的文件,它包含的文件和OnRequestEnd.cfm

中提供。

Application.cfc是一个CFC(陈述显而易见的),因此在其中设置的变量范围变量仅在其中可用。如果要设置应用程序范围的变量,则需要将其放在应用程序范围内。应用程序范围变量应在onApplicationStart)处理程序中设置,该处理程序在应用程序启动时运行一次,但不在每个请求上运行。通过比较,每个请求都会运行Application.cfm(名称错误)。它应该被称为OnRequestStart.cfm。

所以要明确的是,在onApplicationStart中设置应用程序范围的变量就是这样:

function onApplicationStart() {
    application.DSN = "dej6_42";
}

如果您使用onRequest()拦截器,并且在include最初请求的文件中,则请求将在Application.cfc实例的上下文中运行,并且变量设置在{{1其他主线请求代码可以使用,就像在Application.cfm中设置变量的方式一样。但从语义上讲,如果你的意思是在应用程序的生命周期中存在一个变量(比如DSN),那么将它放在应用程序范围内是最好的选择。

对我来说,从您的问题可以看出您的应用程序架构可能在20世纪90年代萎靡不振。我认为您应该阅读使用框架(例如:FW/1ColdBox)以便以可维护和可扩展的方式更好地组织代码。

另外,您应该阅读Application.cfc(和method reference)。通常可能是CFC:Using ColdFusion components-Developing guide

您也可能想要考虑现代化编写CFML的方法,并为视图代码备份标记,否则使用脚本。它使您和其他开发人员更容易理解代码,如果整个应用程序没有使用标签混乱,他们可能最终需要维护它。

答案 1 :(得分:3)

您需要将其设置为应用程序范围

<cfcomponent output="false"> 
  <cfset This.name = "My Application"> 
  <cfset This.clientmanagement="True"> 
  <cfset This.loginstorage="Session"> 
  <cfset This.sessionmanagement="True"> 
  <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
  <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">
  <cfset application.DSN = 'dej6_42'>
</cfcomponent>