2

我正在使用基于Application.cfm文件而不是Application.cfc文件的遗留应用程序工作。

处理请求后需要能够运行代码。(基本上,我想使用<cfhtmlhead>标签将一些 Javascript 和 CSS 文件注入到每个加载的文档中。在我使用 GreaseMonkey 用户脚本执行此操作之前,但最好是服务器端的。)

从我读到的内容来看,我认为我应该能够使用该onRequestEnd()功能来做到这一点,但是,我只见过关于Application.cfc文件的引用。我读过您可以将onRequestEnd.cfm文件与文件放在同一目录中Application.cfm以将其注册到onRequestEnd()函数中,但系统不会映射到一个Application.cfm文件(即我必须将此onRequestEnd.cfm文件放在很多目录中)。

还有其他方法可以onRequestEnd()使用Application.cfm设置注册此功能吗?以防万一,我们正在运行 Coldfusion 9。

4

2 回答 2

8

澄清一下,该onRequestEnd()方法仅在您使用该Application.cfc文件时可用。

OnRequestEnd.cfm文件确实像Application.cfmColdFusion 中的文件一样工作,它会自动查找它并在找到时处理它的内容。请注意,如果您的应用程序有 Application.cfc 文件,则不能使用 OnRequestEnd.cfm 页面。 因此,假设Application.cfc您的应用程序没有文件并且只使用Application.cfm文件,那么该OnRequestEnd.cfm文件应该适合您。您需要做的就是将您希望在页面请求之后执行的 CFML 代码插入到该文件中。

如果您有多个Application.cfm文件分布在不同的文件夹中,那么,是的,您还需要OnRequestEnd.cfm在这些目录中复制/创建文件。您可能能够复制那些目录中的存根 文件,这些目录除了您从另一个单一位置的实际代码OnRequestEnd.cfm之外什么也不做。cfinclude至少这样,一旦你有了所有的存根文件,你就可以在一个地方修改代码。

请参阅构建应用程序的文档(它是为 ColdFusion 8 编写的,但仍然适用相同的规则)。如果该页面被删除,以下是相关文本:

ColdFusion 如何查找和处理应用程序定义页面

ColdFusion 使用以下规则来定位和处理定义应用程序特定元素的 Application.cfc、Application.cfm 和 OnRequestEnd.cfm 页面。ColdFusion 定位这些文件的方式有助于确定您如何构建应用程序。

每次 ColdFusion 处理页面请求时,它都会执行以下操作:

  1. 当 ColdFusion 开始处理请求时,它会执行以下操作:

    • 它在页面目录中搜索名为 Application.cfc 的文件。如果存在,它会创建一个新的 CFC 实例,处理初始事件并停止搜索。(ColdFusion 为每个请求创建一个新的 CFC 实例并处理其初始化代码。)
    • 如果请求页面的目录没有 Application.cfc 文件,它会检查目录中的 Application.cfm 文件。如果存在,ColdFusion 逻辑上将 Application.cfm 页面包含在请求页面的开头并停止进一步搜索。
    • 如果请求页面的目录没有 Application.cfc 或 Application.cfm 文件,ColdFusion 会向上搜索目录树并首先检查每个目录中的 Application.cfc 文件,如果找不到,则查找 Application.cfm 页面, 直到到达根目录(如 C:)。当它找到 Application.cfc 或 Application.cfm 文件时,它会处理该页面并停止搜索。
  2. ColdFusion 处理请求页面的内容。
  3. 当请求结束时,ColdFusion 会执行以下操作:
    • 如果您有 Application.cfc,ColdFusion 将处理 CFC 的 onRequestEnd 方法并释放 CFC 实例。
    • 如果您没有 Application.cfc,但有 Application.cfm 页面,ColdFusion 会在与 ColdFusion 用于当前页面的 Application.cfm 页面相同的目录中查找 OnRequestEnd.cfm。ColdFusion 不会搜索该目录之外的内容,因此它不会运行驻留在另一个目录中的 OnRequestEnd.cfm 页面。此外,如果应用程序页面出现错误或异常,或者应用程序页面执行 cfabort 或 cfexit 标记,则 OnRequestEnd.cfm 页面不会运行。

以下规则确定 ColdFusion 如何处理应用程序页面和设置:

  • ColdFusion 只为每个请求处理一个 Application.cfc 或 Application.cfm 页面。如果 ColdFusion 页面具有指向附加 ColdFusion 页面的 cfinclude 标记,则当 ColdFusion 包含附加页面时,它不会搜索 Application.cfc 或 Application.cfm 页面。
  • 如果 ColdFusion 页面具有 cfapplication 标记,它首先处理任何 Application.cfc 或 Application.cfm,然后处理 cfapplication 标记。该标记可以覆盖应用程序文件中的设置,包括应用程序名称和由 cfapplication 标记属性设置的行为。
  • 您可以拥有多个使用相同应用程序名称的 Application.cfc 文件、Application.cfm 文件和 cfapplication 标记。在这种情况下,所有具有相同名称的页面共享相同的应用程序设置和应用程序范围,并且可以设置和获取此范围内的所有变量。ColdFusion 使用 cfapplication 标签或最近处理的文件的参数设置,如果设置(例如会话超时)在文件之间不同。

注意:如果您的应用程序在区分大小写的 UNIX 平台上运行,则必须将 Application.cfc、Application.cfm 和 OnRequestEnd.cfm 拼写为大写字母。

于 2013-03-15T15:37:45.527 回答
0

由于您使用的是 ColdFusion 9,因此升级到使用 Application.cfc 而不是试图弄清楚如何插入 OnRequestEnd.cfm 文件将是相当简单的。此外,将 Application.cfc 用于 Application.cfm 也有一些优势。

几个参考:

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=appFramework_15.html
http://forum.hostek.com/showthread.php?724-Converting-to-Application-cfc
http: //www.bennadel.com/blog/726-ColdFusion-Application-cfc-Tutorial-And-Application-cfc-Reference.htm

http://www.raymondcamden.com/index.cfm/2009/12/30/Best -of-CF9-Applicationcfc-Script-Template
http://cfruss.blogspot.com/2009/11/applicationcfc-reference-in-cfscript.html

于 2013-03-18T18:59:13.683 回答