如果在我道歉之前已经问过这个问题,但是如果没有一些帮助我就无法获得足够的理解......
我有一个本地ColdFusion9应用程序,用于在Apache 2上运行WinXP SP3的开发和测试......
我在理解如何调用从Application的'THIS'范围传递的请求元素到onRequestStart()方法时遇到了什么问题。
例如,My 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>
现在......假设我有一个我打电话的页面&lt; cfdump var =“#request.mappings#”&gt; ......
我收到错误说明
'REQUEST中未定义元素映射。' ...
然而,(这是我的困惑开始的地方)......如果我打电话给&lt; cfdump var =“#request#”&gt;返回两个结构...第一个包含“cfdumpinited”键,值为“False”,第二个包含structKey'mappings',其中包含另一个结构,其键为'/ tags',值为'C :\ vir_dir \ CFDEV \ tags'正如人们所期望的那样......
如果有人可以解释为什么请求成功请求。映射失败,因为我在这里的树林里......; - )
答案 0 :(得分:1)
遵循逻辑:
所以如果你在要求的模板中有这个:
<cfdump var="#request.mappings#>
然后,当您在步骤3中包含该文件时... request.mappings尚不存在(因为它们是在步骤4中创建的)。
但是,当您将其更改为:
<cfdump var="#request#>
然后没有错误条件,所以你的CFINCLUDE运行正常,但是没有输出任何东西(因为你在函数定义上有输出=“false”。
您看到的转储是来自CF执行所请求模板的转储(步骤6),此时request.mappings存在。
老实说,我认为你在onRequestStart()上混淆onRequest()。在onRequest()中,可以明确地包含所请求的模板,因为onRequest()运行自动运行所请求模板的CF的INSTEAD。一般不会在onRequestStart()中包含请求的模板,因为它最终会运行两次。
有意义吗?
答案 1 :(得分:0)
我来这里参加聚会,可能会错过一个关键因素,但为什么不这样做:
application.mappings = structNew()
而不是
this.mappings = structNew()
通过这种方式,您只需设置一次(在应用程序启动时),您可以在整个应用程序中访问它们,并且您没有额外的开销来设置每个页面命中的请求范围。