Jquery 从AJAX调用返回CFC查询数据
我正在对CFC进行AJAX调用,以从数据库中返回一条记录。记录总是以字符串形式返回。然后用该值更新输入字段 问题是我的字段中填充了以下内容:Jquery 从AJAX调用返回CFC查询数据,jquery,ajax,coldfusion,cfc,Jquery,Ajax,Coldfusion,Cfc,我正在对CFC进行AJAX调用,以从数据库中返回一条记录。记录总是以字符串形式返回。然后用该值更新输入字段 问题是我的字段中填充了以下内容: <wddxPacket version='1.0'><header/><data><string>0</string></data</wddxPacket> CFC功能: <script> function populateSalesTax(){ // Po
<wddxPacket version='1.0'><header/><data><string>0</string></data</wddxPacket>
CFC功能:
<script>
function populateSalesTax(){
// Populate the start and stop odometer text boxes
// when the selectlist ajax completes successfully
$.ajax({
url:'cfcs/taxdata.cfc?method=getSalesTax',
data: { company_name: $("##company_name>option:selected").attr("Value") },
success: function(response) {
console.log('Sales Tax Fubction Ran Successfully');
$("##taxRate").val( response );
},
error: function(response) {
console.log('Error' + response)}
});
}
</script>
<cffunction name="getSalesTax" access="remote" returnType="string">
<cfargument name="company_name" type="any" required="true">
<!--- localize function variables --->
<cfset var taxDetail = "">
<cfoutput>
<cfquery name="taxDetail" datasource="#datasource#">
SELECT tax_rate
FROM customer_table
<!--- adjust cfsqltype if needed --->
WHERE company_name = <cfqueryparam value="#ARGUMENTS.company_name#"
cfsqltype="cf_sql_varchar">
</cfquery>
</cfoutput>
<cfreturn taxDetail.tax_rate>
</cffunction>
<cfinput name="taxRate" id="taxRate" type="text" size="2" readonly="yes">
选择税率
从客户表
其中,公司名称=
输入字段:
<script>
function populateSalesTax(){
// Populate the start and stop odometer text boxes
// when the selectlist ajax completes successfully
$.ajax({
url:'cfcs/taxdata.cfc?method=getSalesTax',
data: { company_name: $("##company_name>option:selected").attr("Value") },
success: function(response) {
console.log('Sales Tax Fubction Ran Successfully');
$("##taxRate").val( response );
},
error: function(response) {
console.log('Error' + response)}
});
}
</script>
<cffunction name="getSalesTax" access="remote" returnType="string">
<cfargument name="company_name" type="any" required="true">
<!--- localize function variables --->
<cfset var taxDetail = "">
<cfoutput>
<cfquery name="taxDetail" datasource="#datasource#">
SELECT tax_rate
FROM customer_table
<!--- adjust cfsqltype if needed --->
WHERE company_name = <cfqueryparam value="#ARGUMENTS.company_name#"
cfsqltype="cf_sql_varchar">
</cfquery>
</cfoutput>
<cfreturn taxDetail.tax_rate>
</cffunction>
<cfinput name="taxRate" id="taxRate" type="text" size="2" readonly="yes">
我这里有很多代码,因为我做的事情与大多数不同,但这是一种进化。 下面是我如何创建一个典型的表:
if exists (select * from sysobjects where id = object_id(N'myTable') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE myTable
GO
CREATE TABLE myTable(
myTableID Int Identity(1000,1) PRIMARY KEY NONCLUSTERED
,myTableName varchar(128) default ''
,myTableDesc varchar(max) default ''
,myTableSort Int default 0
)
GO
INSERT INTO myTable(myTableName,myTableSort) VALUES('One',1)
INSERT INTO myTable(myTableName,myTableSort) VALUES('Two',2)
INSERT INTO myTable(myTableName,myTableSort) VALUES('Three',3)
我使用存储过程。以下是SQL代码:
create schema myTable authorization dbo
-- It might seem odd to create a schema called with the name of the table, but that's how I organize the stored procedures by table name.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'myTable.[get]') AND type in (N'P', N'PC'))
DROP PROC myTable.[get]
GO
CREATE PROC myTable.[get]
(@UsrID Int
,@RemoteAddr Varchar(15)
,@myTableID Int
) AS
SELECT myTableID,myTableName,myTableDesc,myTableSort
FROM myTable
WHERE myTableID = @myTableID
GO
exec myTable.[get] 0,'',1001
@UsrID是每个存储过程中的第一个参数。是谁想知道的
@RemoteAddr是每个存储过程中的第二个参数。它是用户的IP地址。
现在,我知道这不是万无一失的,但我认为这里的安全是这样的
1) @UsrID是他们知道的东西(他们必须知道密码才能作为用户登录)
2) @RemoteAddr是他们自己的东西(尽管IP地址可以被欺骗)
@myTableID是@myTable的主键。我总是将主键命名为表名,后跟ID
下面是一个典型的.cfm页面:
<cfscript>
</cfscript>
<cfoutput>
<cfinclude template="/Inc/html.cfm">
<link rel="stylesheet" type="text/css" href="Index.css">
<cfinclude template="/Inc/body.cfm">
<ul>
<li><a class="myClass" data-mytableid="1000" href="JavaScript:;">Click One!</a></li>
<li><a class="myClass" data-mytableid="1001" href="JavaScript:;">Click Two!</a></li>
<li><a class="myClass" data-mytableid="1002" href="JavaScript:;">Click Three!</a></li>
</ul>
<cfinclude template="/Inc/foot.cfm">
<script src="Index.js"></script>
<cfinclude template="/Inc/End.cfm">
</cfoutput>
以及页面本身的脚本:
(function() {
$(document).on('click','.myClass',clicked)
function clicked() {
var local = {}
local.url = 'myTable.cfc'
local.type = 'POST' // or GET
local.dataType = 'json'
local.data = {}
local.data.method = 'get';
local.data.myTableID = $(this).data('mytableid')
local.context = this;
result = $.ajax(local)
result.fail(dom.fail)
result.done(done)
}
function done(response, status, xhr) {
// console.log(response.COLUMNS)
// console.log(response.DATA)
// console.log(response.DATA[0])
// console.log(response.DATA[0][0]) // myTableID
// console.log(response.DATA[0][1]) // myTableName
// console.log(response.DATA[0][2]) // myTableDesc
// console.log(response.DATA[0][3]) // myTableSort
// console.log(status)
// console.log(xhr)
}
})()
最后,myTable.cfc:
component {
remote function get(myTableID) returnformat='json' {
storedproc dataSource=session.dataSource
procedure='myTable.[get]' {
procparam cfSqlType='cf_sql_integer' value=session.Usr.UsrID;
procparam cfSqlType='cf_sql_varchar' value=session.RemoteAddr;
procparam cfSqlType='cf_sql_integer' value=arguments.myTableID;
procresult resultset=1 name='result';
}
return result
}
}
我应该粘贴一个简短的应用程序。cfc:
component {
this.Name = 'myAJAX'
this.dataSource = 'LR2015Summer1'
this.SessionManagement = true
function onSessionStart() {
session.dataSource = this.dataSource
session.RemoteAddr = getPageContext().getRequest().getRemoteAddr()
session.Usr = {}
session.Usr.UsrID = 0
}
function onRequestStart(LogCFCName) {
setting showDebugOutput=false;
if (isDefined('url.onSessionStart')) {
onSessionStart()
}
request.msg = ''
request.mod = 'label-info'
request.title='How I AJAX and return a query'
request.home = '/HowIWrite/AJAX/cfc'
request.css = url.css ?: true
request.js = url.js ?: true
request.bootstrap = url.bootstrap ?: true
request.bootstrap_theme = 'bootstrap-theme'
request.tryCatch = url.tryCatch ?: false
request.navbar = url.navbar ?: true
request.container = url.container ?: true
request.GoogleMaterialdesign = url.GoogleMaterialdesign ?: true
request.jQueryUI = url.jQueryUI ?: false
request.jQueryUI_theme = 'ui-lightness' // black-tie,blitzer,cupertino,dark-hive,dot-luv,eggplant,excite-bike,flick,hot-sneaks,humanity,le-frog,mint-choc,overcast,pepper-grinder,redmond,smoothness,south-street,start,sunny,swanky-purse,trontastic,ui-darkness,ui-lightness,vader
request.cgiName = getPageContext().getRequest().getServletPath()
request.cgiName = Left(request.cgiName,Len(request.cgiName)-4)
request.cgiName = ListLast(request.cgiName,'/')
request.cssName = request.cgiName & '.css'
request.jsName = request.cgiName & '.js'
}
}
您可以修改您的CFC:
<cfset response = { taxRate = taxDetail.tax_rate } />
<cfreturn serializeJSON(response)>
(ajax成功方法应具有响应.TAXRATE
)
或您的ajax调用url本身:
<script>
function populateSalesTax(){
// Populate the start and stop odometer text boxes
// when the selectlist ajax completes successfully
$.ajax({
url:'cfcs/taxdata.cfc?method=getSalesTax',
data: { company_name: $("##company_name>option:selected").attr("Value") },
success: function(response) {
console.log('Sales Tax Fubction Ran Successfully');
$("##taxRate").val( response );
},
error: function(response) {
console.log('Error' + response)}
});
}
</script>
<cffunction name="getSalesTax" access="remote" returnType="string">
<cfargument name="company_name" type="any" required="true">
<!--- localize function variables --->
<cfset var taxDetail = "">
<cfoutput>
<cfquery name="taxDetail" datasource="#datasource#">
SELECT tax_rate
FROM customer_table
<!--- adjust cfsqltype if needed --->
WHERE company_name = <cfqueryparam value="#ARGUMENTS.company_name#"
cfsqltype="cf_sql_varchar">
</cfquery>
</cfoutput>
<cfreturn taxDetail.tax_rate>
</cffunction>
<cfinput name="taxRate" id="taxRate" type="text" size="2" readonly="yes">
cfcs/taxdata.cfc?方法=getSalesTax&ReturnFormat=json
但是
从ajax请求url:'cfcs/taxdata.cfc?method=getsalesax'
中的相对路径判断,我可以安全地假设您正在尝试在同一个源(同一站点)上执行ajax请求,实际上不需要远程方法,而需要公共或包方法
您应该知道声明方法remote
会带来安全问题。如果未定义适当的安全层或角色
,您已打开该方法供任何人使用,包括恶意用户
所以你应该拥有的是:
- CFC前面的另一个抽象层——至少是一个实例化对象并调用
getSalesTax
的cfm,但理想情况下是一个框架
- 访问
公共
或软件包
而不是远程
- 在返回税率响应对象的抽象层上声明的适当内容类型(例如
)
在AJAX调用中,尝试运行正常的cfcs/taxdata.cfc?方法=getSalesTax&ReturnFormat=json
。谢谢。简单的方法是根本不使用ajax。在.cfm文件中运行该函数,并使用cfinput标记的value属性。与问题无关,但函数中不需要cfoutput标记。cfquery有一个内置的。为什么你会建议最简单的方法是不使用AJAX?如果说功能存在,你建议不使用AJAX会导致它停止工作。我没有做过很多AJAX调用,最近也没有,但是我对问题的记忆很模糊,除非方法是远程的。ajax请求与任何其他请求一样,只是它是异步的,或者是不同步的。在现代浏览器中,ajax请求被阻止在与当前域不同的域(源)上运行对脚本的调用,除非在allow origin access报头(look up CORS)中提供了不同的内容。这是出于跨站点脚本、受损web应用程序等安全原因实施的。在这种情况下,我不是说这是一个问题,而是建议他关闭应用程序中潜在的安全漏洞,这就是我开始使用的远程方法,在数据的来源和使用之间有一个层。称之为AppApi或类似的东西。AppApi有一个实例化的类(可能是AppObj),因此AppApi有远程方法来调用AppObj上的公共方法。这样做的主要好处是AppObj对象在AppApi中是持久的,但我认为AppApi中页面调用的方法需要是远程的,而不是public或package。我不明白你在说什么吗?谁在使用这个api?它只是你的网络应用还是第三方应用?您的api是否需要任何形式的身份验证?我问这个问题的原因是为了确定您是否真的需要远程方法。Access remote创建远程应用程序或第三方应用程序可以使用的Web服务。如果不是这样,则您不需要远程方法,但下面是一个简单的示例,说明您需要什么:myapp.com/index.cfm?action=getTax
Index.cfm
这里有一个决策块if(action==getTax)
如果是,它实例化AppApi.AppObject并调用myTax=AppObject.getsalesax()
。然后,要返回json,只需添加#serializeJSON(myTax)#
。这里getSalesTax方法不需要是远程的,而是公共的。这是一种粗糙的MVC方法。我建议研究像FW1这样的coldfusion mvc框架。