与所有开发一样,通过ColdFusion,Railo或OpenBD的 CFML 我们遇到了常见的编程问题.对于这些问题,程序员必须转向模式(或反模式).然而,像GOF和现代头版第一本书这样的经典资源都倾向于关注Java.
虽然java本身很漂亮,但是所有三个cfml引擎本质上都是java应用程序,它们表示在编写cfml时,并不是所有甚至许多设计模式都可以或者应该以java方式使用.
我想知道在使用cfml时你发现哪些资源/模式有用?或者您更改了适应java或smalltalk模式以在cfml中使用的内容?
就个人而言,我发现这两个演示文稿都很有趣:
CFMeetup:设计模式和ColdFusion作者:Sean Corfield
和
更新:
偶然发现cfdesignpatterns.com,看起来很有希望.
我正在开发一个需要搜索表单上的自动填充字段的应用程序.该应用程序是Railo 3.3上的CFML.我正在使用jQuery UI自动完成,并在服务器端实现了这样的查找:
private struct function getStationDetails(required numeric uic)
{
var qryCacheStations = new query();
var qryStations = new query();
var cacheData = "";
var resultData = "";
var stcResult = {};
qryCacheStations.setDatasource(variables.instance['dataSource']);
qryCacheStations.setSQL("select distinct uic, name, crs from stations order by name");
qryCacheStations.setCachedwithin(createTimeSpan(1,0,0,0));
cacheData = qryCacheStations.execute().getResult();
qryStations.setDBType("query");
qryStations.setAttributes(srcTbl = cacheData);
qryStations.setSQL("select name, crs from srcTbl where uic = :uic");
qryStations.addParam(name="uic",value=arguments.uic,CFSQLType="CF_SQL_INTEGER");
resultData = qryStations.execute().getResult();
stcResult = {
name = resultData['name'][1],
crs = resultData['crs'][1]
}
return stcResult;
}
Run Code Online (Sandbox Code Playgroud)
基本上我在第一次查找时将整个站列表加载到缓存中,1天到期(数据很少更改),然后使用查询查询将相关结果返回给客户端.
我的问题只是这个; 这种激进的缓存和QoQs技术是一个很好的模式吗?性能似乎很好,内存占用很合理(数据集非常小),所以它"感觉"还可以,但我正在寻找那些之前尝试过这些并发现问题的人的建议吗? …
我想在将其推送到分段和生产之前,在我的本地机器上测试https相关的开发.
目前的网址是:http://localhost:8500/mysite/index.cfm工作正常
如果我尝试将其修改为https,则页面只会加载并加载并且没有任何反应(在chrome中它会显示"此网页不可用"页面)
我搜索了与此相关的信息,但没有发现任何有用的信息.我发现的唯一信息与旧版本的CF有关.从那以后我创建了一个my.keystore文件,但我不知道在CF9中如何处理它.
如果可以提供任何可以帮助我设置/使其工作和测试的信息,我将非常感激.谢谢
下面我有一个循环内的代码,以便将循环迭代我的动态变量设置temp到的值getAdvisor_Advisors.advisor_ID用于当前循环迭代.
<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">
Run Code Online (Sandbox Code Playgroud)
下面的cfinvoke调用我在动态"temp"变量中传递的查询,但必须使用它周围的慢评估(temp)来获取正确的值.
<cfinvoke component="com.appointments" method="get_All_Appointments" returnvariable="getAppointments">
<cfinvokeargument name="Advisor_ID" value="#evaluate(temp)#">
<cfinvokeargument name="StartDay" value="#dateFormat(form.cal,'dd')#">
<cfinvokeargument name="StartMonth" value="#dateFormat(form.cal,'mm')#">
<cfinvokeargument name="StartYear" value="#dateformat(form.cal,'yyyy')#">
</cfinvoke>
Run Code Online (Sandbox Code Playgroud)
我想重写temp变量evaluate()而不使用evaluate.我被告知我可以使用结构语法来引用它,如下所示:
没有评估:
<cfset foo = qBar["text#lang#"][CurrentRow]>
getAdvisor_Advisor["advisor_ID"][CurrentRow]
Run Code Online (Sandbox Code Playgroud)
我该怎么改写
<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">
Run Code Online (Sandbox Code Playgroud)
使用结构语法?
添加更多代码,以便您可以看到为什么这很复杂,这些是复合循环.
<cfquery name="getAdvisor_Advisors1" dbtype="query" cachedWithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Express = 'FR/SO'
Order by Specialization, Advisor
</cfquery>
<cfquery name="getAdvisor_Advisors2" dbtype="query" cachedWithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Express = 'JR/SR'
Order by Specialization, Advisor
</cfquery>
<cfquery …Run Code Online (Sandbox Code Playgroud) 我有2张桌子.一个是类别,第二个是问题.
category table:
category_id
category_name
questions table:
question_name
question_id
category_id
Run Code Online (Sandbox Code Playgroud)
如何循环显示所有类别名称并显示在每个类别名称下分组的问题?使用ColdFusion,所以我假设我应该使用<CFLOOP>
结果看起来应该是这样的.
组别
产品组别
我正在使用Railo中的ImageNew(及相关)创建图像,它使用了JAI.
当我保存图像时,我得到一个24位PNG,但我只需要8位.(只需使用图形编辑器将文件重新保存为8位,就会产生四分之一到一半的字节数.)
ImageWrite没有提供有关PNG位深度的任何功能,我也找不到任何与JAI本身相关的细节(获取http://jai-core.dev.java.net/的DNS错误)
更新:
使用Quantize ImageFilter我可以将颜色数量减少到256 - 这会显着减小文件大小(但仍然没有手动处理),但仍然会产生24位/未调整的PNG文件.不幸的是,它还删除了我需要保留的透明度(或至少重新应用).
如果我通过OptiPNG(一个无损PNG优化器)生成并生成它的文件,它会生成索引的8位文件并削减相当多的字节并提供可接受的文件大小.
所以,这个难题的剩余步骤:如何在ImageFilter删除它之后重新应用透明度(或者更好,防止它被删除).
我想我需要一些方法来做Image.replace('white','transparent')一个基于Railo/Java的解决方案,或者一个跨平台的命令行工具.
当我调用URL时,http://192.168.2.26:8080/rest/RestSample/season/1.json我收到错误:
"错误","ajp-bio-8012-exec-4","03/01/13","16:51:58","RestSample","对象不是声明类的实例文件的特定顺序包含或处理的是:C:\ path_to\api\service.cfc''"
这是/api/service.cfc文件:
<cfscript>
component restpath="season" rest="true"
{
remote query function getSeasonsByUserId(numeric userid restargsource="Path") httpmethod="GET" restpath="{userid}"
{
var response = "";
var qry = new Query();
var userQry = "";
qry.setSQl("select * from mytable where userID = :userid");
qry.addParam(name="userid", value="#arguments.userid#", cfsqltype="cf_sql_numeric");
userQry = qry.execute().getResult();
if(userQry.recordcount == 0)
{
response = userQry;
} else {
throw(type="Restsample.SeasonsNotFoundError", errorCode='404', detail='Seasons not found');
}
return response;
}
}
</cfscript>
Run Code Online (Sandbox Code Playgroud)
编辑#1:遵循本教程:http: //www.anujgakhar.com/2012/02/20/using-rest-services-in-coldfusion-10/
编辑#2:我的application.cfc
<cfscript>
component output="false" …Run Code Online (Sandbox Code Playgroud) 我是Coldfusion的新手,无法理解为什么我在使用cfhttp进行的http请求中添加几个标题时遇到了很多麻烦.我正在尝试使用cfscript编写请求,并且从我读过的所有内容中我应该能够简单地执行:
httpService.addParam(type="header", name="Content-Type", value="application/json");
Run Code Online (Sandbox Code Playgroud)
要么
httpService.addParam(type="header", name="Authorization", value=local.authPasscode);
Run Code Online (Sandbox Code Playgroud)
但传出请求似乎不包含这些标头.我可以告诉它不起作用,因为:
writeDump(GetHttpRequestData()),它显示了请求的所有细节(此输出根本不显示Authorization标头,并将Content-Type标头显示为:多部分/格式的数据; 边界= ---- WebKitFormBoundaryZs9TyOQV02N3fQop
我似乎也很难以类似的方式添加消息正文,所以我认为我做错了addParam().我是这样尝试的:
httpService.addParam(type="body", value="hello");
Run Code Online (Sandbox Code Playgroud)
同样,我得到的响应有一堆缺失的字段错误,输出writeDump(GetHttpRequestData())显示缺少的正文.
我应该能够以addParam()这种方式使用吗?
完整代码:
httpService = new http();
httpService.setMethod("POST");
httpService.setUrl(application.config.beanstream.postURL);
local.authPasscode = "Passcode " & ToBase64(application.config.beanstream.merchantid & ":" & application.config.beanstream.APIPasscode, "utf-8");
// Set headers.
httpService.addParam(type="header", name="Authorization", value=local.authPasscode);
httpService.addParam(type="header", name="Content-Type", value="application/json");
// Construct the message body.
local.body = {
"test": "hello"
};
httpService.addParam(type="body", value=SerializeJSON(local.body));
writeDump(GetHttpRequestData());
local.result = httpService.send().getPrefix();
Run Code Online (Sandbox Code Playgroud)
更新:
好的,所以我把我postURL改为另一个本地页面,在那个页面上,我GetHttpRequestData()用来将方法,协议,标题和内容全部记录到文件中.这是我得到的:
POST
HTTP/1.1 …Run Code Online (Sandbox Code Playgroud) 我的函数调用SendGrid API.它返回一个Array +结构.我正在编写一个返回CFQuery数据集的函数.
目标 我想将反序列化的数据对象传递给我的函数并获取查询数据集.
这是我的工作代码和输出:
<cfparam name="variables.ddata" default="#structnew()#">
<!--- API Call Code here --->
<cfset arr = DESerializeJSON(returnStruct.Filecontent) />
<cfdump var="#arr#">
Run Code Online (Sandbox Code Playgroud)
我的代码:
<cfset arrayit(arrobj= arr) >
<cfdump var="#variables.ddata#" >
<cffunction name="arrayit" access="public" returntype="void">
<cfargument name="arrobj" type="array" required="yes">
<cfset var arr=arguments.arrobj />
<cfloop from="1" to = "#arrayLen(arr)#" index="i">
<cfif isValid("string", arr[i])>
<cfset StructInsert(variables.ddata, i, arr[i]) />
</cfif>
<cfif isstruct(arr[i])>
<cfset structit(structobj = arr[i]) />
</cfif>
</cfloop>
</cffunction>
<cffunction name="structit" access="public" returntype="void" output="yes">
<cfargument name="structobj" type="any" required="yes">
<cfset stru = arguments.structobj …Run Code Online (Sandbox Code Playgroud) 拜托,我被困住,需要一双清新的眼睛.
我正在和别人的意大利面条代码一起工作,这些代码已经不在了,并且正在弄清楚他们正在评估什么.
<cfset surveyCount = 0>
<cfloop query="surveys">
<cfif evaluate("defaultReport" & ID)>
<cfset surveyCount = surveyCount + 1>
</cfif>
</cfloop>
Run Code Online (Sandbox Code Playgroud)
在查询转储中,我看到9条记录,这是我所期待的但是因为评估失败,所以surveyCount没有递增.我没有看到任何列defaultReport.在我与CF合作的15年中,我总是避免评估(),现在当我需要分析它时,我完全失去了.有人可以提供任何指导吗?
添加了CFDump图像(为了隐私和安全性,已删除了一些列名称):

更新I:这个文件有很多cfinclude语句和很少的代码格式.结果,我忽略了一些cfinclude语句.我找到了以下内容.我仍然在寻找,但想在我挖掘时记录这一点.
<cfloop query="surveys">
<cfscript>
variables["defaultReport" & ID] = evaluate(thisAssociation & "Price");
</cfscript>
</cfloop>
cfml ×10
coldfusion ×8
railo ×3
coldfusion-9 ×2
autocomplete ×1
cfdump ×1
cfhttp ×1
cfimage ×1
cfloop ×1
https ×1
jai ×1
java ×1
jquery ×1
jquery-ui ×1
openbd ×1
rest ×1
sendgrid ×1
sql ×1
sql-server ×1
ssl ×1
structure ×1
web-services ×1