首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ColdFusion Application.cfc -执行顺序

ColdFusion Application.cfc -执行顺序
EN

Stack Overflow用户
提问于 2012-08-13 14:19:12
回答 5查看 5.2K关注 0票数 9

我需要一个真实的检查--希望是一个解释(如果我的现实是错误的)。

CF应用程序框架评估事物的方式是这样(我的理解)-请求被传递给cfserver。

  • cf查找application.cfm或cfc (基于遍历规则)
  • application.cfc执行(如果找到)
  • 设置了--这个作用域(可以在这里设置一系列特定于应用程序的vars,但是

有些是必需的-例如"applicationTimeout“-然后一系列事件发生-and方法,如果需要的话。

-- onApplicationStart()

-onSessionStart()

-onRequestStart()

等。

所以我的问题

1)这种设置发生在每个页面请求上--在任何其他请求之前?

2)如果我在onApplicationStart()中设置了一个应用程序变量--它在此后发生的任何进程中都是可用的--并且应该在内存中保留applicationTimeout()的长度--对吗?

所以如果我做这种事..。

如果(定义为(“application.myvar”){ this.something = application.myvar;}

它应该在启动应用程序作用域的初始请求之后处理任何页面请求。

然而,它似乎并没有这样做。

我问的原因是-有一些有趣的应用程序杠杆设置,需要在这个范围内设置.其中一些可能是“密集的”(至少形成了对每个请求执行的角度--所以我只想做一次,用持久的mem设置一个结构,然后让这些结构可用)。

我是不是做错了什么假设?

thx

EN

回答 5

Stack Overflow用户

发布于 2012-08-14 09:21:37

ColdFusion Application.cfc文档拥有以下知识:

当请求执行时,ColdFusion按以下顺序运行CFC方法:

  1. onApplicationStart (如果没有在此应用程序之前运行)
  2. onSessionStart (如果未在此会话之前运行)
  3. onRequestStart
  4. onRequest/onCFCRequest
  5. onRequestEnd

onApplicationEnd、onSessionEnd和onError CFCs是由特定事件触发的。

总体请求顺序(至少)还有两个步骤。

0:在cfcomponent中执行不在cffunction中的所有代码 0.5:运行相当于创建应用程序的cfapplication标记

因此,你的问题的答案是:

  1. 如果在步骤0中设置了这些变量,那么是的。
  2. 对,是这样。
  3. 这取决于你在哪里设置变量。如果要更改的值列在应用变量文档页面上,则它们必须在步骤0中。在其他地方设置它们将更新this作用域,但不会在步骤0.5中生效。
票数 4
EN

Stack Overflow用户

发布于 2012-08-15 23:08:12

这里有两件事:代码何时运行,变量作用域何时可用,以及它们持续多长时间。

  • 代码与任何方法(即:“伪构造函数”)一起运行每个请求。显然,在CFC的这一部分中,代码的数量是最小的。
  • 各种事件处理程序中的代码按照事件处理程序名称的指示运行,例如:当应用程序启动时,onApplicationStart()代码只运行一次。同onSessionStart()一样,每个新会话只运行一次。

范围:

  • 此范围可在整个CFC中使用。行为与任何其他CFC中的这个作用域完全一样,除了一些这个作用域的变量有特殊的含义(如this.namethis.datasource等)。这些特殊意义的变量可以在相关处理程序中的每个会话或每个请求中更改,但似乎适用于整个系统(即:不适用于特定会话或进行设置更改的请求)。在普通的CFCs中,this作用域用于公开公共变量,但是由于没有Application.cfc的公共实例,除了进行这些特殊设置之外,没有必要使用this作用域。如果想让CFC中的所有方法都可以使用变量,可以像通常那样使用变量范围。与这里的建议相反,这个作用域变量与应用程序作用域变量不一样。
  • 请求范围在整个CFC (伪构造函数和方法)中也是可用的。这些也可以用于调用请求后面调用的模板的代码,就像任何其他请求范围内的变量一样。
  • 应用范围:在伪构造函数中不可用,即使在this.name设置完成之后。只有在onApplicationStart()中才可用,从那时起就可以使用了。
    • 会话范围:类似地,在伪构造函数或onApplicationStart()l中不可用,直到onSessionStart()才可用。

我在一篇博客文章(提供的测试代码) 到这里来中演示了这一点。它太长,不包括在这里,但上面的东西概括了它。

票数 3
EN

Stack Overflow用户

发布于 2012-08-14 11:50:15

请看评论,因为它会出现在下面的帖子工作,但它没有。如果转储此范围,则会显示新值,但它实际上不会更改任何应用程序设置。

您可以在任何地方更改任何应用程序设置;但是,由于伪构造函数每次请求页面时都会运行,因此需要在伪构造函数运行后不断更改设置。应用程序作用域在伪构造函数中不可用,因此您可以在onRequestStart或onRequest函数中这样做。我做了一个简单的测试,根据onRequestStart函数中的条件重新分配定制路径。您将注意到,当您第一次访问该页面时,自定义标记文件夹将是“定制标记”,附加请求将在侧边提示“someOtherCustomtagsFolder”,如果您的应用程序设置在每个用户的基础上发生更改,则您的全局应用程序设置将是触发器,并且可能会导致其他用户获取不正确设置的问题。

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11936210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档