Colorful Life2010

ColdFusion MX 开发技巧研究
Weather:多云 ,南风 4-5级 ,最高气温27 ℃

本文内容来自7yue做的一个Breeze版的教学,但实在不适合阅读,我就照着打下来了,其中一些Notes原来就少,我这儿也没办法了

====ColdFusion Lists
◎List的本质实际上就是处理字符串,只不过字符串中每个元素的分隔符不同而已。
◎List和数组还有结构体不同,List的创建不需要任何CF的函数,而是使用CFSet,同设定变量一样。当然,我们也可以用cfparam来创建List。
◎更新列表函数ListAppend()的使用要注意分隔符属性和其它某些List函数中分隔符的区别,前者是单字符有效,后者是每个字符都能做为分隔符。
◎如何计算列表长度?注意列表a,,b和a, ,b的区别。
◎注意列表项的位置,每个列表元素位置是1,不是0。CF掷出错误,总是寻找列表中不存在的特定元素。
◎列表寻找唯一要注意的问题就是大小写敏感。如果想对寻找内容大小写不敏感,用ListFiedNoCase和ListContainsNoCase函数。
◎如何定义多个分隔符?
◎注意,列表的出现是为了简单,而不是为了解决效率问题。
◎虽然有ListToArray()和ArrayToList(),但不是一个非常灵活的方式。
◎ListSort()函数中的排序的字符方式,以升序为例,数字最前,其次是大写字符,然后是小写字符。特殊字符一般都在字母前面。
◎为了性能提升,要使用Array或者结构体。
------------Notes---------------
   使用ListAppend()方式更新列表 <cfset state="A,B,C,D,E"> <cfoutput>#ListGetAt(state,3)#</cfoutput> 返回结果是C。 请注意其他的操作函数,listFirst(),listLast()和listRest()。 Listfind()函数寻找匹配的列表元素,返回该元素位置。 ListContains()函数寻找元素中匹配的特定字符串,返回该元素位置。 ListSetAt()函数是更新列表中的某一项,如: <cfset State=“a,b,c,d,e”> <cfset State=ListSetAt(State,2,”Zerlot”)> <cfoutput>#State#</cfoutput> 何时用到List?第一,处理Form表单一个元素多个值的时候。第二,使用list列表方式设定SQL的值的时候。 字符排序的结果: <cfset State1="a,A,B,10,c,C,),*,@"> <cfoutput>#ListSort(state1,"text","asc")#</cfoutput> 结果是:),*,10,@,A,B,C,a,c
--------------------------------------
====ColdFusion Arrays
◎ArrayNew()函数创建数组,唯一的参数就是数组的维数。实际情况是很少创建3维或更高维数的数组
◎添加数组的每n+1个元素,有多种方式。第一种,设定array_name[ArrayLen(array_name)+1]的值;第二,通过ArrayAppend()函数添加。注意,数组的下标在CF中也是从1开始
◎哪一种是编程的好习惯?<cfset array_name=ArrayAppend(array_name,"String or Value")>还是<cfset ArrayAppend(array_name,"String or Value")>
◎遍历一个数组的最好最直接的方式就是使用<cfloop>
◎CF数组不需要初始化长度,这点与Java不同。但是考虑性能,对于大型数组,可以使用ArrayResize()函数来指定在内在中的长度值。
◎ArraySort()的用法同ListSort()类似,而且只能用于单维数组。
◎多维数组就是“数组中包含数组”,2维数组就是一个关系表格的结构,而3维数组则是一
个立方体网格结构。
------------Notes--------------
ArrayNew(1)创建一个单维数组。如果添加数组的元素,用: <cfset array_name=ArrayNew(1)> <cfset array_name[1]=“String or value”> … <cfset array_name[Arraylen(array_name)+1]=“String or value”> 遍历一个数组,最直接的方法是cfloop <cfloop from=“1” To=“#ArrayLen(array_name)#” Index=“i”>  <cfoutput>#array_name[i]#</cfoutput> </cfloop> CF数组长度设定 <cfset ArrayResize(array_name,500)> 数组排序: <cfset food=ArrayNew(1)> <cfset
=========ColdFusion Structures
◎Structure同数组的最大不同就是它的无序性,所以每一个Structure的成员通过key来访问
◎编程习惯选择?声明一个结构并添加一个成员:
<cfset struct_name = StructNew()>
<cfset struct_name.member = "value">
另一种选择:
<cfset struct_name.member = "value">
◎通过向中括号内指定变量比点语法更加灵活,为什么?
◎实际应用创建一个用户在系统中的相关信息的结构体非常高交,删除也很方便。
◎注意StructClear()和StructDelete()的区别,前者清除所有成员,后者删除特定成员。
◎ColdFusion中很多内部变量都是结构体,由此可见,使用结构体不会降低性能
◎分析“结构型数组”和“数组型结构”的区别,强调总体排序而内部灵活的时候,用前者;强调总体无序而元素内部的分支有排序效果时用后者,两者都是强劲而灵活的数据结构方式。
----------Notes--------------
   创建一个结构体变量用<cfset struct_name=StructNew()> <cfset struct_name[“My name”]=“Zerlot”>可以声明My name名称成员变量,但是点语法不行。 StructFind(struct_name
===========ColdFusion CFScript
◎<cfscript>区域中不需要cf tags,<cfscript>中间的代码属于类JavaScript语法。
◎<cfscript>中不能有cfquery的数据查询
◎<cfscript>中的代码不能用于直接的HTTP,FTP和文件系统及LDAP的操作。
◎<cfscript>中的switch/case语法,如果没有break声明,则不能跳出条件,会按照顺序做紧跟的条件。
◎如果不能直接操作COM或者JAVA类,就要在<cfscript>中使用CreateObject方法。
============ColdFusion动态函数
◎ColdFusion具备3个动态函数,IIF()/DE()/Evaluate(),使用动态函数可以增强效率,但是会降低性能和程序可读性。
◎IIF()函数返回的是表达式的值,如果返回字符串,则需要采用“'String'”的方式。
◎DE()函数会直接以字符串形式输出表达式本身。
◎特别注意IIF()表达式两侧的""的作用。
------------Notes----------------
   <cfset a=“b”> <cfset b=“a”> <cfset c=IIF(a is b,DE(a),a) <cfoutput>#c#</cfoutput> 结果是a。因为a没有双引号会被计算两次!

=========ColdFusion Stored Procedure
◎<cfquery>和<cfstoredproc>都可以进行存储过程操作。
◎存储过程比直接的Query SQL功能更强,更安全,因为通过它可以执行用户不能直接操作的数据库表上的存储过程而获得数据。
◎注意 ,不是每个数据库都有存储过程,MySql和PostgreSql就不支持。而且SQLServer和Oracle的存储过程语法就不同。
◎使用<cfquery>可以创建存储过程,而<cfstoredproc>则不可以,但是后者的确功能更强。
◎<cfstoredproc>具备的两个子标签<cfprocresult>和<cfprocparam>,前者更高效因为它操作的是一个记录集对象。
◎想通过<cfprocparam>操作存储过程,必须知道该传递参数的类型,而且类型的声明是必须有的。
◎另外一个<cfprocparam>标签的属性是Type,其中用到最多的Type值是IN。当声明是IN时,你必须知道存储过程的Value值,用来传递给服务器端的SQL存储过程来执行。
---------------Notes--------------
   Create Procedure spFindEmployee @department varchar(50) As Declare @ENumber int Select @ENumber=EmployeeID,EmployeeDepartment From Employee Where [email protected] return (isNull(@Enumber,0) 对应的存储过程是: <cfstoredproc procedure=“spFindEmployee” Datasource=“dsn_name”> <cfprocparam type=“IN” cfsqltype=“cf_sql_char” value=“marketing” dbvarname=“@department”>

==============ColdFusion Transactions
◎事务处理机制的原则就是,所有的声明和程序都被看作为一个Group,操作过程中,这个Group内的操作要么全部执行,要么一个都不执行,所谓的“隔离”机制
◎尤其是用在多人进行数据库操作时,<cftransaction>更加重要,相当于一个有效的锁,不让多人同时编辑数据库内容
◎使用事务管理一定会影响性能
◎Transaction事务嵌套会有一定程序的操作技巧,而且可读性也会降低,请谨慎使用。

=============ColdFusion中的锁机制
◎为什么要在ColdFusion中使用Lock机制?
◎注意CFLock的Name和Scope属性,是互相排斥的。
◎CFLock的Type类型,是只读(ReadOnly)还是排斥(Exclusive)?考虑性能关系,只读要快过排斥,但是只读应用范围又小。
◎Name属性和Exclusive值的type属性搭配决定Lock内的操作在同一时间内都是单线程。
◎Name属性适合加载于自定义标签,尤其是ColdFusion操作文件系统的自定义标签。
◎Scope属性使用于Session变量,Server变量和Application变量,但是不代表Name属性不能应用在这些变量类型上。
如何应对死锁?技巧就是避免cflock嵌套,还有就是注意不同页面的嵌套锁的顺序。顺序安排不当,有可能造成死锁。总结,只有嵌套的lock才有可能造成死锁。
-----------Notes-------------
   ColdFusion MX使用Lock的原因有2点: 1.防止同一段特定功能代码被同时访问获操作,如<cffile>,<cfdirectory>,<cfupdate>等很多更改特性的标签同时执行。 2.保护同一段代码的执行过程,例如更新Application或者Session变量。 CFLock具备2个互相排斥的属性:Name和Scope,两者只能选其一。CFlock还具备一个type的属性,有只读和排斥锁两种机制。只读锁只允许外部请求读取该锁内容,而不能在该锁范围内设定(写入)任何值。而排斥锁则是在锁生效范围内,禁止一切其他请求,直到该锁被释放为止。 Type的值为ReadOnly只读,可以用于多线程读取,但是不可以写,最适合用于读取一个论坛或者其他多人同时操作的共有变量,如数据源,服务器端设定等等的操作。如果是排斥锁,那么适合写文件系统或者是更新数据库使用。 Name属性应用的典型例子: <cflock name="myfilecontrol" timeout="10" throwontimeout="no" type="exclusive">  <cffile action="copy" destination="c:\cfusionmx\wwwroot\mysamples\cfstep\"     source="c:\cfusionmx\wwwroot\mysamples\cfstep\lock\lock.bac"> </cflock>  对于Scope类型而言,注意嵌套lock的顺序和释放lock的顺序,最好是从最频繁使用的类型开始锁起,比如Session,然后是Application,最后是Server。对于释放的顺序则正好相反。

=============ColdFusion Debugging
◎打开CF administrator,勾选Enable Debugging
◎使用CFSTAT,也要先通过CF Administrator来打开它,两种方式操作,一种是通过WEB,一种是通过console
◎记得使用Dreamweaver MX2004,这是一个独一无二的ColdFusion IDE Tool
◎ColdFusion MX6.1和BlackStone的AdminAPI所有不同。

历史上的今天: [2014/08/29]vim常用设置
[2007/08/29]古董

[ColdFusion MX 开发技巧研究]的回复

Post a Comment~