簡體   English   中英

使用AJAX調用ColdFusion函數

[英]Invoke ColdFusion function using AJAX

當用戶單擊鏈接時,我需要調用ColdFusion函數(存在於.cfm文件中)。 我想使用jQuery。 我有一個jQuery片段,看起來像-

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

)}

我對jQuery和AJAX都不陌生,所以在這里聽起來我很幼稚。 我應該使用AJAX調用ColdFusion函數嗎? 類似於請求在服務器上執行特定功能。

在這方面的任何幫助表示贊賞。

干杯。

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

Java腳本

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

您無法完全執行示例代碼中要執行的操作。 不過,您還有一些選擇。

方法1:遠程訪問對象

將您的功能移動到CFC中,然后通過CFC的URL訪問它們。 此訪問方法要求該函數使用權限屬性access='remote'如果設置為public(默認值)或private(或包或任何角色級別等),則將得到方法未找到錯誤嘗試遠程訪問時。

為此,您正在創建一個SOAP Web服務並通過AJAX使用它。 您可以通過在jQuery請求中使用以下格式來執行此操作:

http://domain.com/path/to/your.cfc?method=functionName&argument1=arg1Val&foo=bar&...

如果您具有ColdFusion 8,則還可以指定returnFormat='format'參數,該參數會將您返回的所有本機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



方法2:遠程代理對象

方法#1的不利方面是,實例化CFC的效率會受到輕微影響,因此,如果這種特定的AJAX方法將非常頻繁地運行,並且/或者您的CFC包含的方法不止幾種,或者長度超過數百行,您不想為每個請求一遍又一遍地實例化它。 相反,您需要查看遠程代理模式 ,在其中緩存在應用程序范圍內實現功能的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請求)函數的結果。

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>

剛看到這篇文章。 我正在使用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”(特別是XML部分),但是您可以使用遠程服務器調用:

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

真正取決於結果需要做什么。 上面的代碼會將HTML結果放置在頁面上的div中:

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

您可以使用異步調用並解析XML,但是我發現我幾乎不需要。

如果願意,可以嘗試在CF8中使用<cfajaxproxy>標記。

在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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM