您不能完全按照您在示例代码中尝试的方式进行操作。不过,您有几个选择。
方法一:可远程访问的对象
将您的函数移动到 CFC 中,并通过 CFC 的 URL 访问它们。此访问方法要求函数使用权限属性access='remote' - 如果设置为公共(默认)或私有(或包,或任何角色级别等),那么您将在尝试时收到方法未找到错误远程访问它。
这样做,您将创建一个 SOAP Web 服务并通过 AJAX 使用它。您可以在 jQuery 请求中使用以下格式:
http://domain.com/path/to/your.cfc?method=functionName&argument1=arg1Val&foo=bar&...
如果您有 ColdFusion 8,您还可以指定 returnFormat='format' url 参数,它将即时将您返回的任何本机 ColdFusion 数据对象转换为请求的格式。它支持 JSON、XML 和 WDDX。
foo.cfc
<cfcomponent output="false">
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
...
<cfreturn someVar />
</cffunction>
</cfcomponent>
通过 URL 访问:
http://domain.com/path/to/foo.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
方法二:远程代理对象
方法 #1 的不利方面是对实例化 CFC 的效率有轻微影响,因此如果此特定 AJAX 方法将非常频繁地运行,和/或您的 CFC 包含多个方法或比几百行,你不想为每个请求一遍又一遍地实例化它。相反,您可能希望查看remote proxy pattern,您可以在其中缓存在应用程序范围内实现功能的 CFC,并拥有一个单独的“远程代理”CFC,它的重量要轻得多,并且只是充当 http 请求和缓存的 CFC 之间的代理(因此得名)。
在此模式中,您的业务对象(具有执行实际工作的功能)可以拥有access=public(或包等),只要代理可以访问它。不过,代理本身必须有access=remote。
proxy.cfc
<cfcomponent output="false">
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
<!--- Application.foo is an instantiated object of foo.cfc --->
<cfreturn Application.foo.foobar(argumentCollection=arguments) />
</cffunction>
</cfcomponent>
通过 URL 访问:
http://domain.com/path/to/proxy.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
方法 3:自己动手
最后,您可以手动实现函数调用并在 CFM 模板中返回。此方法不涉及编写 CFC 的(轻微)性能影响,但会为您提供更多的输入,以及额外的潜在故障点。为此,请将您的函数包含在 CFM 模板中,并将输出流视为:将返回给浏览器的文本流。
您应该小心管理返回值中的空格(在函数定义中使用output=false,考虑使用<cfsetting enableCFOutputOnly='true',并注意整体间距)。如果您的 jQuery 请求需要返回 JSON,则需要对其进行序列化。 (如果需要在 ColdFusion 6 或 7 上将数据序列化为 JSON,我推荐JSONUtil)
使用这种方法,您将 AJAX 请求指向带有 URL 参数的 .cfm 文件,然后您需要编写代码来获取这些 url 参数并将它们传递给函数,然后显示(本质上是返回到 AJAX request) 函数的结果。
foo.cfm
<cfsetting enableCFOutputOnly="true">
<cfparam name="arg1" default="defaultVal"/>
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
...
<cfreturn someVar />
</cffunction>
<cfset variables.result = foobar(url.arg1) />
<cfoutput>#serializeJSON(variables.result)#</cfoutput>