Вызов функции ColdFusion с использованием AJAX
Мне нужно вызвать функцию ColdFusion (присутствует в файле .cfm), когда пользователь нажимает на ссылку. И я хотел бы сделать это с помощью jQuery. У меня есть фрагмент jQuery, который выглядит как
<script type="text/javascript">
$(document).ready(function(){
$("td.ViewLink a").click(function(event){
event.preventDefault();
)}
Я новичок как в jQuery, так и в AJAX, поэтому я могу назвать наивным. Должен ли я использовать 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');
Ответ 2
Вы не можете сделать именно то, что вы пытаетесь использовать в своем примере кода. Однако у вас есть несколько вариантов.
Метод 1: Удаленный доступ
Переместите свои функции в CFC и получите доступ к ним через URL-адрес CFC. Этот метод доступа требует, чтобы функция использовала атрибут разрешений access='remote'
- если он установлен как общедоступный (по умолчанию) или закрытый (или пакет, или любые уровни ролей и т.д.), Тогда вы получите метод не найденной ошибки при попытке для удаленного доступа к нему.
Выполняя это, вы создаете веб-сервис SOAP и потребляете его через 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
Способ 2. Удаленный прокси-объект
Отрицательная сторона подхода №1 заключается в том, что при создании ХФУ наблюдается небольшое повышение эффективности, поэтому, если этот конкретный метод 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, вам необходимо его сериализовать. (Если вам нужно сериализовать данные в JSON на ColdFusion 6 или 7, я рекомендую JSONUtil)
При таком подходе вы указываете свой запрос AJAX в файл .cfm с параметрами URL, а затем вам нужно написать код, который берет эти параметры 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>
Ответ 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);
}
});
Возможно, это будет полезно кому-то еще...
Ответ 4
Вам необязательно использовать "AJAX" (особенно часть XML), но вы можете использовать вызов удаленного сервера:
$.get('/execute-function.cfm?func=whatever', function (result) { $('#result').html(result); });
Действительно зависит от того, что вам нужно делать с результатом. Вышеприведенный код поместит результат HTML в div на вашей странице:
<div id="result"></div>
Вы можете использовать асинхронный вызов и разбор XML, но я обнаружил, что мне тоже редко нужно.
Ответ 5
Вы можете попробовать тег <cfajaxproxy>
в CF8, если хотите.
Ответ 6
Использование переменной ColdFusion в JavaScript является мощным!
Обязательно используйте
<cfoutput> var #toScript(ColdFusionVAR, 'javascriptVar')# </cfoutput>
Теперь вы можете ссылаться на свою переменную как javaScriptVar
с помощью CFAJAXPROXY
Обязательно укажите это в своем шаблоне
<head>
<cfajaxproxy cfc="cfc.yourclassname" jsclassname="jsCFCclassName">
</head>
Использование класса на стороне JavaScript.
Вы бы нам так понравились.
var JS_CFC_Obj;
JS_CFC_Obj = new jsCFCclassName()
Теперь вы можете выполнять вызовы функций внутри этого cfc.
jsCFCclassName.functionName(javascript var);