【问题标题】:Invoke ColdFusion function using AJAX使用 AJAX 调用 ColdFusion 函数
【发布时间】:2013-01-23 04:07:42
【问题描述】:

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

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

)}

我对 jQuery 和 AJAX 都很陌生,所以在这里我可能听起来很幼稚。我应该使用 AJAX 来调用 ColdFusion 函数吗?类似于请求在服务器上执行特定功能。

感谢您提供这方面的任何帮助。

干杯。

【问题讨论】:

  • 请参阅下面 razzed 的回答。在稍高一点的层面上,您基本上只是发出一个 http 请求并对结果做一些事情。您本可以对 StackOverflow 主页进行相同的调用并取回浏览器所需要的 HTML,但您可以调用自定义 Coldfusion 页面并取回该页面返回的任何内容。您可以将其保留为 HTML,或者让 Coldfusion 返回 XML、JSON 甚至纯文本。

标签: jquery ajax coldfusion


【解决方案1】:

如果您的 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');

【讨论】:

  • 我知道这已经快十年了,但您能解释一下为什么要使用 .cfc 而不是 .cfm 文件吗?
  • @tim_stuff 如果我没记错的话,ColdFusion 会在 cfc 周围自动生成一个 Web 服务:wsdl 等。这不会发生在 cfm 中。
【解决方案2】:

您不能完全按照您在示例代码中尝试的方式进行操作。不过,您有几个选择。

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

将您的函数移动到 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,考虑使用&lt;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>

【讨论】:

    【解决方案3】:

    刚看到这个帖子。我正在使用 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);
          }
      });
    

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

    【讨论】:

    • $.ajax()$.get() 的一个很好的替代品,因为它为您提供了更多选择,但它们都可以工作。
    【解决方案4】:

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

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

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

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

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

    【讨论】:

      【解决方案5】:

      如果您愿意,可以尝试在 CF8 中使用&lt;cfajaxproxy&gt; 标签。

      【讨论】:

        【解决方案6】:

        在 JavaScript 中使用 ColdFusion 变量非常强大! 请务必使用

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

        您现在可以使用 CFJAXPROXY 将变量引用为 javaScriptVar

        请务必将其包含在您的模板中

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

        在 JavaScript 端使用你的类。

        你会喜欢我们的。

        var JS_CFC_Obj;
        
        JS_CFC_Obj = new jsCFCclassName()
        

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

        jsCFCclassName.functionName(javascript var);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多