我需要一个真实的检查--希望是一个解释(如果我的现实是错误的)。
CF应用程序框架评估事物的方式是这样(我的理解)-请求被传递给cfserver。
有些是必需的-例如"applicationTimeout“-然后一系列事件发生-and方法,如果需要的话。
-- onApplicationStart()
-onSessionStart()
-onRequestStart()
等。
所以我的问题
1)这种设置发生在每个页面请求上--在任何其他请求之前?
2)如果我在onApplicationStart()中设置了一个应用程序变量--它在此后发生的任何进程中都是可用的--并且应该在内存中保留applicationTimeout()的长度--对吗?
所以如果我做这种事..。
如果(定义为(“application.myvar”){ this.something = application.myvar;}
它应该在启动应用程序作用域的初始请求之后处理任何页面请求。
然而,它似乎并没有这样做。
我问的原因是-有一些有趣的应用程序杠杆设置,需要在这个范围内设置.其中一些可能是“密集的”(至少形成了对每个请求执行的角度--所以我只想做一次,用持久的mem设置一个结构,然后让这些结构可用)。
我是不是做错了什么假设?
thx
发布于 2012-08-14 09:21:37
ColdFusion Application.cfc文档拥有以下知识:
当请求执行时,ColdFusion按以下顺序运行CFC方法:
onApplicationEnd、onSessionEnd和onError CFCs是由特定事件触发的。
总体请求顺序(至少)还有两个步骤。
0:在
cfcomponent中执行不在cffunction中的所有代码 0.5:运行相当于创建应用程序的cfapplication标记
因此,你的问题的答案是:
this作用域,但不会在步骤0.5中生效。发布于 2012-08-15 23:08:12
这里有两件事:代码何时运行,变量作用域何时可用,以及它们持续多长时间。
范围:
this.name、this.datasource等)。这些特殊意义的变量可以在相关处理程序中的每个会话或每个请求中更改,但似乎适用于整个系统(即:不适用于特定会话或进行设置更改的请求)。在普通的CFCs中,this作用域用于公开公共变量,但是由于没有Application.cfc的公共实例,除了进行这些特殊设置之外,没有必要使用this作用域。如果想让CFC中的所有方法都可以使用变量,可以像通常那样使用变量范围。与这里的建议相反,这个作用域变量与应用程序作用域变量不一样。this.name设置完成之后。只有在onApplicationStart()中才可用,从那时起就可以使用了。
我在一篇博客文章(提供的测试代码) 到这里来中演示了这一点。它太长,不包括在这里,但上面的东西概括了它。
发布于 2012-08-14 11:50:15
请看评论,因为它会出现在下面的帖子工作,但它没有。如果转储此范围,则会显示新值,但它实际上不会更改任何应用程序设置。
您可以在任何地方更改任何应用程序设置;但是,由于伪构造函数每次请求页面时都会运行,因此需要在伪构造函数运行后不断更改设置。应用程序作用域在伪构造函数中不可用,因此您可以在onRequestStart或onRequest函数中这样做。我做了一个简单的测试,根据onRequestStart函数中的条件重新分配定制路径。您将注意到,当您第一次访问该页面时,自定义标记文件夹将是“定制标记”,附加请求将在侧边提示“someOtherCustomtagsFolder”,如果您的应用程序设置在每个用户的基础上发生更改,则您的全局应用程序设置将是触发器,并且可能会导致其他用户获取不正确设置的问题。
<cfcomponent>
<!--- pseudo constructor --->
<cfset this.customtagpaths = expandPath('./customtags')>
<!--- onRequestStart --->
<cffunction name = "onRequestStart" returnType="void">
<cfif structKeyExists(application,'testSetting')>
<cfset this.customtagpaths = expandPath('./someOtherCustomtagsFolder')>
</cfif>
</cffunction>
<!--- onRequest --->
<cffunction name = "onRequest" returntype="void">
<cfargument name="targetPage" type="String" required = "true" />
<cfdump var = "#this#" label = "this">
<cfset application.testSetting = "foo">
<cfinclude template="#Arguments.targetPage#">
</cffunction>
</cfcomponent>https://stackoverflow.com/questions/11936210
复制相似问题