ColdFusion中的全局变量

Mar*_*art 2 coldfusion railo application.cfc coldfusion-10

2个问题 -

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

<cfset DSN = "dej6_42">
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试调整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>
Run Code Online (Sandbox Code Playgroud)

我试过了

<cfset This.DSN = "dej6_42">
Run Code Online (Sandbox Code Playgroud)

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

<cfoutput>#Applicaton.DSN#</cfoutput>
Run Code Online (Sandbox Code Playgroud)

我想从我的研究中我需要同时使用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>
Run Code Online (Sandbox Code Playgroud)

Ada*_*ron 5

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

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

所以要明确的是,设置应用程序范围的变量onApplicationStart将如此:

function onApplicationStart() {
    application.DSN = "dej6_42";
}
Run Code Online (Sandbox Code Playgroud)

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

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

您还应该阅读Application.cfc(以及方法参考).通常可能是CFC:使用ColdFusion组件 - 开发指南.

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