使用AJAX调用ColdFusion函数

时间:2009-06-16 03:57:37

标签: jquery ajax coldfusion

当用户点击链接时,我需要调用ColdFusion函数(存在于.cfm文件中)。我想用jQuery来做。我有一个看起来像 -

的jQuery片段
<script type="text/javascript">
$(document).ready(function(){
       $("td.ViewLink a").click(function(event){
         event.preventDefault();

)}

我是jQuery和AJAX的新手,所以我可能听起来很天真。我应该使用AJAX来调用ColdFusion函数吗?类似于请求在服务器上执行特定功能的东西。

对此方面的任何帮助表示赞赏。

干杯。

6 个答案:

答案 0 :(得分:17)

如果您的cfm中有多个功能(即使您没有),请将它们放在cfc中。 然后,您可以使用以下url模式来调用特定方法。

cfc名为myEntityWS.cfc

<cfcomponent>
  <cffunction name="updateDescription" access="remote" returntype="string">
    <cfargument name="value" type="string" required="yes">
    <cftry>
      your code here
    <cfcatch>
      <cfoutput>
        #cfcatch.Detail#<br />
        #cfcatch.Message#<br />
        #cfcatch.tagcontext[1].line#:#cfcatch.tagcontext[1].template#
      </cfoutput>
    </cfcatch>
    </cftry>
  </cffunction>
</cfcomponent>

的Javascript

$.get('myEntityWS.cfc?method=updateDescription&value=someValue');

答案 1 :(得分:15)

您无法完成您在示例代码中尝试的操作。不过,你有几个选择。

方法1:可远程访问的对象

将您的功能移动到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>

按网址访问:

http://domain.com/path/to/foo.cfc?method=foobar&arg1=some%20value&returnFormat=JSON



方法2:远程代理对象

方法#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>

按网址访问:

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)请求)函数的结果。

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>

答案 2 :(得分:8)

刚刚看到这篇文章。我使用cfc和jquery ajax来显示一堆计算值。 我的cfc有以下内容:

<cfcomponent output="true">
<cfscript>
    this.init();
</cfscript>
     <cffunction name="init" access="public" returntype="any">
       <cfset variables.dsn = application.dsn>
        <cfreturn variables.dsn> 
     </cffunction>
     <cffunction name="getFinanceTerms" access="remote" output="true" returntype="void">
         <cfargument name="sales_price" type="numeric" required="yes">
         <cfargument name="interestRate" type="numeric" required="yes">
           <!--- some calculations here --->
         #arguments.salesPrice# <!--- just to have something displayed --->
         <cfreturn>
     </cffunction>
 </cfcomponent>

我使用JQuery.ajax:

  $.ajax({
      type:"POST",
      url:"financeTerms.cfc?method=getFinanceTerms",
      data: "sales_price=55000&interestRate=5.99",
      cache:false,
      success: function(msg) {
      $("#someDiv").html(msg);
      }
  });

也许,这对其他人有用......

答案 3 :(得分:3)

您不一定需要使用“AJAX”(特别是XML部分),但您可以使用远程服务器调用:

$.get('/execute-function.cfm?func=whatever', function (result) { $('#result').html(result); });

真的取决于你需要对结果做什么。上面的代码会将HTML结果放在您网页上的div中:

<div id="result"></div>

您可以使用异步调用并解析XML,但我发现我很少需要。

答案 4 :(得分:1)

如果您愿意,可以在CF8中尝试<cfajaxproxy>标记。

答案 5 :(得分:0)

在JavaScript中使用ColdFusion变量功能强大! 一定要使用

<cfoutput> var #toScript(ColdFusionVAR, 'javascriptVar')# </cfoutput>

现在,您可以使用CFAJAXPROXY

将变量引用为javaScriptVar

请务必在模板中加入

<head> 
<cfajaxproxy cfc="cfc.yourclassname" jsclassname="jsCFCclassName">
</head>

在JavaScript端使用您的课程。

你会喜欢我们。

var JS_CFC_Obj;

JS_CFC_Obj = new jsCFCclassName()

您现在可以调用cfc中的函数。

jsCFCclassName.functionName(javascript var);