2

如果在我道歉之前有人问过这个问题,但没有一些帮助我无法获得足够的理解......

我有一个本地 ColdFusion9 应用程序,用于在带有 Apache 2 的 WinXP SP3 上运行开发和测试...

我在理解如何调用从应用程序的“THIS”范围传递到 onRequestStart() 方法的请求元素时遇到问题。

例如,我的 Application.cfc 在 'THIS' 中有以下内容......

<!--- MY 'THIS' Statements in Application.cfc --->

<cfscript>

/* define custom coldfusion mappings. Keys are mapping names, values are full paths  */
this.mappings = structNew();
this.mappings['/tags'] = ExpandPath('/cfdev/tags');

</cfscript>

在我的 Application.cfc 中,我在 onRequestStart() 函数中有以下内容......

<!--- Run before the request is processed --->
<cffunction name="onRequestStart" returnType="boolean" output="false">
    <cfargument name="thePage" type="string" required="true">
        <cfinclude template="#arguments.thePage#">

<!--- Lot's of onRequest statements and then ... --->

    <cfset request.mappings = #THIS.mappings#>

    <cfreturn true>
</cffunction>

现在......假设我有一个页面,我调用 <cfdump var="#request.mappings#"> ...

我收到一条错误消息

'在请求中未定义元素映射。' ...

但是,(这是我的困惑开始的地方)......如果我调用 <cfdump var="#request#"> 返回两个结构......第一个包含“cfdumpinited”的键,值为 'False' 和第二个是 structKey 'mappings',它包含另一个结构,其键为 '/tags',值为 'C:\vir_dir\CFDEV\tags',正如人们所期望的那样......

如果有人可以解释为什么请求成功但 request.mappings 失败了,因为我在这里有点迷茫...... ;-)

4

2 回答 2

1

遵循以下逻辑:

  1. 提出请求
  2. onRequestStart 运行
  3. 您明确包含请求的模板
  4. youTHEN 设置 request.mappings = this.mappings
  5. onrequeststart 完成
  6. 请求的模板执行

因此,如果您在请求的模板中有这个:

<cfdump var="#request.mappings#>

然后,当您在步骤 3 中包含该文件时... request.mappings 尚不存在(因为它们是在步骤 4 中创建的)。

但是,当您将其更改为:

<cfdump var="#request#>

然后没有错误情况,因此您的 CFINCLUDE 运行良好,但不输出任何内容(因为您在函数定义中有 output="false" 。

您看到的转储是来自 CF 执行请求模板(步骤 6)的转储,此时 request.mappings 存在。

老实说,我认为您将 onRequestStart() 与 onRequest() 混淆了。在 onRequest() 中可能会显式包含请求的模板,因为 onRequest() 会运行 INSTEAD 的 CF 自动运行请求的模板。通常不会在 onRequestStart() 中包含请求的模板,因为它最终会运行两次。

说得通?

于 2011-08-22T15:38:17.647 回答
0

我在这里聚会迟到了,可能缺少一个关键要素,但为什么不这样做:

application.mappings = structNew()

代替

this.mappings = structNew()

这样,您只需设置一次(在应用程序启动时),您可以在整个应用程序中访问它们,并且您没有在每个页面命中设置请求范围的额外开销。

于 2011-12-12T17:56:10.717 回答