更新:根据答案我最初使用IsInstanceOf()的路线,这是为这个需要而设计的.然而,由于某些未知原因,它被证明是非常低效的.在稍后调试应用程序时,我最终只是在要使用的对象上设置一些属性而不是IsInstanceOf,从而导致数量级的速度提升.
我想要做的是测试ColdFusion中的一个对象,看看它是什么类型的组件.就像是...
<cfif isValid( "compath.dog", currentObj)>
...do something specific with dog objects...
</cfif>
Run Code Online (Sandbox Code Playgroud)
我认为这是可能的,但收到一个错误,说我传递的类型与有效的类型列表中的类型不对应...
有效的类型参数是:any,array,Boolean,date,numeric,query,string,struct,UUID,GUID,binary,integer,float,eurodate,time,creditcard,email,ssn,telephone,zipcode,url,regex,range ,component或variableName.
有没有办法在ColdFusion中实现这一目标?
CFC的一个重要功能是能够为直接.cfm页面和Flex应用程序重用代码.
我开发的一个这样的应用程序使用Flex来实现其图表功能,并且需要访问cfc中的'getResults()'函数.
所有这些内容都是在身份验证机制背后,但由于cfc将自己打开一个wsdl请求:
如果正确制作了URL查询,它实际上会将结果返回给浏览器:
https://myserver.com/c/functions.cfc?method=getResults&Term=2009&Course=Anatomy
人们用什么技术来保护cfc免受直接访问,除非请求直接来自CFML处理器或来自Flex Remoting?
通过在CF9中编写CFC的新方法,CF9的一些新编码约定是什么?
以下是我能想到的一些......
init()
返回自身的方法,因为New
如果找到则会调用init().init()
,否则期望例外...THIS.setXXX
在init()中使用XXX是属性名称,以便它可以调用隐式setter或自定义setter(如果可用).isNull(arguments.optionalArg)
而不是isDefined()
我在ColdFusion中编写了一个数据库加载脚本,我遇到了一个问题,即脚本内存缓慢耗尽.我用<cfthread>将每个表加载分成自己的线程,当内存下降到50%以下时我调用垃圾收集器(确保在gc()调用之间有30秒以防止垃圾收集器占用内存) .
我创建了一个CFC来保存脚本所需的所有查询.该脚本调用适当的CFC函数,然后返回查询,其中一些查询大小超过2 MB.当我在活动线程的内存页面的详细信息视图中查看服务器监视器时,看起来我的CFC在内存中保留了查询的副本,即使我对查询变量进行了操作并且变量在最后超出了范围功能.另外,我在我的帖子中有一个内存查询的副本.所以我在内存中留下了两个查询副本.这真的发生了什么?如果是,我如何从内存中删除一个查询副本?
我已经看到了在父文件夹中扩展cfcs的各种解决方案,可以访问父文件或CF管理,但我还没有看到一个可行的解决方案,无法访问父文件夹,无法在"共享"/兄弟文件夹中扩展cfc.
此解决方案需要访问父文件夹吗?(不确定这些映射是什么,但无论如何我都无法访问Application.cfc)
这个解决方案需要能够创建一个对我不起作用的application.cfc(在myApp中创建一个没有做任何事情,因为我所在的环境包含myApp中的索引页面并从那里构建...客户端永远不会直接称它为激活Application.cfc的识别
例如:
我希望能够通过super和扩展从Function.cfc调用Base.cfc(包含应用程序中使用的常用方法)中的功能.
我可以访问myApp中的所有文件,但不能访问"wwwroot","some"或"path".
为了在Function.cfc中扩展Base.cfc,我必须扩展"some.path.myApp.Shared.Base"的完整路径.如果有人重命名myApp文件夹,这将导致问题,因为我必须手动编辑每个Function. cfc扩展了Base.cfc
我正在寻找它创建一个特定于应用程序的"障碍",所以如果应用程序文件夹名称更改它不会导致大规模破坏,需要我编辑所有使用Base.cfc功能的CFC文件.
由于我不能使用Base的相对路径("..Shared.Base"),我想知道是否有办法在myApp文件夹中创建一个CFC,我可以从中扩展并减轻重命名的头痛,如果它是发生或给它一个通用名称,如"myApp"并从那里扩展.(myApp.Shared.Base)
我无法访问Application.cfm,也无法访问Coldfusion管理.
我有一个返回结构的远程CFC.它使用cfajaxproxy调用.我希望返回的JSON按顺序排列,即首先进入JSON对象的结构.但是,返回的JSON是混合顺序.
这是远程功能.
<cfcomponent displayname="validation" hint="">
<cffunction name="validateForm" displayname="validateForm" hint="" access="remote" verifyClient="yes" returntype="struct">
<cfargument name="formVals" type="struct" required="yes">
<cfset errors = StructNew()>
<cfif formVals.project neq "project">
<cfset errors["project"] = "Invalid project name." />
</cfif>
<cfif Len(formVals.description) eq 0>
<cfset errors["description"] = "Please enter a description." />
</cfif>
<cfif StructIsEmpty(errors)>
<cfset errors["message"]["type"] = "success">
<cfset errors["message"]["text"] = "Client and server-side validation passed successfully.">
<cfset errors["areErrors"] = false>
<cfelse>
<cfset errors["message"]["type"] = "validation">
<cfset errors["message"]["text"] = "Please fix the errors, and resubmit.">
<cfset errors["areErrors"] …
Run Code Online (Sandbox Code Playgroud) 我想将我的所有CFC放入/ components文件夹,并能够从应用程序中的不同位置调用它们,例如.来自/forums/index.cfm.
我该如何设置映射?
我在我的应用程序范围中放置一个组件,以便在所有请求中共享它,它包含一个cfm模板:
<cfcomponent output="false">
<cffunction name="run" output="false" returntype="void">
<cfset var tmp = false/>
<cftry>
<cfinclude template="inc.cfm"/>
<cfcatch>
<cffile action="append"
file="#ExpandPath("error.log")#"
output="ERROR: #cfcatch.message#"/>
</cfcatch>
</cftry>
</cffunction>
</cfcomponent>
Run Code Online (Sandbox Code Playgroud)
正在包含的模板只是创建一个数组并检查数组长度应该是什么,如果不是它写入error.log
文件:
<cfset tmp = [
"one",
"two",
"three"
]/>
<cfif ArrayLen(tmp) neq 3>
<cffile action="append"
file="#ExpandPath("error.log")#"
output="Length = #ArrayLen(tmp)#"/>
</cfif>
Run Code Online (Sandbox Code Playgroud)
如果我然后在它上面运行一个加载(100个并发线程),我会在我的error.log
文件中出现以下项目...
ERROR: element at position 3 of array variable "___IMPLICITARRYSTRUCTVAR0" cannot be found.
Length = 0
Length = 2
Run Code Online (Sandbox Code Playgroud)
注意我在Java 1.7.0_09上使用ColdFusion 9.0.1.274733.我在相同的JRE上测试过Railo并且工作正常.
附加以下还会导致问题,将tmp
变量更改为结构并在variables
范围中添加随机项,而不是在任何地方引用...
<cfcomponent output="false"> …
Run Code Online (Sandbox Code Playgroud) 在我们的带有SQL Server 2008 R2的ColdFusion 11应用程序中..cfm文件使用的CF组件使用以下语法调用:
<cfscript>
objMyTable = createobject('component','components.myTable);
qmyTable2list = objMyTable.loadAllCustomers();
qresultset = objMyTable.loadCustomersResultset(form.applicant_type, form.customer_name, form.state, form.orderby);
</cfscript>
Run Code Online (Sandbox Code Playgroud)
CF组件具有SQL语句,如下所示:
<cfquery name="result_set" dataSource="#request.dsn_name#">
select name, state from myTable #REReplace(where_clause,"''","'","ALL")#
</cfquery>
Run Code Online (Sandbox Code Playgroud)
当我们单击.cfm页面上的按钮时,应用程序正确显示来自SQL Server 2008-R2的数据.但SQL事件探查器不会捕获这些SQL语句.当我们在使用嵌入式cfquery标签进行sql查询(而不是CF组件)的.cfm页面上运行探查器时,SQL探查器会显示页面执行的所有查询. 问题:我们如何让SQL Profiler捕获CF组件内的查询?
sql-server coldfusion cfc sql-server-profiler sql-server-2008
我遇到了一个似乎只影响我们的生产服务器的问题,没有任何明显的规律或原因。本质上,我们收到以下错误(我将使用虚拟名称来说明这一点):
消息:在组件 Components.services.SomeComponent 中找不到方法 someFunction,在任何实现接口中也没有任何具有此名称的默认方法。
这种情况发生在代码库中的几行不同的地方,但一旦被抛出,它就永远不会再超过该点,直到清除 CFADMIN 中的组件缓存。关键在于:代码中的违规行如下所示:
<cfset var a = createObject("Components.services.app.ComponentA").someFunction() >
似乎createObject
对 create ComponentA 的调用返回的是SomeComponent的实例。我尝试过以下方法:
Components.services.app.ComponentA
、Components.services.app.ComponentB
等等...都是硬编码的new
语法而不是createObject
./Components/services/app
调用(例如)“app”,这样我就可以创建像这样的对象new app.ComponentA()
而不是new Components.services.app.ComponentA
似乎没有什么帮助——这些在我们的 UAT 或任何人的开发环境中都无法重现,并且在生产中是间歇性的,但是,一旦抛出,服务器就完成了。清除 CFADMIN 中的组件缓存可以暂时修复它,直到几个小时后有人再次随机抛出它。
一些额外的警告:
new ComponentC()
是创建someComponent
...new ComponentA()
而不是创建someOtherComponent
someComponent
, someOtherComponent
) 是位于此目录之外的 CFC后续步骤(这些都不理想):
是否有某种方法可以精细地排除从组件缓存中检索某些 CFC,并在调用 …
cfc ×10
coldfusion ×10
coldfusion-9 ×2
apache-flex ×1
createobject ×1
flex3 ×1
jquery ×1
json ×1
railo ×1
remoting ×1
sql-server ×1