|
循环是非常强大的编程技术,它使你能够根据特定的条件而重复执行某些代码。用CFLOOP可以执行四种类型的循环:
·索引循环(也叫For循环)
·条件循环(也叫While循环)
·对一个查询进行循环
·对一个列表进行循环
·对一个COM集合进行循环
你通过CFLOOP标签的不同属性来选择使用不同的循环类型。
索引循环
索引循环根据一个数字范围而重复执行循环体,当你知道循环重复执行的次数时,可以使用索引循环。每次执行循环体时,变量INDEX就会加1。下面的例子循环5次,每次循环显示当前的索引值:
<CFLOOP INDEX="LoopCount" FROM="1" TO="5">
The loop index is <CFOUTPUT>#LoopCount#</CFOUTPUT>.<BR>
</CFLOOP>
这个循环在浏览器中显示的结果类似于:
The loop index is 1.
The loop index is 2.
The loop index is 3.
The loop index is 4.
The loop index is 5.
在缺省情况下,每次循环INDEX增加1,你可以设置STEP属性来改变这一缺省值。如下例:
<CFLOOP INDEX="LoopCount" FROM="5" TO="1" STEP="-1">
The loop index is <CFOUTPUT>#LoopCount#</CFOUTPUT>.<BR>
</CFLOOP>
在浏览器中显示的结果类似于:
The loop index is 5.
The loop index is 4.
The loop index is 3.
The loop index is 2.
The loop index is 1.
条件循环
条件循环当一个给定的条件为真时重复执行循环体。使用这种循环时,每次执行循环体都要改变循环条件,直到该条件的值成为“FALSE”。
下面的例子将参数“CountVar”从1增加到5。
<!--- Set the variable CountVar to 1 --->
<CFSET CountVar= 0>
<!--- Loop until CountVar is 5 --->
<CFLOOP CONDITION="CountVar LT 5">
<CFSET CountVar=#CountVar# + 1>
The loop index is <CFOUTPUT>#CountVar#</CFOUTPUT>.<BR>
</CFLOOP>
在浏览器中显示的结果类似于:
The loop index is 1.
The loop index is 2.
The loop index is 3.
The loop index is 4.
The loop index is 5.
查询循环
查询循环对查询结果记录集中的每条记录重复执行循环体。CFLOOP的结果与CFOUTPUT相似。每次执行循环体时,当前记录的各个字段可以被输出。但是,CFLOOP的执行速度比CFOUTPUT慢很多。
例1:用CFLOOP显示一个记录集
下面的例子中, CFLOOP实现了与CFOUTPUT相同的功能:
<CFQUERY NAME="MessageRecords" DATASOURCE="Customer">
SELECT * FROM Messages
</CFQUERY>
<CFLOOP QUERY="MessageRecords">
<CFOUTPUT> #Message_ID# </CFOUTPUT><BR>
</CFLOOP>
例2:一个查询结果的“下n个记录”
CFLOOP也可以对给定了起始点和结束点的一组记录进行循环。这样,你可以从第10个记录开始循环,到第20个记录结束循环。这种机制提供了一个简单的方法,用来得到一个记录集中的下n条记录。下面的例子对查询“MyQuery”的结果中第10到第20条记录进行循环:
<CFSET Start=10>
<CFSET End=20>
<CFLOOP QUERY="MyQuery" STARTROW="#Start#" ENDROW="#End#">
<CFOUTPUT>#MyQuery.MyColName#</CFOUTPUT><BR>
</CFLOOP>
当没有记录或当前记录的序号大于ENDROW的值时,循环结束。
例3:对全部查询结果进行循环
下面的例子用CFINCLUDE将一个查询所查到的所有文件包含到同一个文档中:
<CFQUERY NAME="GetFile" DATASOURCE="Library" MAXROWS=5>
SELECT FileName FROM Templates
</CFQUERY>
<CFLOOP QUERY="GetFile">
<CFINCLUDE TEMPLATE="#FileName#">
</CFLOOP>
如果你要对记录集中的所有记录进行循环,也可以使用CFOUTPUT,如下例所示:
<CFOUTPUT QUERY="MyQuery">
Text and #variablename#
</CFOUTPUT>
注意,在CFOUTPUT标签中指定QUERY属性,即表示对该查询结果的每条记录分别执行CFOUTPUT代码块。
列表循环
列表循环对一个列表中的所有元素分别执行循环体。在列表循环中,用LIST属性指定一个列表或一个包含列表的变量,用INDEX属性指定一个变量名,该变量名用来引用列表中的下一个元素。下面的例子显示列表中的每个人名:
<CFLOOP INDEX="ListElement" LIST="John,Paul,George,Ringo">
<CFOUTPUT>#ListElement#</CFOUTPUT><BR>
</CFLOOP>
缺省情况下,CFLOOP认为列表中的元素以逗号为分隔符,但你可以在DELIMITER属性中指定你所喜欢的分隔符。下面的例子与上一个有相同的效果,不同的是逗号,冒号,和斜杠都会被视为元素分隔符。
<CFLOOP INDEX="ListElement"
LIST="John/Paul,George::Ringo" DELIMITERS=",:/">
<CFOUTPUT>#ListElement#</CFOUTPUT><BR>
</CFLOOP>
指定分隔符时不需要特定的顺序。注意连续的分隔符被视为单个分隔符;因此上例中“George”和“Ringo”之间的两个冒号被视为一个。
对一个COM集合进行循环
CFLOOP的COLLECTION属性使你能对一个COM/DCOM集合对象进行循环。一个COM/DCOM集合对象是一组相似对象(称为“项”)的整体。例如,一个应用程序中一组打开的文档就是一种集合。你用CFLOOP的ITEM属性指定一个变量名,用来在循环体中引用集合中的每一项。COLLECTION属性用来指定要对之进行循环的COM/DCOM集合。
在下面例子中,ITEM属性指定了一个变量file2,于是,在每次执行循环体时,该变量代表集合中的当前项。在CFOUTPUT中,当前项的name属性被显示。
<CFOBJECT CLASS="FileFunctions.files"
NAME="FFunc"
ACTION="Create">
<CFSET FFunc.Path="c:\">
<CFSET FFunc.Mask="*.*">
<CFSET FFunc.attributes=16>
<CFSET x=FFunc.GetFileList()>
<CFLOOP COLLECTION=#FFUNC# ITEM="file2">
<CFOUTPUT> #file2.name# <BR>
</CFOUTPUT>
</CFLOOP>
循环的嵌套
一个CFLOOP代码块中可以包含其它的CFLOOP标签。在这种情况下,每次执行外层循环时,内层循环都会被完整地执行一次。循环可以嵌套任意多层。
在下面的例子中,内层循环体总共会被执行15次:
<CFLOOP INDEX="OuterLoopCount" FROM="1" TO="3">
<CFOUTPUT>Outer loop #OuterLoopCount#</CFOUTPUT><BR>
<CFLOOP INDEX="InnerLoopCount" FROM="1" TO="5">
<CFOUTPUT>Inner loop #InnerLoopCount#</CFOUTPUT><BR>
</CFLOOP>
</CFLOOP>
当ColdFusion在循环体内遇到CFBREAK标签时,就终止循环体的执行,直接处理循环体后面的语句。对于复杂的标签结构以及深层的嵌套,这可以简化程序结构。
下面的例子并不太好,但它显示了CFBREAK标签的功能:
<CFLOOP INDEX="LoopCount" FROM=1 TO=100>
The value is <CFOUTPUT>#LoopCount#</CFOUTPUT>.<BR>
<CFIF LoopCount IS 7>
<CFBREAK>
</CFIF>
</CFLOOP>
在浏览器中显示的结果将是:
The value is 1.
The value is 2.
The value is 3.
The value is 4.
The value is 5.
The value is 6.
The value is 7.
|