首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请求“THIS”的Application.cfc元素

请求“THIS”的Application.cfc元素
EN

Stack Overflow用户
提问于 2011-07-23 20:31:25
回答 2查看 433关注 0票数 2

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

我有一个本地ColdFusion9应用程序,用于在WinXP SP3上使用Apache2进行开发和测试.

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

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

代码语言:javascript
复制
<!--- 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()函数中有以下内容.

代码语言:javascript
复制
<!--- 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>

现在..。。如果我有一页我打电话给..。

我收到一个错误声明

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

然而,(这是我困惑的开始).如果我打电话给两个结构.第一个包含一个值为'False‘的"cfdumpinited“键,第二个包含structKey’映射‘,其中包含另一个结构,其键为’/tag‘,值为'C:\vir_dir\CFDEV\tags’,正如人们所期望的.

如果有人能解释一下为什么这个请求成功了,但request.mappings却失败了,因为我有点陷入困境.-)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-22 15:38:17

遵循逻辑,通过:

请求是made

  • onRequestStart运行

  • ,您显式地包含模板requested

  • youTHEN set request.mappings = this.mappings

  • onrequeststart完成

  • ,请求的模板执行

因此,如果您在所请求的模板中包含了以下内容:

代码语言:javascript
复制
<cfdump var="#request.mappings#>

当你在第三步包括那个文件的时候.request.mappings还不存在(因为它们是在步骤4中创建的)。

但是,当您将其更改为:

代码语言:javascript
复制
<cfdump var="#request#>

然后没有错误条件,所以您的CFINCLUDE运行良好,但没有输出任何内容(因为函数定义上有output="false“。

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

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

讲得通?

票数 1
EN

Stack Overflow用户

发布于 2011-12-12 17:56:10

我在这里的聚会迟到了,可能错过了一个关键的因素,但为什么不这样做呢:

application.mappings = structNew()

而不是

this.mappings = structNew()

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6803129

复制
相关文章

相似问题

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