ColdFusion 4 初级教程

ColdFusion 初级教程

ColdFusion 4.0的特点:
ColdFusion4.0是ColdFusion发展史上的一个里程碑,与以前的版本相比,
ColdFusion4.0有许多新的特性或增强特性,简述如下:
快速性开发
简单而快速地开发web应用程序一直是ColdFusion的重要特征,在ColdFusion4.0中,
ColdFusion Studio与ColdFusion
Server结合得更加紧密,可视化工具的功能进一步增强,CFML语言的功能也得到了扩展,
从而使程序的开发更加快速。
可升级性配置
ColdFusion已可以用来处理非常大的站点和服务于上万个客户的web应用程序。在4.0版
中提供了强大的新特性,显著地增强了可升级性。如下载平衡,多服务器聚集,高级线
程池,以及与Windows NT性能监视器相集成等。
开放式集成
ColdFusion比其它IRAD系统提供了与邮件服务器,web服务器,和目录系统的更好的集
成。在4.0版中,这种集成已经可以支持XML(Extensible Markup Language)。
安全性
ColdFusion目前在开发和管理两方面提供了安全环境。4.0版的安全特性允许对开发和
管理进行更复杂的安全控制,如开放的认证系统,远程开发安全性等。
ColdFusion 的组成部分:
作为一个集成开发系统,ColdFusion的主要组成部分简述如下:
ColdFusion服务器(ColdFusion Server)
ColdFusion Server是ColdFusion的核心部分,它在NT中运行为一项服务,在WIN95中作
为应用程序运行,其作用是等待Web服务器的请求。当客户(浏览器)向Web服务器请求
文件时,发生如下过程:Web服务器根据文件名判断文件的类型,若是ColdFusion 文件
(后缀名为CFM),Web服务器转而向ColdFusion Server请求该文件,ColdFusion
Server对该文件进行处理后,产生一个标准的HTML文件,交付给Web服务器,Web服务器
再将HTML文返回到客户端。
ColdFusion管理器(ColdFusion administrator)
系统管理员用ColdFusion管理器来配置ColdFusion服务器的各种选项,包括:
·ColdFusion 数据源
·调试信息
·服务器设置
·应用程序安全性
·服务器集
·执行预定网页
·目录映射
ColdFusion工作室(ColdFusion Studio)
ColdFusion Studio是ColdFusion的开发环境。它提供了可视化的开发工具,包括动态
预览,交互式的调试,查询生成器,表达式生成器,工程管理,以及一些控件工具和其
他工具,用这些工具可以快速方便地产生ColdFusion应用程序文件,也可以产生标准的
HTML文件。ColdFusion Studio的功能主要包括:
·查看数据源
·快速生成SQL语句
·从标签选择器中使用HTML和CFML的所有标签
·在特定标签的编辑器中或标签检查器中编辑代码
·在内部浏览器或外部浏览器中显示网页,在设计窗口中可视地编辑网页。
·建立工程来管理应用程序文件,使文件易于维护和上载。
·使用扩展的查询和替换,快速更新一组文件。
·存储代码片段,以便重复使用。
·用表达式生成器生成包含ColdFusion函数,常量,变量,和运算符的表达式。
·调试程序代码。
·查看站点的整体结构。
·检查HTML代码和CFML代码的合法性。
·检验单个文件或整个工程的链接。
·启动文件的版本控件,以利于团队开发。
ColdFusion应用程序
ColdFusion应用程序由一组后缀名为CFM的文本文件构成,这些文件实现了该应用程序
的功能,其中一个重要功能是接收客户输入和格式化输出的客户界面。CFM文件中可以
包含ColdFusion标签,HTML标签,CFSript,JavaSript,以及任何可以嵌入HTML文件中的
内容。
ODBC数据源
ColdFusion应用程序可以操纵任何支持ODBC标准的数据库。
其它数据源
ColdFusion并不只限于操纵ODBC数据源。你也可以通过OLEDB,本地数据库驱动程序,
支持LDAP的目录服务器,支持POP的邮件服务器等途径来取得数据。
ColdFusion扩展
ColdFusion提供了一个基于XML的开放式框架,用来以新的服务器组件扩展ColdFusion
的功能,并可以使用COM,CORBA,C/C++,VBSript,JavaScript,ActiveX,或者CFML等
与企业系统建立连接。
ColdFusion 文档
ColdFusion文档包括两个版本,打印版和联机版,两个版本都很容易定位到你所需要的
信息。文档的内容包括:
·Getting Started
with ColdFusion――包括系统的安装和基本配置,ColdFusion开发系统的组成,以及
CFML语言的简介。
·Administering
ColdFusion Server――讲述如何配置系统以提高性能,如何管理数据源,设置安全等
级,以及其他有关开发环境和站点管理的选项设置。
·Developing Web
Applications with ColdFusion――ColdFusion应用程序开发基础。包括数据源,客户
界面,和Web技术。详细介绍了ColdFusion Studio的开发工具。
·Advanced ColdFusion
Development――介绍ColdFusion的函数,表达式,数组,脚本,以及XML数据交换。还
讨论了客户定制标签,CF API标签,集成对象技术,以及站点管理。
·CFML Language
Reference――提供了所有CFML元素的完整语法和例子程序。
·Quick Reference
Card――CFML的联机参考(Acrobat)。
你可以通过如下途径获得ColdFusion的文档信息:
·PDF格式的文档存储在web根目录的cfdocs字目录下,可以用Acrobat阅读这些
文档。
·在任务栏的ColdFusion
Sever程序组中,运行ColdFusion Documentation,可以阅读ColdFusion联机文档。
·在ColdFusion
Studio中使用联机帮助。




建立ColdFusion应用程序
建立完整的ColdFusion应用程序涉及如下几个方面的内容:
·计划ColdFusion应用。
·建立应用程序文件。
·提供数据源。
·实现安全性。
·调试应用程序。
下面对这几项内容作一简要介绍。




计划ColdFusion应用
在开始编写代码之前,应该先有一个总体的规划,包括:
·研究实际问题,制定解决方案,明确应用程序的功能。
·确定应用程序需要什么数据,需要输出什么数据。
·确定应用程序是否需要客户安全性或资源安全性。
·设计应用程序的整体结构。
许多程序开发者都发现,在编写代码之前先画出程序流程图是有必要的,流程图可以使
编程时思路更加清晰。当然,在编写代码的过程中,随时可以调整计划,使之更加完善。



建立应用程序文件
ColdFusion应用程序由一组CFM文件组成,开发应用程序的过程就是产生这些文件的过
程。CFM文件可以包含CFML标签,HTML标签,客户定制的CFML标签,CFSript,JavaSript,
以及任何可以包含在HTML文件中的内容。
当浏览器(如Netscape,IE)请求一个标准HTML文件时,Web服务器提供该文件给浏览器,
浏览器解释HTML文件的内容,将输出显示在浏览器窗口中。当浏览器请求一个CFM文件
时,将由ColdFusion首先对该文件进行处理,产生一个标准HTML文件,由Web服务器提
供给浏览器。对浏览器来说,CFM文件与HTML文件并无区别。在客户端不需要任何客户
端软件,组件,或插件来支持ColdFusion应用程序,所有的处理都在服务器上完成。
一般地,一个ColdFusion应用程序由许多文件组成,每个文件都完成特定的功能,如提
供客户输入界面,格式化输出,或操纵数据库等。建立应用程序文件有以下几个要点:
·效率――对web应用来说,效率是很关键的,你需要以最快的速度将数据提供
给客户。为此在编程时对一些服务器端的操作,如大型数据库查询等,要注意提高执行
效率。如果你是在为公司的内网开发应用程序,那么你不需要考虑带宽的限制,如果开
发Internet应用程序,则要考虑网络传输速度的限制。
·安全性――利用ColdFusion的认证和授权特性,你可以控制客户对应用程序的
访问。在ColdFusion管理器中设置安全框架后,你可以对客户进行基于NT域或LDAP目录
的认证。
·客户输入界面――为了程序的交互性,用表单(form)接收客户的输入是必要
的。在CFM文件中,你可以建立HTML表单,也可以使用基于Java的ColdFusion表单控件
(如树,数据表格,滑动控件等)而不需要任何Java的知识。
用表单接收客户输入很容易,把表单数据传递给ColdFusion应用程序同样容易。当一个
表单被提交时,表单数据以“表单变量”的形式被传递给该表单的ACTION属性所指定的
文件。该文件用来处理客户的输入,在该文件中可以引用表单变量以显示数据,执行查
询,或执行其它各种操作。



提供数据源



提供数据源
在ColdFusion应用程序可以使用任何被支持的数据源之前,必需先建立该数据源。用
ColdFusion Administrator建立数据源后,与数据源的集成只需指定数据源的名字,即
可执行对数据源的操作。通常,这要用到CFQUERY标签,如下例:
<CFQUERY
NAME="EmployeeName" DATASOURCE="BigCompany">
SELECT FirstName + " " + LastName
FROM Employees AS FullName
</CFQUERY>
在这个例子中,用DADTSOURCE属性指定数据源的名字,表示要执行的SELECT语句作用于
这个数据源。它要求该数据源已经建立才行。


实现安全性


实现安全性
建立ColdFusion应用程序时,你需要考虑几个方面的安全性――要实现开发环境以及应
用程序资源的安全。ColdFusion Server目前支持几个等级的高级安全性:
·远程开发服务安全性(RDS――Remote Development Services Security):开
发者要先通过安全认证,才可以使用ColdFusion Studio访问服务器资源,从而实现了
对服务器资源的保护。
·客户安全性:由程序开发者在ColdFusion应用程序中实现,提供运行时的安全
认证和授权。
·服务器沙盒安全:由ColdFusion管理器控制,提供基于目录访问的运行时安全
性(只在企业版中实现)。
·管理员安全:管理操作可以受到安全保护,防止未经授权的访问。



调试应用程序


调试应用程序
ColdFusion Studio提供了交互式的调试工具,程序开发者可以用它设置断点,监视变
量,计算表达式和变量的值,分步执行代码,查看堆栈。
你也可以在浏览器中打开程序文件来测试它,不需要进行任何编译和连接。多数开发者
在本地计算机上运行ColdFusion和Web服务器,随时用浏览器查看应用程序的运行时状
态。ColdFusion提供了几个调试选项,帮助开发者排除程序中的错误。对每个
ColdFusion对话――即每次浏览器请求一个CFM文件时,如果设置了相应的debug选项,
则调试信息可以显示在浏览器窗口中,显示在网页内容的底部。



手册的内容


手册的内容
根据以上的概述可以看出,ColdFusion4.0 包括很多方面的内容,掌握这些内容可以开
发出非常强大的Web应用程序。作为 入门级手册,本手册将不会涵盖ColdFusion的全部。
本手册主要侧重于CFML语言的使用,通过本手册的学习,读者将学会如何用CFML语言编
写交互式的Web应用程序。而关于ColdFusion Administrator 和ColdFusion Studio等
方面的详细内容,请读者参考其他书籍或ColdFusion的文档。
学习本手册的内容不需要读者有开发Web应用程序的经验,但应具备HTML的基本知识以
及关于WWW的基本概念。


条件选择


条件选择
每当客户请求一个应用程序文件时,ColdFusion根据该文件的CFML标签和HTML标签,动
态地生成一个HTML网页。程序流程控制使你可以控制ColdFusion对文件的处理,根据不
同的条件生成不同内容的网页。
条件选择
ColdFusion提供了两种处理条件选择的方法:CFSWITCH和CFIF。
使用CFSWITCH,CFCASE和CFDEFAULTCASE
CFSWITCH标签计算一个表达式的值,然后将控制传给与表达式的值相匹配的CFCASE标签。
你也可以提供一个CFDEFAULTCASE标签,当所有的CFCASE标签都不能与表达式的值相匹
配时,控制转到CFDEFAULTCASE标签。
使用CFSWITCH标签比使用一串CFIF/CFELSEIF标签的效率要高,而且代码易于阅读。但
是,CFSWITCH标签的VALUE属性必须是已知的常量。
下面的简单例子显示了CFSWITCH标签的语法:
<CFSWITCH EXPRESSION=#Switch#>
<CFCASE VALUE="4"> Case four </CFCASE>
<CFCASE VALUE="1"> Case one </CFCASE>
<CFCASE VALUE="2"> Case two </CFCASE>
<CFCASE VALUE="3"> Case three </CFCASE>
<CFCASE VALUE="2.5"> Case two and a half
</CFCASE>
<CFCASE VALUE="5"> Case five </CFCASE>
<CFCASE VALUE="6"> Case six </CFCASE>
<CFDEFAULTCASE> Default case </CFDEFAULTCASE>
</CFSWITCH>
每个CFCASE标签的VALUE属性都是一个常量,CFSWITCH标签将表达式的值与各个CFCASE
标签的VALUE值作比较,并执行相匹配的CFCASE标签内的代码。
使用CFIF,CFELSEIF和CFELSE
你也可以用CFIF,CFELSEIF和CFELSE来选择执行某一段代码。典型的用法如下,其中
CFELSE不是必须要的。:
<CFIF value operator value>
... HTML and CFML tags
<CFELSE>
... HTML and CFML tags
</CFIF>
注意,在CFIF中要使用运算符,如IS,IS NOT等,而不是等于号。
例1:根据条件返回查询结果
要检测一个查询是否返回了记录,你可以检测该查询的记录数是否为0:
<CFIF #CustomerSearch.RecordCount# IS 0>
<!--- Inform user that we had no hits --->
<P>Sorry, no customers matching your
criteria were found.</P>
<CFELSE>
<!--- Show the list of customers retrieved --->
<CFOUTPUT Query="Customers">
#FirstName# #LastName# <BR>
</CFOUTPUT>
</CFIF>
在下面的这个例子中,只有客户明确地请求这段代码的内容时(记录在变量
showcustomers中),才显示这部分内容:
<CFIF #Form.ShowCustomers# IS "Yes">
Customer List: <P>
<CFOUTPUT Query="Customers">
#FirstName# #LastName# <BR>
</CFOUTPUT>
</CFIF>
例2:根据条件显示记录内容
条件选择标签最强大的功能之一是对查询结果的每条记录作不同的处理。要实现这一点,
需把条件选择标签放在CFOUTPUT代码段中。这时,将对查询结果中的每条记录循环执行
条件选择语句。这使你可以根据一个记录中是否包含某个字段而作不同的显示。例如,
在下面的例中,并非所有的记录都有电话号码,因此,将CFIF放在CFOUTPUT中,确保只
有Phone字段不为空时,才显示电话号码的内容。
<CFOUTPUT QUERY="Contacts">
<HR>
Name: #Name# <BR>
Title: #Title# <BR>
<CFIF #Phone# IS NOT "">
Phone: #Phone# <BR>
</CFIF>
</CFOUTPUT>
综合条件选择语句
综合条件选择就是用逻辑运算符将多个条件结合起来。其典型语法为:
<CFIF (value operator value) Boolean Operator
(value operator value) Boolean Operator
(value operator value)>
... HTML and CFML tags
</CFIF>
最常用的逻辑运算符是AND,OR,和NOT。
例如,下面的例子假设一个名为“GetEmployee”的查询返回了一个雇员的有关信息。
如果查询结果表明该雇员是销售部的,并且获得了超过5000元的奖金,则显示一条信息。
<CFIF (#GetEmployee.Department# IS "Sales") AND
(#GetEmployee.Bonus# GE 5000)>
<H4>Congratulations on your sales bonus!</H4>
</CFIF>
使用CFELSEIF
CFELSEIF使你能够进行复杂的条件处理,将多个条件结合起来,而不需要使用嵌套的IF
语句。其语法为:
<CFIF condition1>
Display this text only if condition1 is true.
<CFELSEIF condition2>
Display this text only if condition1 is false and condition2 is true.
<CFELSEIF condition3>
Display this text only if condition1
and condition2 are false and condition3 is true.
<CFELSE>
Display this if condition1, condition2,
and condition3 are false.
</CFIF>



重定向(CFLOCATION)


重定向(CFLOCATION)
使用CFLOCATION标签,你可以将对某个文件的请求重定向到另一个文件或另一个URL。
这有助于定义一个网页,在其中执行一个或多个查询,然后转到另一个网页,或者你希
望客户所指向的URL依赖于一个动态参数。
例如,你可以用CFIF检测一个客户是否已登录(客户密码是否经过了确认?),如果没
有,则将该客户重定向到另一个网页,在该网页中告诉客户其密码没有经过确认:
<CFIF #NewPassword# IS NOT ‘#PasswordConfirmation#’>
<CFLOCATION URL="invalidpassword.cfm">
</CFIF>
也可以在CFLOCATION标签的URL属性中使用动态参数。例如,要根据一个名为“Page”
的变量动态地决定将客户重定向到哪个网页,可以用如下方法:
<CFLOCATION URL="#Page#">



停止处理文件(CFABORT)


停止处理文件(CFABORT)
ColdFusion处理CFM文件时若遇到CFABORT标签,则停止文件处理,将CFABORT标签之前
的处理结果返回给浏览器。CFABORT通常用来根据特定的条件而停止文件的处理。如下
例所示,CFABORT标签没有属性:
<P>This HTML content is returned to in the final page.</P>
<CFABORT>
<P>This HTML content is NOT returned in the final page.</P>



包含文件


包含文件
当你的ColdFusion应用程序越来越复杂时,应该考虑代码的重用。CFINCLUDE标签可以
实现这个目的。该标签将另一个文件插入当前的文件,从而很方便地重复使用通用的代
码。
注意:使用CFINCLUDE时不要将CFIF,CFLOOP,或CFOUTPUT等代码块分隔到不同的文件
中。
CFINCLUDE标签有一个TEMPLATE属性,该属性指定了一个已经存在的文件,当
ColdFusion遇到CFINCLUDE标签时,会将这个文件视为当前文件的一部分来处理并返回
到客户端。例如,如果你在一个文件中创建了一个变量,并使用了一个CFINCLUDE标签,
则在被包含的文件中你可以引用这个创建于主文件中的变量。CFINCLUDE标签的语法为:
<CFINCLUDE TEMPLATE=" FileName">
此处,FileName代表被包含文件的相对路径。例如要包含当前文件的上一级目录中的文
件index.cfm:
<CFINCLUDE TEMPLATE="../index.cfm">
在下面这几种情况下,要使用CFINCLUDE:
·你需要在不同的网页中显示同一个表格,可以建立一个文件用于显示该表格,
然后将这个文件包含在需要它的地方,而不必从一个网页拷贝和粘贴相同的代码到另一
个网页。
·你可以建立两个文件”header.cfm”和”footer.cfm”,分别将这两个文件包
含在每个网页的开始和结束处,从而只要修改这两个文件就可以改变整个站点的外观。
·可以将复杂的CFIF/CFELSE嵌套作为包含文件,从而使程序更加清晰。



建立循环(CFLOOP)


建立循环(CFLOOP)
循环是非常强大的编程技术,它使你能够根据特定的条件而重复执行某些代码。用
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.



理解应用程序框架


理解应用程序框架
前文中已多次出现关于Application.cfm文件和“应用程序”的内容,本章将对此进行
较为详细的介绍。
理解应用程序框架
一个ColdFusion应用程序是一组协同工作的文件的集合。从最简单的客户目录,到复杂
的Internet商务系统,都可以是一个应用程序。而且你可以把单个应用程序结合起来,
组成复杂而强大的Web系统。
ColdFusion利用一个特殊的文件Application.cfm来定义一个应用程序。当浏览器请求
一个ColdFusion文件时,ColdFusion向上搜索该文件的目录树,查找Application.cfm
文件。找到该文件时,将其包含到当前被申请文件的开头处。如果被申请文件的目录树
中有多个Application.cfm文件,ColdFusion使用所找到的第一个文件。
注意:ColdFusion向上搜索目录树,一直搜索到磁盘的根目录。
按照上述的搜索规则,所有包含了同一个Application.cfm的文件属于同一个“应用程
序”,此应用程序的名字即为Application.cfm文件中CFAPPLICATION标签的NAME属性所
提供的名字。
由于应用程序的每个文件都在开头处包含了同一个Application.cfm文件,因此该文件
中的内容将对每个文件都执行一次,从而该文件的内容对整个应用程序都有效。这正是
Application.cfm的特殊之处,除此之外,该文件只是个标准的CFM文件。


实现应用程序框架


实现应用程序框架
利用Application.cfm而实现的ColdFusion应用程序框架有四个基本组成部分:
·应用程序级设置
·客户状态管理
·错误处理
·Web服务器安全性集成
这些功能使你更容易组织应用程序文件,建立复杂的Web应用。
定义应用程序
开发ColdFusion应用程序的一个重要步骤是设计其目录结构。建立应用程序之前,首先
要为该应用程序建立一个根目录。有些程序文件也许需要存在子目录中。
建立应用程序框架的步骤如下:
在应用程序的根目录建立Application.cfm文件,用于整个应用程序的设置。
设定应用程序级设置和错误处理
用CFAPPLICATION标签允许客户状态管理。
允许你所需要的其它特性,如安全(用CFAUTHENTICATE),锁定(用CFLOCK),或错误
处理(用CFERROR)。
你可以只用一个Application.cfm,也可以对应用程序的不同部分使用不同的
Application.cfm文件。下图所示的目录树显示了两种不同的应用程序框架。
·在左面的例子中,一个名为Web Wonders,Inc的公司,用应用程序根目录下的
一个Application.cfm文件控制整个应用程序。
·在右面的例子中,Bandwidth Associates公司对不同的部门使用不同的
Application.cfm文件。只有Products目录下的文件使用根目录下的Application.cfm,
Marketing和Sales目录有自己的Application.cfm。
每个ColdFusion文件只能包含一个Application.cfm。这是一种隐式的CFINCLUDE,如果
目录树中存在Application文件,你没有办法不包含它。(正因如此,该文件是设置应
用程序级变量的理想位置。)
当被申请的文件中有一个CFINCLUDE标签,显式地包含了另一个文件时,ColdFusion不
会为被包含的文件搜索Application.cfm。



应用程序级设置


应用程序级设置
在Application.cfm文件中可以进行应用程序级的设置,如:
·应用程序名:设置CFAPPLICATION标签的NAME属性。
·客户状态管理选项:设置CLIENTMANAGEMENT,CLIENTSTORAGE属性。
·Application变量和Session变量:设置SESSIONMANAGEMENT,SESSIONTIMEOUT,
APPLICATIONTIMEOUT等属性。
·缺省变量
·执行错误处理的网页
·数据源
·排斥性锁定
·应用程序级常量
这些设置在整个应用程序范围内有效。


客户状态管理


客户状态管理
前面已经讲过,对Web服务器来说,浏览器的每一次请求都是独立的,两次请求之间没
有任何联系。而对一个应用程序来说,在不同的文件中识别同一个客户是至关重要的。
这正是客户状态管理要实现的功能。允许了客户状态管理(CLIENTMANAGEMENT=”Yes”)
后,即可以用Client变量在不同的文件中识别特定的客户。
注意,要在需要客户状态管理的每个文件中都设置CLIENTMANAGEMENT=”Yes”,因此
Application.cfm是进行这项设置的最好的地方。


错误处理


错误处理
使用CFERROR标签,你可以在发生错误时显示定制的网页。该标签通常与CFTRY,
CFCATCH,和CFTHROW一同使用。
ColdFusion有两种类型的错误:
请求(REQUEST)――当被请求的文件中的代码发生错误时,产生请求错误。
合法性(VALIDATION)――当客户提交Form时违反了Form字段的合法性检查时,产生合
法性错误。
缺省情况下,ColdFusion返回一个显示错误信息的标准网页。但是你可以定制错误信息
网页,使它们与你站点的风格相一致。定制的错误信息网页还使你能控制客户所见的信
息。
CFERROR标签用来设置错误信息网页。你可以为每个网页分别设置,但由于定制的错误
信息网页通常应用于整个站点,将CFERROR标签放在Application.cfm中效率更高。
错误信息网页是一个包含HTML标签和有关的错误参数的文件,注意,这个文件中不能包
含CFML标签。有关的错误参数依赖于错误的类型。所有的错误参数都使用前缀“Error”
(例如,Error.Diagnostics)。
下面的例子显示了一个请求错误(request error)的定制错误信息网页:
<HTML>
<HEAD>
<TITLE>Products - Error</TITLE>
</HEAD>
<BODY>
<CFOUTPUT>
<H2>Sorry</H2><P>An error occurred when you requested
this page.
Please email the Webmaster to report this error. We
will work to correct the problem and apologize
for the inconvenience.</P>
<TABLE BORDER=1>
<TR><TD><B>Error Information</B> <BR>
#Error.DateTime# <BR>
#Error.Template# <BR>
#Error.RemoteAddress# <BR>
#Error.HTTPRefer#
</TD></TR></TABLE>
</CFOUTPUT>
</BODY>
</HTML>
下面的例子显示了一个合法性错误(validation error)的定制错误信息网页:
<HTML>
<HEAD>
<TITLE>Products - Error</TITLE>
</HEAD>
<BODY>
<H2>Oops</H2>
<P>You failed to complete all the fields
in the form. The following problems occurred:</P>
#Error.InvalidFields#
</BODY>
</HTML>


Web服务器安全性集成


Web服务器安全性集成
你可以将Web服务器所提供的客户认证和安全性与你的应用程序相集成。如果你的应用
程序文件放在Web服务器的文档目录中,你就可以使用Web服务器的本地认证和加密服务
来实现应用程序的安全性。
每种Web服务器都用不同的方法配置安全选项,建立用户,建立用户组,以及设置特权。
关于这些信息可以参阅你的Web服务器的文档。
你也可以使用Web服务器的认证系统。当Web服务器认证一个客户时,会唯一地返回一个
变量,在你的应用程序中可以通过CGI变量“Auth_User”引用它。你可以用这个变量访
问存于数据库中的用户附加信息。
另外,ColdFusion Server提供了一种安全框架,控制对应用程序,网页,数据源等的
访问。你可以在Application.cfm文件中用CFAUTHENTICATE标签为应用程序建立一个安
全域。有关的详细信息请参阅ColdFusion文档的Advanced ColdFusion Development部
分。
ColdFusion提供了两个用于加密字符串的函数:Encrypt()和Decrypt().关于这两个函
数请参阅ColdFusion文档的CFML Language Reference部分。因为ColdFusion将网页返
回给Web服务器,你也可以用Web服务器的加密技术对网页进行加密。对于要求高度安全
的商务程序,这会特别有用。


缺省变量和常量


缺省变量和常量
在Application.cfm文件中设置缺省变量和常量是有用的。例如,你可以指定:
·你所使用的数据源
·域名
·风格设置,如字体,颜色。
·其它重要的应用程序级变量
下面显式了一个完整的Application.cfm文件:
<!--- Set application name and enable client
variables option, with client variables stored in
a data source called mycompany --->
<CFAPPLICATION NAME="Products"
CLIENTMANAGEMENT="Yes"
CLIENTSTORAGE="mycompany">
<!--- Install custom error pages --->
<CFERROR TYPE="REQUEST"
TEMPLATE="RequestErr.cfm"
MAILTO="admin@company.com">
<CFERROR TYPE="VALIDATION"
TEMPLATE="ValidationErr.cfm">
<!--- Set application constants --->
<CFSET HomePage="http://www.mycompany.com">
<CFSET PrimaryDataSource="CompanyDB">


用CFLOCK进行排斥性锁定


用CFLOCK进行排斥性锁定
CFLOCK标签用来对一段代码进行锁定。括在此标签内的代码在同一时间只能被一个请求
来执行。执行CFLOCK代码块的请求对该段代码进行排斥性锁定,因此当一个请求正在执
行CFLOCK代码块时,不允许其它的请求执行该段代码。ColdFusion按照“先来先服务”
的原则进行排斥性锁定。
将修改共享数据的代码括在CFLOCK标签中,可以确保不会有两个用户同时修改数据。通
常,更新应用程序范围的变量,如Server变量,Application变量,Session变量时,应
该使用CFLOCK标签。如下例所示:
<HTML>
<HEAD>CFLOCK Example</HEAD>
<BODY>
<H3>CFLOCK Example</H1>
<CFLOCK NAME="ApplicationData" TIMEOUT=30>
<CFIF NOT
IsDefined("Application.IsApplicationDataInitialized")>
<CFSET Application.IsApplicationDataInitialized=TRUE>
<CFSET Application.ImportantValue = 5>
</CFIF>
</CFLOCK>
<CFOUTPUT>
Important value is #Application.ImportantValue#
</CFOUTPUT>
</BODY>
</HTML>



Application变量,Session变量,和Client变量的使用


Application变量,Session变量,和Client变量的使用
关于这三种变量在第二章已经有较为详细的讨论,在此仅作一些补充说明。
Application.cfm是个标准的CFM文件,可以在Application.cfm中使用动态参数,根据
查询结果或客户信息等动态地决定应用程序级的设置。
2. 这三种变量是在整个应用程序范围内存在的变量,此处“应用程序范围”指的是由
同一个Application.cfm文件所确定的范围,应用程序根目录下的所有文件不一定都处
在同一个“应用程序范围”。
3. 应注意这三种变量与缺省变量的区别。缺省变量也可以在整个应用程序范围中访问,
但它是定义在Application.cfm中,靠每个文件都包含了Application.cfm而实现应用程
序范围的共享,实际上在每个文件中,缺省变量都是局部变量,在一个文件中改变缺省
变量的值不会影响到其它文件(除非使用了动态参数)。而Application变量,Session
变量,和Client变量既使不定义在Application.cfm中,也可以在整个应用程序范围共
享,在一个文件中改变这三种变量的值将会影响到整个应用程序。
4. 当使用CFLOCATION重定向一个文件时,Client.URLToken会自动被追加在URL后面。
你可以在CFLOCATION标签中设置ADDTOKEN=”NO”来禁止这种追加。
5. 如果Client变量存储在系统注册表中,而你需要把它转移到另一台计算机中,你可
以输出(export)注册表中的响应键值,然后输入(import)到目标计算机的系统注册
表中。
Application变量,Session变量,和Client变量的比较
下表显示了Application变量,Session变量,和Client变量之间的关系:
变量种类
变量类型
应用程序名
客户IDs
Client Mgmt
Session Mgmt
过期时间
Client
可选
必需
必需
不需要
可选
Session
可选
必需
必需
必需
可选
Application
必需
不需要
不需要
不需要
可选
注意Session变量需要客户状态管理。
Application变量和Session变量的使用技巧
通常,Applicaton变量和Session变量用来存储不常需要写但经常需要读的信息。在多
数情况下,这些变量的值只在应用程序启动时(Application变量)或Session建立时
(Session变量)被赋值。然后变量的值在应用程序或Session的生存期内被多次引用。
使用Application变量时,要记住这些变量被一个应用程序的多个实例共享。因此,
Application变量的值有可能会被同时运行的其它实例所覆盖。如果用这些变量存储
“一次写入,多次读出”的信息,则不会出什么问题,否则应该考虑同一应用程序的不
同实例之间的相互影响。(注:当多个客户同时链接到一个应用程序时,即产生该应用
程序的多个“实例”。)
下面的例子演示了Application变量的使用。注意这段代码位于Application.cfm文件中,
因为要执行对每个应用程序文件都需要的操作时,Application.cfm是最好的地方。在
这个例子中,一个变量“Application.Initialized”被用来作为标志,指明应用程序
变量是否已经初始化。
<!--- Declare a name for this application. This
automatically turns on application scope --->
<CFAPPLICATION NAME="AccountCheck">
<!--- Test to see if application variables have already been defined
--->
<CFIF NOT IsDefined("application.initialized")>
<CFSET application.query1= ??? >
<CFSET application.query2= ??? >
<CFSET
application.initialized=1>
</CFIF>


数据源基础


数据源基础
在ColdFusion中,“数据源”包括可以从本地或通过网络访问的许多种数据形式。你可
以查询一个站点,LDAP服务器,POP邮件服务器,以及各种形式的文档。然而在大多数
情况下,应用程序需要访问的是数据库,在本章中数据源被定义为“操作数据库的人口
点”。
开放数据库连接(Open
Database Connectivity――ODBC)
ODBC是应用程序连接到数据源的标准接口。系统中必须安装了ODBC驱动程序,并为每个
数据源配置该驱动程序。通过Windows控制面板中的ODBC数据源管理器,可以查看系统
中已安装的ODBC驱动程序。
从http://www.microsoft.com/data/odbc/kill/download.htm可以了解关于ODBC的更多
内容,并可以下载ODBC3.0编程参考。
安装ODBC驱动程序
你可以从Windows开始菜单中的ColdFusion程序组中安装Microsoft Data Access
Components(MDAC2.0)。由此可安装的ColdFusion ODBC驱动程序包括:
·Microsoft SQL Server
·Microsoft Access和FoxPro 数据库
·Borland dBase 兼容数据库
·Microsoft Excel Worksheet
·分隔的文本文件


添加ODBC数据源


添加ODBC数据源
要在ColdFusion应用程序中对一个已经存在的数据库进行操作,首先要为该数据库建立
ColdFusion数据源。从ColdFusion
Administrator中打开Data Source ODBC网页,在此处可建立数据源,步骤如下:
为新数据源输入名字。
从列表中选择相应的ODBC驱动程序。
单击Add,打开Create ODBC Data Source 网页。
输入新数据源的相关信息,单击CF Settings,显示可选设置。
单击Create,新数据源即被添加到系统中并显示在数据源列表中。单击列表中的数据源
名字可以编辑数据源的相关信息。
要测试一个数据源,打开Verify Data Source
网页,从列表中选择该数据源即可。
建立数据源后,就可以在应用程序中使用它。


ODBC命名规范


ODBC命名规范
不同的数据源其表和字段的名字有许多不同之处。作为数据源的标准,ODBC定义了一个
命名规范。尊循该命名规范,可使你的代码更易于移植。
该规范要求名字以字母开头,只能包含字母,数字和下划线。ColdFusion使用与此相同
的标准来标识查询字段。因此,你在ColdFusion和ODBC中使用的表和查询都要符合这一
规范。
虽然ODBC允许表名中带有空格,ColdFusion却不允许。你必须用别名来访问包含空格的
表和字段名。另外,有些数据源要求你指定表的所有者和限定词才能访问该数据源。
通过SQL的“AS”关键字可以用一个标准的名字作为非标准名字的别名,从而绕过
ODBC/ColdFusion的命名要求。但是,这种做法很烦,并导致代码难于读懂,难以移植。
表的所有者和限定词
通常,在SQL语句中用ODBC数据源的名字即可以访问该数据源。而SQL
Server是个例外,它要求扩展的信息。
下面的语句用于返回SQL Server的表Orders中所有记录。要实现这一点,必须在表名前
面加上数据库名(orderdb)和数据库所有者(dbo)。
SELECT * FROM orderdb.dbo.order
其他的客户/服务器数据库如Oracle和Sybase也有自己特殊的要求。详细内容可参阅产
品文档。


使用本地数据库驱动程序


使用本地数据库驱动程序
ColdFusion企业版可以安装用于从ColdFusion中直接访问数据库的驱动程序。由于它们
不需要通过ODBC驱动程序管理器来执行SQL查询,因此操作大量的数据时效率更高。
ColdFusion目前提供的本地驱动程序包括:
·Oracle 7.3----需要Oracle 7.3.3 客户程序。
·Oracle 8.0----需要Oracle 8.0.4.0.0
·Sybase System 11----需要Sybase 11.11客户库。
允许本地驱动程序的属性
你可以使用下面的属性覆盖Administrator中的设置:
·DBSERVER――输入Sybase或Oracle服务器名。
·DBNAME(仅Sybase使用)――输入数据库名。
·BLOCKFACTOR(仅ODBC和Oracle使用)――设置每个查询所返回的最多记录数。
缺省值是1,最大值是100。某些ODBC驱动程序会在运行时动态地减少这个参数的值。
CFQUERY,CFINSERT,CFUPDATE,CFGRIDUPDATE,和CFSTOREDPROC标签支持这些属性。
注意:对Sybase SQL Server,用CFQUERY调用存储过程的语法对ODBC和本地Sybase驱动
程序有所不同。ODBC需要括号和“Call”,而本地驱动程序不需要。
ODBC语法:
<CFQUERY DATASOURCE="" NAME="">
{call dbo.stored_procedure_name}
</CFQUERY>
本地驱动程序语法:
<CFQUERY DATASOURCE="" NAME="">
dbo.stored_procedure_name
</CFQUERY>


使用OLE DB连接


使用OLE DB连接
OLE DB驱动程序包含在Win32平台的ColdFusion企业版中。通过安装第三方的OLE DB提
供者,可以在ColdFusion中访问许多新的数据存储类型,包括:
·基于MAPI的数据,如Microsoft Exchange和Lotus Mail
·非关系型数据库,如Lotus Notes
·LDAP 2.0数据
·来自OLE应用程序的数据
·主框架数据
·HTML和文本数据
安装和配置了第三方软件后,你可以打开Administrator的Data
Sources OLE DB页,添加该数据提供者所支持的数据源。与其他数据源一样,你可以输
入数据源名字和描述,当需要时选择高级设置。你还需要输入:
Provider----ProgID
ProvederDSN----数据源名字



结构化查询语言(SQL)概述



结构化查询语言(SQL)概述
SQL是操纵数据库的标准语言。其语法非常简单,但功能非常强大,可以进行复杂的数
据操作。在ColdFusion中,将SQL语句包装在CFQUERY标签中来执行数据操作。
一个SQL语句是一个由从句组成的命令,从句指定了要执行的操作,数据源以及任何完
成操作所需的结构。每个从句必须起始于一个关键字。下面是包装在CFQUERY标签中的
SQL语句的一个简单例子:
<CFQUERY NAME="zip_02140"
DATASOURCE="Customer">
SELECT first_name, last_name, phone
FROM Customer
WHERE zip_code = 02140
ORDER BY last_name
</CFQUERY>
这个语句用关键字SELECT搜索数据库。第一行指定了要选择的数据库字段。第二行用一
个从句指定了要对其进行操作的数据源,本例中即表的名字。第三个从句设定了返回记
录的限定条件,只返回满足条件的记录。第四个从句按指定的字段对返回结果进行排序。
注意:有些DBMS使用非标准的SQL语法(称为方言)。ColdFusion不对CFQUERY中的SQL
语句进行检查,因此你可以使用任何你的数据源所支持的SQL语法。关于具体的非标准
SQL语法请参考你的DBMS文档。
最常用的SQL命令包括:
·SELECT――取出特定的记录
·INSERT――添加一条新记录
·UPDATE――改变特定记录的值
·DELETE――删除特定的记录
最常用的从句包括:
·FROM――指定要对其进行操作的数据源
·WHERE――对操作设定一个或多个条件
·ORDERBY――对查询结果进行排序
·GROUP BY――对查询结果进行分组
SQL扩展
ODBC对SQL进行了一些扩展,这些扩展为不同的数据库系统提供了统一的语法,从而使
程序更加容易移植。最常用的ODBC SQL扩展包括日期/时间格式,转换函数,和存储过
程。
日期/时间格式
ODBC定义了日期和时间的统一格式。如果你需要在SQL语句中使用日期/时间值,则必须
使用ODBC的格式。日期,时间,和日期/时间值的格式如下表所示:

格式
例子
日期
{d’yyyy-mm-dd’}
{d’1995-06-20}
时间
{t’hh:mm:ss’}
{t’15:34:08’}
日期/时间
{ts’yyyy-mm-dd hh:mm:ss’}
{ts’1995-06-20 15:34:08’}
当你使用ColdFusion的Insert和Update操作时,日期字段会自动被检查并转换为ODBC日
期格式,因此你不需要格式化用户输入。但是,当你在CFQUERY标签中使用SQL语句时,
你应该保证日期和时间有正确的格式。实现的方法之一是对相应的自段进行合法性检查,
这可以确保用户输入的日期值的合法,并自动转换为ODBC格式。
转换函数
许多数据库驱动程序允许你在SQL语句中调用函数。这些函数通常完成字符串操作,日
期/时间操作,以及数值计算。由于不同的数据源中这些函数通常具有不同的名字和语
法,ODBC定义了一套与数据源类型无关的转换函数。
调用ODBC函数的语法为:
{ fn scalar-function }
其中scalar-function代表函数名及其参数。下面的例子展示了两个常用的转换函数在
SQL语句中的使用。第一个例子调用CURDATE获得当前的日期:
SELECT *
FROM Orders
WHERE ShipDate>={ fn CURDATE()
第二个例子调用LEFT获得用户输入的邮编的最左边5个字符:
SELECT *
FROM Customers
WHERE PostalCode={ fn LEFT(‘#Form.PostalCode#’,
5)
小结:
本章对ColdFusion数据源进行了简单介绍。对一般的开发而言,最常使用的是ODBC数据
源。其要点是:在操作数据库之前,先要为数据库建立数据源,该数据源作为应用程序
与数据库之间的接口。然后在应用程序中指定要对之进行操作的数据源,使用标准的
SQL语句,即可完成数据库的查询,添加,修改等操作。
另外要注意ODBC的标准规范和ODBC的扩展。
其它类型的数据源属于较高级的内容,在此仅作一般了解即可。



用CFQUERY标签选择数据


用CFQUERY标签选择数据
要从数据库中选择和输出数据,你需要在CFM文件中包含选择数据和输出结果的段落。
第一步是定义一个数据库查询。ColdFusion使用CFQUERY标签定义查询。CFQUERY标签的
完整语法为:
<CFQUERY NAME=" query_name"
DATASOURCE=" ds_name"
USERNAME=" username"
PASSword=" password"
MAXROWS=" number"
TIMEOUT=" milliseconds"
BLOCKFACTOR=" 1" (default)
DBPOOL=" database connection pool name"
DEBUG=" yes/no">
SQL statements
</CFQUERY>
这里有一个简单的例子,从一个与ODBC数据源CompanyDB相连的数据库Company中选择所
有记录:
<CFQUERY NAME="EmployeeList"
DATASOURCE="CompanyDB">
SELECT *
FROM Employees
</CFQUERY>


使用动态查询参数


使用动态查询参数
通过使用动态参数(变量)动态地确定SQL语句的内容,你可以充分利用CFQUERY标签的
强大功能。动态参数包括Form自段,URL参数,和CGI环境变量。
在SQL语句中包含动态参数时要将其扩在井号(#)中,如#State#。当ColdFusion遇
到扩在井号中的文本时,就搜索所有的Form变量,URL变量,cookies变量,Client变量和
CGI变量,寻找与井号内相匹配的变量名。找到之后,即用变量的值代替变量名。
例子:动态SQL
如果你建立了一个表单,用户用它来根据名字搜索员工信息,你可以使用下面的动态
SQL语句:
SELECT *
FROM Employees
WHERE LastName = ‘Form.LastName#’
如果用户在LastName字段中输入”Rucker”,则对数据库执行的SQL语句为:
SELECT *
FROM Employees
WHERE LastName = ‘Rucker’
使用单引号
在上面的例子中你已经看到,参数Form.LastName扩在单引号中。对字符串来说, 这是
必须的,对数字则不需要。那么当一个参数中本身包含一个或多个单引号时会不会产生
错误呢?这时需要特殊的处理。ODBC允许在扩在单引号中的字符串里用两个连续的单引
号代表一个单引号。但在ColdFusion中,你不需要作这种处理。在把参数包含在SQL语
句中之前,ColdFusion会自动将单引号替换为两个连续的单引号。
注意:在特殊情况下,你也许不需要将单引号自动替换,这时可以使用
PreserveSingleQuotes函数。


执行存储过程


执行存储过程
许多数据库系统允许为常用的查询建立存储过程。关于存储过程的建立请参考你的DBMS
文档。
ColdFusion提供了两种执行存储过程的方法。
从CFQUERY中执行存储过程
你可以在CFQUERY中调用存储过程,如下例所示。这个查询调用了一个SQL Server存储
过程,返回特定装卸日期的所有定单信息:
<CFQUERY NAME="GetOrdersForDate"
DATASOURCE="Orders Database">
{ call OrderDB.dbo.sp_getorders( #OrderDate# ) }
</CFQUERY>
这种方法是可行的,但推荐使用的方法是用CFSTOREDPROC标签,以实现更大的灵活性。
从CFSTOREDPROC标签中执行存储过程
CFSTOREDPROC标签通过标签属性设置SQL调用参数,简化了取出数据的过程,并提供了
CFQUERY标签所不具备的功能。它支持ODBC数据源和本地数据源。
CFSTOREDPROC用来指定存储过程及其数据源及设置选项。该标签中嵌有另外两个标签:
·CFPROCPARAM――设置数据和存储过程类型,变量及其值,以及其他选项。
·CFPROCRESULT――指定输出结果,如果返回多个记录还可以限制输出结果。
在决定使用以上哪一种方法之前,要考虑以下问题:
·这个查询需要指定输入/输出参数吗?
·这个查询需要返回结果代码吗?
·需要从返回的多个记录中再作选择吗?
如果这三个问题的回答都是“Yes”,那么要使用CFSTOREDPROC标签。


日期格式函数


日期格式函数
CodFusion返回的日期格式可能不是你需要的显示格式。为此ColdFusion提供了一组函
数,用于格式化日期值。下表中的函数可以对日期,时间,和数字进行格式转换:
日期,时间,和数字格式函数
函数
描述
DateFormat(Date[,mask])
区分大小写。建立日期值的用户定制格式。
TimeFormat(Date[,mask]
区分大小写。建立时间值的用户定制格式。
NumberFormat(Number[,mask])
建立数字的用户定制格式
下表所列的函数可用于特殊的格式转换:
格式化函数
函数
描述
HTMLCodeFormat
用于显示来自TEXTAREA的HTML代码。删除回车符,保留特殊字符(<,>,”,&
等)。
HTMLEditFormat
与HTMLCodeFormat类似,不同之处在于它不在输出文本中加入<PRE>标签。
ParagraphFormat
用于显示输入TEXTAEA的数据。将CR/CF序列转换为空格,将成对CR/CF序列转换为HTML
段落符(<P>)。
PreserveSingleQuotes
用在SQL语句中,禁止ColdFusion自动处理动态参数中的单引号。例如,在SQL语句中使
用动态参数,不对单引号进行转换:
SELECT * FROM
Customers
WHERE CustomerName
IN (#PreserveSingleQuotes(CustNames)#)
StripCR
用于显示输入TEXTAREA字段的预先格式化(PRE)的数据。删除所有的回车符。
URLEncodeFormat
将字符串参数进行URL编码(用加号“+”代替空格,用相应的16进制数代替非字母的
字符)。这个函数使你可以通过URL传递任意的字符串(包括含有空格的)。
ColdFusion会自动对URL参数进行解码。
ValueList&QuotedValueList
这两个输出函数有助于使用查询结果来进行后续的查询。
函数ValueList以一个查询字段为参数,如Customers.CustomerID,返回查询结果中每
条记录的该字段的值,用逗号隔开。
例如,如果你执行了一个查询,返回四个记录,则函数ValueList的输出结果类似于:
22,43,50,96。函数QuotedValueLIst的结果则为:’21’,’43’,’50’,’96’。
YesNoFormat
将逻辑型数据显示为Yes或No的形式。非零值显示为Yes,零值显示为No。


显示查询结果


显示查询结果
一旦你在应用程序文件中建立了一个查询,你就可以在其他CFM文件中引用该查询的结
果。查询结果可以用来动态地产生HTML网页。
当你学习使用CFML标签时,要记住你也可以在程序中使用HTML标签和文本。在你使用
HTML标签和文本的地方,ColdFusion简单地将标签和文本直接传递给客户流览器。输出
查询结果的最灵活的方式是使用CFOUTPUT标签。CFOUTPUT标签可以对某个特定的查询进
行输出,也可以输出多个查询的内容。一个CFOUTPUT标签中可以包含:
·纯文本
·HTML标签
·引用查询字段
·引用动态参数,如Form字段
·函数
基本的输出代码有如下的语法:
<CFOUTPUT QUERY=" queryname" MAXROWS= n >
Literal text, HTML tags, and
dynamic field references (e.g., #FullName#)
</CFOUTPUT>
CFOUTPUT中的数据库字段名
有些数据库,如Microsoft Access,允许字段名中带有空格,例如”Region Name.”。
ColdFusion在CFOUTPUT中不支持对这种字段的引用。要和ColdFusion兼容,应避免在表
名和字段名中使用空格,这使应用程序对不同的数据库系统具有最大的兼容性。你可以
用下划线作分隔符,如”Region_Name”。
字段名必须以字母开头,且只能包含字母和数字。你 可以用SQL关键字AS为字段名起一
个别名。例如,语句:
SELECT 401K AS FK FROM Employee_Withholding
在CFQUERY中可以得到正确处理。
例子:CFOUTPUT
在下面的例子中,我们用CFOUTPUT标签显示查询EmployeeList的查询结果。选择显示的
内容是每个员工的姓,名,和电话号码。在变量名中指定查询名是个很好的编程习惯。
下面给出程序的完整代码:
<!--- Query to select customers --->
<CFQUERY NAME="EmployeeList"
DATASOURCE="CompanyDB">
SELECT *
FROM Employees
</CFQUERY>
<HTML>
<HEAD>
<TITLE>Employee List</TITLE>
</HEAD>
<BODY>
<H2>Employee List</H2>
<!--- Output section --->
<CFOUTPUT QUERY="EmployeeList">
<HR>
#EmployeeList.FirstName# #EmployeeList.LastName#
(Phone: #EmployeeList.PhoneNumber#) <BR>
</CFOUTPUT>
</BODY>
</HTML>
你可以直接通过URL来申请这个网页,如:
http://myserver/cfdocs/employeelist.cfm
或者通过超链接引用:
<A HREF=”myserver/cfdocs/employeelist.cfm">Employee
List</A>
这个例子的输出结果的HTML代码类似于:
<HR>
Deborah Jones (Phone: 612-227-1019) <BR>
<HR>
John Smith (Phone: 507-452-7224) <BR>
<HR>
Frank Wilson (Phone: 612-831-9555) <BR>
嵌套CFOUTPUT和分组
你可以对CFOUTPUT进行嵌套,以实现查询结果的分组显示。分组的实现是通过指定
CFOUTPUT标签的GROUP属性,然后将另一个CFOUTPUT嵌人前一个CFOUTPUT。内层
CFOUTPUT上面和下面的内容用于给每一组显示一个标题和脚注信息。
例子:分组
下面的代码使用CFOUTPUT的GROUP属性,根据”CourseLevel”的值将查询结果分组显示。
ORDER BY关键字根据CourseLevel字段的值对查询结果进行排序。CFOUTPUT嵌套没有层
数的限制,如果你想使用多级分组,你需要在SQL查询中设置多级排序(例如,”ORDER
BY Region,State”)。
<CFQUERY NAME="Courses"
DATASOURCE="CourseDB">
SELECT *
FROM CourseList
WHERE Department_ID = ?Form.Department#
ORDER BY CourseLevel
</CFQUERY>
<CFOUTPUT QUERY="Courses"
GROUP="CourseLevel">
<H4>#CourseLevel#</H4>
<UL>
<CFOUTPUT>
<LI> #CourseNumber# - #CourseName#
</CFOUTPUT>
</UL>
</CFOUTPUT>
这个例子在流览器中显示的结果为:
Basic
100 - Physiology
Intermediate
510 - Neurobiology
500 - Plant Biology
Advanced
820 - Neurobiology
800 – Microbiology
CFQUERY 属性
执行每个CFQUERY时,有三个属性可以提供记录数信息。
记录数
记录数
描述
RecordCount
查询所返回的记录总数。
CurrentRow
CFOUTPUT正在处理的当前记录。
ColumnList
返回用逗号隔开的查询字段列表。
例子:查询字段
这个例子返回查询CustomerList的记录数和查询字段的列表:
<CFOUTPUT>
The search returned information
on #CustomerList.RecordCount# customers.<BR>
Columns queried were #CustomerList.ColumnList#.
</CFOUTPUT>
要显示每个记录的记录序号,可以用如下语法:
<CFOUTPUT QUERY="CustomerList">
#CurrentRow# - #FirstName# #LastName# <BR>
</CFOUTPUT>
返回记录集的一部分
对于较大的记录集,你也许希望只显示该记录集的一部分。用CFOUTPUT标签的STARTROW
和MAXROWS属性可以做到这一点。STARTROW指定记录集中第一条要返回的记录。MAXROWS
指定了要返回的记录总数。
例子:记录集的一部分
这个例子显示查询EmployeeList的结果记录集中第10到20条记录:
<CFOUTPUT QUERY="EmployeeList"
STARTROW="10" MAXROWS="20">
#FirstName# #LastName# #Phone# <BR>
</CFOUTPUT>
在CFOUTPUT中使用参数
CFOUTPUT不仅仅用于显示查询到的数据。你也可以用CFOUTPUT显示Form变量,URL变量,
Cookie,Client变量,Server变量,Session变量,Application变量,和CGI环境变量。
引用这些变量时要注意使用正确的前缀,这样ColdFusion才能将这些变量与查询结果的
字段名区分开。与查询字段一样,变量必须扩在井号中。对查询结果的每条记录,参数
值都被显示一次。注意,若要显示井号本身,应用两个连续的井号表示一个井号。


在表格中显示查询结果


在表格中显示查询结果
当查询返回的记录数较少时,用简单的HTML文本显示就够了。但当记录很多时,你需要
更有条理的显示。CFOUTPUT标签可以包含HTML代码,因此你可以使用标准的HTML表格标
签,动态地生成表格。
CFML 表格
CFML提供了两个表格标签,CFTABLE和CFCOL,用来以表格的形式显示查询结果。这种格
式使用HTML的<PRE>标签精确地控制显示内容的宽度和对齐方式。如下例所示:
<CFTABLE QUERY="Messages" MAXROWS=10>
<CFCOL HEADER="Subject" WIDTH=25
TEXT="<I>#Subject#</I>">
<CFCOL HEADER="User Name" WIDTH=15
TEXT="#UserName#">
<CFCOL HEADER="Date" WIDTH=15
ALIGN=RIGHT
TEXT="#DateFormat(DateSubmitted)#">
</CFTABLE>
这段程序建立了一个三列的表格,通过CFCOL标签的HEADER属性为三个列分别指定了标
题“Subject”,“User Name”,和“Date”。该表格的数据来自名为Messages的查询,
最多显示10条记录。显示的内容由TEXT属性所给的HTML标签和动态参数决定。
CFCOL中的双引号和井号
ColdFusion在CFCOL的TEXT属性中用双引号和井号作为分隔符。因此当用到这两个符号
本身时,要用两个连续的双引号来代替双引号,用两个连续的井号来代替井号。
例如,要显示一个文档列表,为每个文档提供一个超链接,你必须在TEXT属性中使用超
链接标签(该标签的HREF属性要用双引号作为分界符)。因此必须使用如下语法:
TEXT="<A
HREF=""/documents/#DocFile#"">#DocName#</A>"
HTML表格
虽然CFTABLE标签产生的预定义格式表格是有效的,但HTML表格具有更大的灵活性。为
了使这种转换更容易,CFTABLE提供了另一个属性HTMLTABLE。这个属性将CFTABLE提供
为一个HTML表格,而不是预定义格式的表格。使用HTMLTABLE属性会使CFTABLE和CFCOL
的某些属性具有另外的含义:
·CFTABLE的HEADLINES属性和COLSPACING属性将被忽略。
·CFCOL的WIDTH属性被解释为占可用屏幕宽度的百分比,而不是字符数。
注意:使用HTML表格不是一定要通过CFTABLE的HTMLTABLE属性,你可以用CFOUTPUT直接
建立HTML表格。
记录细节的动态显示
显示查询结果的最常用的方法是用表格,如CFTABLE,或其他更简洁的列表。用这种列
表可以快速浏览记录集,但显示的信息量有限。解决这一问题的方法是以简洁的方式显
示记录,然后为每个记录创建一个超链接,链接到另一个提供详细信息的网页。
建立到记录细节的链接
建立到记录细节的链接包括如下步骤,假设已经有一个文件显示了记录摘要列表。
从记录摘要中选择一个关键词作为可点击的链接,如公司名。
将所选的关键词扩在超链接标签(<A>)中,链接到一个显示细节信息的文件。在
URL中应传递一个唯一的记录标识,这样被链接的文件才知道要显示的是哪一条记录。
建立一个用于显示记录细节的CFM文件。
例子:记录细节信息
假设你要显示一个公司列表,让用户点击一个公司名来获得关于该公司的详细信息。再
假设在数据库中每个公司用一个唯一的Company_ID来标识,而文件compinfo.cfm可以显
示给定Company_ID的公司的详细信息。在这种情况下,使用如下的语法:
<CFOUTPUT Query="CompanySearch">
<A HREF="compinfo.cfm?Company_ID=#Company_ID#">
#CompName#</A><BR>
#ContactPerson# (#ContactPhone#) <BR>
</CFOUTPUT>
公司名显示为一个超链接,它将Company_ID作为一个URL参数,激活文件compinfo.cfm。
由该文件显示相应公司的详细信息。使用这种技术,实现记录细节的动态显示的通用形
式如下(注意HREF属性应处在单独的一行中):
<A HREF="TemplateFile?Record_ID=#Record_ID_Data#">#
RecordName#</A>
这里TemplateFile是实现记录细节显示的文件。该文件用Record_ID_Data(通过URL参
数Record_ID传递)确定要显示哪一条记录。用户点击RecordName来激活该文件。
在CFTABLE中嵌人细节链接
你也可以在CFCOL标签的TEXT属性中嵌人超链接。由于TEXT属性用双引号作为分界符,
超链接的HREF属性也用双引号作为分界符,要注意引号的正确使用。下面是这种技巧的
通用形式:
<A HREF="" TemplateFile? Record_ID=#
Record_ID_Data#"">#RecordName#</A>
注意在HREF属性中用两个连续的双引号表示一个双引号。如果上一个例子改为使用TEXT
属性在表格中嵌人超链接,其语法应为:
TEXT="<A
HREF=""compinfo.cfm?Company_ID=#Company_ID#"">#CompNa
me#</A>"
再次强调,整个TEXT属性要写在同一行中。


建立HTML查询表单


建立HTML查询表单
创建动态参数的最常用的方法是使用作为用户界面的表单(Form)。你可以在表单中包
含文本框,选择框,单选按钮,多选按钮等,供用户用来输入信息。表单很容易建立,
并可提供许多灵活的数据输入选项。表单提交时,Form变量会自动被创建,你可以利用
这些变量执行对数据源的查询。
除了HTML表单,你还可以用ColdFusion的CFFORM标签建立表单。关于这方面的详细内容
后文有述。
例子:查询表单
下面的例子是一个简单的查询表单:
<FORM ACTION="employeesearch.cfm"
METHOD="Post">
<PRE>
Last Name: <INPUT TYPE="text"
NAME="LastName">
Department:
<SELECT NAME="Department">
<OPTION>Accounting
<OPTION>Administration
<OPTION>Engineering
<OPTION>Sales
</SELECT>
<INPUT TYPE="Submit" VALUE="Search">
</PRE>
</FORM>
这个表单有两项输入:LastName和Department.用户可以在文本框中输入名字,从选择
列表中选择一个部门。每个OPTION标签提供给用户一个选项。当提交按钮被点击时,
ACTION属性所指定的文件会被打开,Form变量作为动态参数被传递给该文件。
假设用户输入了名字“Peterson”并选择了“Sales”。当她点击提交按钮时,下面的
Form变量会被传递给文件employeesearch.cfm:
LastName=Peterson
Department=Sales
设置表单的ACTION属性和METHOD属性
你必须设置表单的ACTION属性,告诉流览器当用户点击提交按钮时调用哪一个文件。你
还必须将表单的METHOD属性设置为Post。在下面的例子中,当用户点击提交按钮时,调
用employeesearch.cfm文件。
<FORM ACTION="employeesearch.cfm"
METHOD="Post">
实现数据查询字段
为表单建立查询字段非常简单。你只需要为你想搜索的数据库字段建立表单查询字段。
为了使文件有更好的可读性,可以让表单字段与数据库字段有相同的名字。
例如,如果你有一个表Employees,表中有三个字段FirstName,LastName,和
Department,你的表单字段可以是:
Name: <INPUT TYPE="text" NAME="FirstName">
LastName: <INPUT TYPE="text" NAME="LastName">
Department: <INPUT TYPE="text"
NAME="Department">
URL参数REQUSTTIMEOUT
当请求一个ColdFusion文件时,你可以在URL中传递REQUESTTIMEOUT参数,指定数据源
连接超时的秒数,以防止一个数据源连接花费太多的时间。这个参数将覆盖ColdFusion
Administrator中的缺省值。其使用的语法为:
http://myserver.com/cfpages?REQUESTTIMEOUT=100
例子:动态SQL
下面的文件searchform.cfm建立了一个查询表单:
<HTML>
<HEAD>
<TITLE>Employee Search</TITLE>
</HEAD>
<BODY>
<FORM ACTION="employeesearch.cfm"
METHOD="Post">
<PRE>
Last Name: <INPUT TYPE="text"
NAME="LastName">
Department: <SELECT NAME="Department">
<OPTION>Accounting
<OPTION>Administration
<OPTION>Engineering
<OPTION>Sales
</SELECT>
<INPUT TYPE="Submit" VALUE="Search">
</PRE>
</FORM>
</BODY>
</HTML>
当用户点击提交按钮时,下面的文件Employeesearch.cfm用来选择和显示查询结果:
<!--- CFML application page to implement employee search --->
<!--- Query the database --->
<CFQUERY NAME="EmployeeList"
DATASOURCE="CompanyDB">
SELECT *
FROM Employees
WHERE LastName = ?LastName#
AND Department = ?Department#
</CFQUERY>
<!--- Page header --->
<HTML>
<HEAD>
<TITLE>Employee Search Results</TITLE>
</HEAD>
<BODY>
<H2>Organization Search Results</H2>
<!--- Summarize search criteria for user --->
<CFOUTPUT>
<P>The search for #Form.LastName# in
the #Form.Department#
returned these results:</P>
</CFOUTPUT>
<--- Display results --->
<CFOUTPUT QUERY="EmployeeList">
<HR>
#FirstName# #LastName# (Phone: #PhoneNumber#)<BR>
</CFOUTPUT>
<!--- Page footer --->
<P>
Thank you for searching the employee database!</P>
<HR>
</BODY>
</HTML>
模式匹配查询
当你允许用户输入文本作为查询条件的一部分时,你通常不想查询与输入完全匹配的值,
你通常需要查询与输入文本类似的值。在这种情况下,可以使用模式匹配查询。要实现
模式匹配查询,可以将一个或多个通配符(在ODBC中用“%”表示)与LIKE运算符结合
使用。
例如,让用户填充一个名为“LastName”的Form字段,查询一员工信息,可以用如下语
法:
SELECT *
FROM Employees
WHERE LastName LIKE ‘#LastName#%’
这个查询返回每个其名字以用户输入值开头的员工的信息。例如,若输入“Jon”,返
回的记录可能有”Jones”和”Jonson”。


返回MIME内容


返回MIME内容
MIME(Multipurpose Internet Mail Extensions)的目标之一是在数据文件和用于显
示和编辑该文件类型的应用程序之间建立联系。MIME通过为每种数据文件提供一个内容
类型来实现这一点。
在Web上,数据的交换要通过超文本传输协议(HTTP)。Web服务器和Web客户必须对文
件的内容类型达成一致,并且客户端软件必须能够理解该种文件,或者能找到另外的能
使用该文件的应用程序。
缺省情况下,ColdFusion使用的内容类型是text/HTML。尽管text/HTML是Web上最常使
用的内容类型,但在某些情况下,你需要用ColdFusion动态地产生其他内容类型的文档。
例子:返回VRML
根据一个URL参数动态地返回一个VRML(Virtual
Reality Modeling Language)原型,使用如下语法:
<CFCONTENT TYPE="x-world/x-vrml">
<CFQUERY NAME="GetCyberCafeRoom"
DATASOURCE="CyberCafe">
SELECT VRML_Script
FROM CyberCafeRooms
WHERE FloorNumber=#URL.FloorNumber#
</CFQUERY>
<CFOUTPUT QUERY="GetCyberCafeRoom">
#VRML_Script#
</CFOUTPUT>
向客户端传送非HTML的内容时,一个重要的考虑是流览器是否能理解该内容类型。所有
的主流流览器都预先定义了一系列内容类型,这些类型或者被流览器本身所支持,或者
被一个辅助的应用程序(通常称为查看器)所支持。因此,在使用流览器有可能不支持
的内容类型之前,先对用户作出提示是很重要的。
例子:生成Excel表格
下面的例子用ColdFusion动态生成一个Excel表格,该表格可以在Microsoft
Excel中直接打开。要无缝地实现这一点,你必须将本地的Microsoft Excel与
text/tablelimited内容类型相关联。
<CFCONTENT TYPE="text/tabdelimited">
<CFQUERY NAME="GetFinancialData"
DATASOURCE="MutualFunds">
SELECT *
FROM Funds
WHERE Fund_ID=#Fund_ID#
</CFQUERY>
<P>Month Value Percentage Gain Estimate</P>
<CFOUTPUT QUERY="GetFinancialData">
#Month# #Value# #PercentageGain# #Estimate#
</CFOUTPUT>
字段之间和标题之间的空格实际上是制表符(Tab)。Excel需要制表符才能正确地处理
表中的字段。
注意,ColdFusion会把程序文件中出现在CFCONTENT标签之前的输出文本删掉。
例子:返回一个文件
下面的例子演示了如何用CFCONTENT标签从服务器返回一个文件。这种方法的优点在于
你可以控制对文件的访问。FILE属性允许你返回不存在Web服务器文档根目录下的文件。
<CFCONTENT TYPE="text/tabdelimited"
FILE="c:/land/topo.txt">
注意,在这种用法中,如果ColdFusion在CFCONTENT标签之后发现其他输出内容,将会
产生错误。
小结:
本章主要介绍了如何进行数据查询和结果显示,实现数据库查询和显示的最常用的流程
如下:
建立数据源。
通过表单字段接收用户输入。
在ACTION所指的文件中,使用CFQUERY标签,用DATASOURCE属性指定数据源,根据Form
变量的内容(即用户的输入信息),用标准SQL语句对数据源进行查询。然后使用
CFOUTPUT,用QUERY属性指定查询名,对查询结果中的每条记录进行显示。
在CFOUTPUT中可以使用各种HTML标签。


插入数据


插入数据
向数据库中插入数据通常由两个文件完成:
·一个数据插入表单
·一个插入执行文件
你可以用CFFORM标签或标准HTML Form标签建立数据插入表单。当表单被提交时,Form
变量被转递给一个文件,该文件执行对数据源的插入操作(以及其他需要的操作)。该
文件中应该包含显示给用户的响应信息(如“记录已插入”等)。
建立HTML数据插入表单
与所有的表单一样,你必须指定ACTION属性和METHOD属性。METHOD属性通常为“POST”,
ACTION属性指定表单提交时调用的CFM文件。
你需要为数据库中每个要插入数据的字段建立Form输入字段。Form字段的名字必须与数
据库字段的名字相同。例如,如果有一个名为Employees的表,表中有三个字段
FirstName,LastName,和Phone,则你建立的Form字段应类似于:
First Name: <INPUT TYPE="text"
NAME="FirstName">
Last Name: <INPUT TYPE="text"
NAME="LastName">
Phone: <INPUT TYPE="text" NAME="Phone">
隐含Form字段
隐含字段是一种特殊的Form字段,它是表单的一部分,但不显示给用户。当用户提交表
单时,隐含字段的值(建立字段时指定)与用户输入的其他字段值一同返回。例如,如
果你希望用户提交的表单中始终包含提交的位置(哪个站点)信息,你可以使用下面的
隐含字段:
<INPUT TYPE="Hidden" NAME="SiteName"
VALUE="CompanyName">
使用这个隐含字段,每次用户提交表单时,将返回一个名为”SiteName”的变量,值为”
CompanyName”。
例子:HTML数据插入表单
下面的例子是个简单的HTML表单:
<FORM ACTION="insdata.cfm" METHOD="Post">
<!-- Data entry fields -->
<PRE>
First Name: <INPUT TYPE="text"
NAME="FirstName">
Last Name: <INPUT TYPE="text"
NAME="LastName">
Phone: <INPUT TYPE="text" NAME="Phone">
<INPUT TYPE="Submit" VALUE="Enter
Information">
</PRE>
</FORM>
这个表单有三个输入:FirstName,LastName和Phone。用户可以在文本框中输入数据,
然后点击提交按钮。Form提交后,ACTION属性激活的文件可以访问所有Form字段的值
(包括隐含字段),该文件可能会显示这些变量,或将它们插入到数据库中。假设用户
在三个字段中分别输入了”William”,”Gibson”,”(212)323-9734”,则表单提交时,
下面的变量被传递:
FirstName=William
LastName=Gibson
Phone=(212)323-9734


用CFINSERT建立一个插入执行文件


用CFINSERT建立一个插入执行文件
执行简单插入操作的最容易的方法是用CFINSERT标签。在多数情况下,不需要使用可选
的属性。TABLEOWNER属性和TABLEQUALIFIER属性很少用到,提供这两个属性是为了与某
些需要指定表所有者和(或)表限定词的ODBC驱动程序相兼容。需要指定OWNER和
QUALIFIER的ODBC驱动程序包括SQL Server和Oracle驱动程序,以及Intersolv
Q&E驱动程序。
CFINSERT数据源
假设ODBC数据源名为”Employees DB”,你要插入数据的表名为”Employees”。那么
CFINSERT标签的使用方法为:
<CFINSERT DATASOURCE="Employee DB"
TABLENAME="Employees">
例子:插入数据
下面的文件是一个用于插入数据的表单:
<!-- HTML form to input data -->
<HTML>
<HEAD>
<TITLE>Input Form</TITLE>
</HEAD>
<BODY>
<FORM ACTION="EmployeeInsert.cfm"
METHOD="Post">
<PRE>
First Name: <INPUT TYPE="text"
NAME="FirstName">
Last Name: <INPUT TYPE="text"
NAME="LastName">
Phone: <INPUT TYPE="text"
NAME="Phone">
<INPUT TYPE="Submit"
VALUE="Insert Information">
</PRE>
</FORM>
</BODY>
</HTML>
其ACTION属性所指向的Employeeinsert.cfm文件如下,该文件中用CFINSERT完成简单的
数据插入:
<!--- Inserts the data from the the HTML Form --->
<CFINSERT DATASOURCE="Employee DB"
TABLENAME="Employees">
<HTML>
<HEAD>
<TITLE>Input Form</TITLE>
</HEAD>
<BODY>
<CENTER><H2>Thank You!</H2></CENTER>
<HR>
<P>Thank you for entering your data into
our database - please visit our site often!</P>
<HR>
</BODY>
</HTML>
注意:CFINSERT执行的是简单的插入操作,只能将Form变量的值(即用户输入到表单字
段中的数据)插入到指定数据源的指定表中。它要求Form字段名与表的字段名相同,因
为它是根据名字将Form变量与表中的字段相对应起来。


用CFQUERY建立插入执行文件


用CFQUERY建立插入执行文件
要执行复杂的插入操作,可以在CFQUERY标签中使用SQL INSERT语句。SQL INSERT语句
更加灵活,你可以有选择地插入数据,还可以在INSERT语句中使用函数。
SQL INSERT语句的基本语法为:
INSERT INTO tablename (columnnames)
VALUES ( values)
VALUES关键字指定新记录的各字段的值。你必须按照与columnnames相同的顺序键入这
些值。在前一个例子中,如果使用CFQUERY标签插入表单数据,应使用如下语法:
<CFQUERY NAME="AddEmployee"
DATASOURCE="Employee DB">
INSERT INTO Employees (FirstName, LastName, Phone)
VALUES (‘#Form.FirstName#’‘#Form.LastName#’
‘#Form.Phone#’)
</CFQUERY>


更新数据


更新数据
更新数据库中的数据通常也需要两个文件:
·一个数据更新表单
·一个更新执行文件
数据更新表单接收用户的输入,表单被提交时激活更新执行文件,该文件中包含
CFUPDATE标签或CFQUERY标签,用于执行对数据库的更新操作。该文件中还应该包含响
应给用户的信息(如“数据已更新”等)。


建立数据更新表单


建立数据更新表单
数据更新表单与数据插入表单类似,主要的不同有两点。一个数据更新表单包含对要更
新的记录的主关键字的引用。主关键字是一个数据库表格中的一个或多个字段,主关键
字可以唯一地确定表中的每一条记录。例如,在一个员工姓名和地址表中,只有
Employee_ID对每个记录具有唯一值。另外,由于数据更新表单用于更新已经存在的数
据,因此表单的内容通常取自数据库中。你必须首先用CFQUERY标签从数据库中选择记
录,然后在CFOUTPUT中建立表单,用选择出的记录的值填充表单字段。
设计主关键字
在数据更新表单中指定主关键字的最容易的方法是使用一个隐含字段,其值为要更新的
记录的主关键字的值。如下例所示:
<!--- Query to select record --->
<CFQUERY NAME="EmployeeRecord"
DATASOURCE="Employee DB">
SELECT *
FROM Employees
WHERE Employee_ID = #URL.EmployeeID#
</CFQUERY>
<HTML>
<HEAD>
<TITLE>Input Form</TITLE>
</HEAD>
<BODY>
<CFOUTPUT QUERY="EmployeeRecord">
<!--- Input form --->
<FORM ACTION="EmployeeUpdate.cfm"
METHOD="Post">
<!--- Primary Key value indicating record to update --->
<INPUT TYPE="Hidden" NAME="Employee_ID"
VALUE="#Employee_ID#">
<PRE>
FirstName: <INPUT TYPE="Text" NAME="FirstName"
VALUE="#FirstName#">
LastName: <INPUT TYPE="Text" NAME="LastName"
VALUE="#LastName#">
Phone: <INPUT TYPE="Text" NAME="Phone"
VALUE="#Phone#"><BR>
<INPUT TYPE="Submit" VALUE="Update
Information">
</PRE>
</FORM>
</CFOUTPUT>
</BODY>
</HTML>
在这个例子中,Employee_ID是表Employees的主关键字,于是在HTML表单中使用了一个
隐含字段Employee_ID(注意Form字段与数据库字段名字相同)。该隐含字段指示
ColdFusion要更新的是哪一条记录。本例中主关键字来自URL参数。



用CFUPDATE建立数据更新执行文件


用CFUPDATE建立数据更新执行文件
根据前台的数据更新表单进行简单数据更新操作的最容易的方法是使用CFUPDATE标签。
CFUPDATE标签的使用方法与CFINSERT完全一样。
要使用CFUPDATE标签,你必须在表单中包含组成主关键字的所有字段。CFUPDATE会自动
检测待更新的表中的主关键字字段并将它们从被提交的Form变量中搜索出来。
ColdFusion根据主关键字选择要更新的记录,然后用其余的Form字段更新该记录。
在下面的例子中,ODBC数据源名为”Employee DB”,要更新的表为”Employees”。利
用前台的表单,CFUPDATE标签的使用如下:
<!--- This is the page EmployeeUpdate.cfm --->
<CFUPDATE DATASOURCE="Employee DB"
TABLENAME="Employees">
<HTML>
<HEAD>
<TITLE>Reply</TITLE>
</HEAD>
<BODY>
<H2>Thank You!</H2>
<HR>
<P>Thank you for updating your data in
our database - please visit our site often!</P>
<HR>
</BODY>
</HTML>



用CFQUERY建立数据更新执行文件


用CFQUERY建立数据更新执行文件
要执行复杂的数据更新,你可以在CFQUERY标签中使用SQL UPDATE语句。SQL UPDATE语
句比CFUPDATE标签具有更大的灵活性。其基本语法为:
UPDATE tablename
SET columnname = value
WHERE condition
在SET从句中必须指定一个或多个字段,然后指定一个常量或表达式作为该字段的值。
对于上一个例子,如果使用CFQUERY代替CFUPDATE,其语法应为:
<CFQUERY NAME="UpdateEmployee"
DATASOURCE="Employee DB">
UPDATE Employees
SET Firstname=’#Form.Firstname#’
LastName=’#Form.LastName#’
Phone=’#Form.Phone#’
WHERE Employee_ID=#Employee_ID#
</CFQUERY>
注意,WHERE从句是可选的。但如果你在UPDATE语句中不使用WHERE从句,则数据库表中
的所有记录都会被更新。


删除数据


删除数据
删除数据库中的数据可以由一个单独的文件完成,该文件包含一个执行SQL DELETE语句
的CFQUERY标签。SQL DELETE语句的语法为:
DELETE FROM tablename
WHERE condition
WHERE从句控制删除语句删除一条记录,几条记录,或所有记录。
下面的例子从表Employees中删除一条记录:
DELETE FROM Employees
WHERE Employee_ID = 1
下面的例子从表Employees中删除几条记录。这个例子假设在销售部(Sales
department)有不止一个员工:
DELETE FROM Employees
WHERE Department = ‘Sales’
下面的例子从表Employees中删除所有记录:
DELETE FROM Employees
注意,对数据库的删除操作是不可恢复的,因此要小心使用delete语句。
例子:执行删除操作的完整文件
<!--- Page to
delete single employee record --->
<CFQUERY NAME="DeleteEmployee"
DATASOURCE="Employee DB">
DELETE FROM Employees
WHERE Employee_ID = #URL.EmployeeID#
</CFQUERY>
<HTML>
<HEAD>
<TITLE>Delete Employee Record</TITLE>
</HEAD>
<BODY>
<H3>The employee record has been deleted.</H3>
</BODY>
</HTML>



数据输入检查


数据输入检查
当你使用表单接收用户输入以执行数据库查询时,你通常希望在执行查询之前能对用户
的输入进行检查。尤其是SQL语句需要特定的数据类型时,这种检查更加必要。
你可以对提交给ColdFusion Server的任何表单数据进行检查。ColdFusion提供了几种
不同的数据输入检查类型。
数据输入检查类型
检查类型
描述
客户端
在CFFORM中,你可以通过ONVALIDATE属性指定一个JavaSript函数,用该函数完成输入
检查。CFINPUT,CFGRID,CFSLIDER,CFTEXTINPUT,和CFTREE等标签都具有ONVALIDATE
属性。
服务器端
在CFFORM中,你可以在支持输入检查的标签(如CFINPUT,CFTEXTINPUT)中使用
VALIDATE属性,允许输入检查。
你也可以在HTML表单中使用隐含字段,这可以对几种通用数据类型进行输入检查。
必须输入的Form字段
HTML表单的缺点之一是它不能将字段定义为必须输入的字段。而对数据库应用程序来说,
这是个很重要的要求,因此ColdFusion提供了一种服务器端的机制,强制用户必须在字
段中输入数据。
要将一个字段定义为必须输入的字段,可以用一个隐含字段,其名字由后缀
“_required”和要求必须输入数据的字段名组合而成。例如,要强制用户在字段”
FirstName”中输入数据,可以使用如下语法;
<INPUT TYPE="hidden"
NAME="FirstName_required">
如果用户没有在FirstName字段中输入数据,ColdFusion将不接受表单提交,而是返回
一个错误信息,通知用户该字段必须输入数据。你可以用隐含字段的VALUE属性提供定
制的错误信息。例如你想显示错误信息“You must enter your first name.”,可以
使用如下语句:
<INPUT TYPE="hidden"
NAME="FirstName_required"
VALUE="You must enter your first name.">
隐含Form字段
HTML表单的另一个缺点是你不能对用户输入的数据进行检查。而ColdFusion可以利用表
单中的隐含字段,对数据输入进行几种类型的检查。你可以用来进行输入检查的隐含字
段后缀有如下几种:
使用隐含字段进行表单输入检查
字段名后缀
VALUE属性
描述
_integer
定制的错误信息
检查用户是否输入了数字,如果用户输入的是浮点数,则转换为整数。
_float
定制的错误信息
检查用户输入的是否是数字,不进行浮点数到整数的转换。
_range
MIN=最小值
MAX=最大值
检查输入的数字是否在指定的范围内,你可以指定上界和下界或其中之一。
_date
定制的错误信息
检查用户输入的是否是日期值,并将日期值转换为ODBC日期格式。它可以接受最常用的
日期格式,如9/1/98,Sept.9,1998。
_time
定制的错误信息
检查时间值的正确输入,并将时间值转换为ODBC时间格式。
_eurodate
定制的错误信息
检查用户输入的是否是标准欧洲格式的日期值,并将 其转换为ODBC格式。
例子:隐含字段
下面的例子演示了如何用隐含字段进行数据输入检查。在这个例子中,被检查的表单包
含字段”Rooms”,”Guests”,和”ArrivalDate”。为了保证Rooms字段输入一个整数,
Guests字段的值在1到12之间,ArrivalDate字段输入一个合法的日期值,可以在表单中
加入下列的隐含字段:
<INPUT TYPE="hidden"
NAME="Rooms_integer"
VALUE="You must enter a number for the Rooms field.">
<INPUT TYPE="hidden"
NAME="Guests_range"
VALUE="MIN=1 MAX=12">
<INPUT TYPE="hidden"
NAME="ArrivalDate_date"
VALUE="This is not a valid arrival date.">
VALUE属性是可选内容,如果你不指定该属性,则显示缺省的错误信息。
当表单被提交时,ColdFusion扫描所有的字段,寻找你所指定的检查规则,然后对用户
的输入进行分析。如果输入的数据违反了任何规则,ColdFusion会显示给用户一个错误
信息,用户必须返回前一个屏幕,修改输入的数据,然后重新提交表单。只有通过数据
输入检查的表单提交才能被ColdFusion所接受。
数值型和日期型字段的自动检查
如果你使用CFINSERT或CFUPDATE,并且要操纵的数据库字段是数值型,日期型,或时间
型,那么向这些数据库字段插入数据的Form字段会自动被检查。
两点补充:
·对一个字段设置检查规则并不能使该字段成为必须输入的字段。如果要求用户
必须输入该字段,仍需要使用带有”_required”的隐含字段。
·数值数据通常包含逗号字符和美元符,对于使用了_integer,_float,或_range
检查规则的字段,在检查输入数据和存入数据库之前,这些字符会被自动删除。



动态HTML表单


动态HTML表单
动态HTML表单在Web应用程序中操纵数据库的最重要的工具之一。动态表单是利用数据
库查询结果和CFML标签动态生成的表单。你可以通过动态表单保证数据的完整性,加快
编码速度,以及在数据库表格之间建立联系。
下面的例子利用对表parks的查询结果,动态地建立一个选择列表:
<CFQUERY NAME="ParkNames"
DATASOURCE="ParkDB?
SELECT ParkName_ID, ParkName
FROM Parks
</CFQUERY>
<FORM ACTION="example.cfm" METHOD="Post">
<SELECT NAME="ParkName_ID">
<CFOUTPUT QUERY="ParkNames">
<OPTION VALUE="#ParkName_ID#">#ParkName#
</CFOUTPUT>
</SELECT>
<INPUT TYPE="submit" VALUE="Submit">
</FORM>
当这个表单被提交时,返回的是ParkName_ID,在example.cfm文件中可以使用这个参数。
其他表单元素可以用同样的方法动态地建立。
在HTML表单中使用多选按钮和多选列表
当一个HTML表单中包含一列同名的多选按钮或一个多选列表框时,用户的输入被传递为
用逗号隔开的一列被选值。
注意,如果用户没有作任何选择,则没有变量被创建。这有可能导致SQL INSERT语句不
能正确执行,解决这个问题的办法是强制用户必须作出选择(用隐含字段),或者使用
动态SQL。
多选按钮
当你在表单中为一列多选按钮指定同一个名字时,相应Form变量的值是用逗号隔开的一
列值。这些值可以是数字,也可以是字符串。这两种类型的值在处理时有点差别。
假设你想为用户提供一列组织名,让用户通过多选按钮选择一个或多个组织。然后通过
查询返回被选组织的详细信息。可以使用如下的语句:
Select one or more companies to get information on:
<INPUT TYPE="checkbox"
NAME="SelectedOrgs"
VALUE="5">
Mobil Corporation<BR>
<INPUT TYPE="checkbox"
NAME="SelectedOrgs"
VALUE="19">
Shapeware, Inc.<BR>
<INPUT TYPE="checkbox"
NAME="SelectedOrgs"
VALUE="13">
BankBoston<BR>
<INPUT TYPE="hidden"
NAME="SelectedOrgs_required"
VALUE="You must select at least one organization.">
注意虽然显示给用户的文本是组织的名字,但每个多选按钮的VALUE属性的值对应于数
据库中每个组织的记录主关键字。
如果用户选择了Shapeware和BankBoston两项,则Form字段SelectOrgs的值为“19,
13.”。如果在下面的SQL语句中使用这个参数:
SELECT *
FROM Organizations
WHERE Organization_ID IN ( #SelectedOrgs# )
对数据库实际执行的SQL语句为:
SELECT *
FROM Organizations
WHERE Organization_ID IN ( 19,13 )
要查询字符串类型的字段,多选按钮和CFQUERY标签的使用都与数值型字段稍有不同。
在上面的例子中,我们根据一个数值型主关键字Organization_ID对数据库进行查询。
如果主关键字是字符串型字段”OrganizationName”,则要对代码作如下修改:
多选按钮的VALUE属性中必须加上单引号:
<INPUT TYPE="checkbox"
NAME="SelectedOrgs"
VALUE="’Mobil Corporation’”>
Mobil Corporation<BR>
<INPUT TYPE="checkbox"
NAME="SelectedOrgs"
VALUE="’ShapeWare, Inc.’”>
Shapeware, Inc.<BR>
<INPUT TYPE="checkbox"
NAME="SelectedOrgs"
VALUE="’Bank of Boston’”>
BankBoston<BR>
<INPUT TYPE="checkbox"
NAME="SelectedOrgs_required"
VALUE="You must select at least one organization.">
如果用户选择了Shapeware和BankBoston两项,则Form字段SelectOrgs的值为’
ShapeWare,Inc.’,’BankBoston’。
注意:你必须在SQL语句中使用ColdFusion的PreserveSingleQuotes函数,以防止
ColdFusion对Form字段值中的单引号进行转换:
SELECT *
FROM Organizations
WHERE OrganizationName IN (#PreserveSingleQuotes(SelectedOrgs)#)
对数据库执行的实际查询为:
SELECT *
FROM Organizations
WHERE OrganizationName IN (‘ShapeWare, Inc.’,’BankBoston’)
多选列表框
ColdFusion将多选列表框(HTML SELECT输入控件,指定属性MULTIPLE)与多选按钮作
同样处理,即返回的Form变量值是逗号隔开的一列用户所选值。例如,一个多选列表框
包括三项:red,green,blue。用户选择了red和green,则Form变量的值为’red’,’
green’。与多选按钮类似,利用多选列表框进行数据库查询也有两种情况:查询数值
型数据库字段和查询字符串型数据库字段。
假设你想让用户从一个多选列表中选择组织名,然后通过数据库查询返回被选中组织的
详细信息,可以使用如下语句:
Select one or more companies to get more information on:
<SELECT Name="SelectOrgs" MULTIPLE>
<OPTION VALUE="5">Mobil Corporation
<OPTION VALUE="19">ShapeWare, Inc.
<OPTION VALUE="13">BankBoston
</SELECT>
<INPUT TYPE="hidden"
NAME="SelectedOrgs_required"
VALUE="You must select at least one organization.">
如果用户选择了Shapeware和BankBoston两项,则Form变量SelectOrgs的值为19,13。如
果这个变量用在下面的SQL语句中:
SELECT *
FROM Organizations
WHERE Organization_ID IN (#SelectedOrgs#)
对数据库实际执行的语句为:
SELECT *
FROM Organizations
WHERE Organization_ID IN (19,13)
假如你想让用户通过多选列表框选择组织名,然后对数据库中的字符串型字段进行查询,
可以使用下面的语句:
Select one or more companies to get
more information on:
<SELECT Name="SelectOrgs" MULTIPLE>
<OPTION VALUE="’Mobil Corporation’”>Mobil Corporation
<OPTION VALUE="’ShapeWare, Inc.’”>ShapeWare, Inc.
<OPTION VALUE="’BankBoston’”>BankBoston
</SELECT>
<INPUT TYPE="hidden"
NAME="SelectedOrgs_required"
VALUE="You must select at least one organization.">
如果用户选择了Shapeware和BankBoston两项,则Form变量SelectOrgs的值为’
ShapeWare,Inc.’,’BankBoston’。
与多选按钮一样,对数据库中的字符串型字段执行查询时,要使用
PreserveSingleQuotes函数:
SELECT *
FROM Organizations
WHERE OrganizationName IN (#PreserveSingleQuotes(SelectedOrgs)#)
使用上面的语句,对数据库实际执行的查询为:
SELECT *
FROM Organizations
WHERE OrganizationName IN (‘ShapeWare, Inc.’,’BankBoston’)


动态SQL

动态SQL
嵌人使用动态参数的SQL查询是将用户输入与数据库字段相对应起来的强大机制。但是,
在更复杂的应用程序中,通常不仅需要根据用户输入决定查询内容,而且需要根据用户
输入决定查询的结构。
动态SQL使你能够动态地决定(根据运行时参数)对数据库执行SQL语句的哪一部分。例
如,如果用户没有在一个查询字段中输入数据,你可以忽略WHERE从句中与该字段相关
的部分。如果用户没有指定按哪个字段排序,则整个ORDER BY从句可以被忽略。
在ColdFusion中动态SQL的实现是利用CFIF/CFELSEIF/CFELSE标签控制SQL语句的建立。
在CFQUERY中一个动态SQL语句有如下形式:
<CFQUERY NAME=" queryname"
DATASOURCE=" datasourcename" >
...Base SQL statement
<CFIF value operator value >
...additional SQL
</CFIF>
</CFQUERY>
在下面的例子中,用一系列CFIF标签来确定将哪一个SQL语句追加到基本SQL SELECT语
句后面:
<CFQUERY NAME="GetParkList"
DATASOURCE="CF 4.0 Examples">
SELECT *
FROM Parks
WHERE 0=0
<CFIF #ParkName# is not "">
AND ParkName LIKE ‘%#ParkName#%’
</CFIF>
<CFIF #ParkType# is not "AllTypes">
AND ParkType = ‘#ParkType#’
</CFIF>
<CFIF #Region# is not "AllRegions">
AND Region = ‘#Region#’
</CFIF>
<CFIF #State# is not "">
AND State = ‘#State#’
</CFIF>
</CFQUERY>
提示:WHERE 0=0从句对数据库查询不产生任何影响。但如果所有的CFIF条件都不成立,
该从句可以保证WHERE从句不会产生SQL语法错误。
下面的例子演示了如何用动态SQL来确保一个多选列表框的输入:
<CFQUERY NAME="GetParkList"
DATASOURCE="CF 4.0 Examples">
SELECT *
FROM Parks
WHERE 0=0
<CFIF IsDefined("ParkName_ID")>
AND ParkName_ID IN (#Form.ParkName_ID#)
</CFIF>
</CFQUERY>





事务处理(CFTRANSACTION)




事务处理(CFTRANSACTION)
你可以用CFTRANSACTION标签实现事务处理。一个CFTRANSACTION标签内的所有查询被视
为一个事务处理单元。这意味着只有事务处理代码块中的所有查询都正确执行后,才能
完成对数据库的修改。如果其中的一个查询发生了任何错误,则事务处理代码块中此查
询之前的所有操作都被还原。
下面的例子演示了CFTRANSACTION标签的使用。如果第二个查询产生了错误,
CFTRANSACTION保证了前一个查询所作的改动被还原,从而维持数据库中数据的一至性。
<CFTRANSACTION>
<CFQUERY NAME="WithdrawCash"
DATASOURCE="BankDB">
UPDATE Accounts
SET Balance=Balance - #Amount#
WHERE Account_ID=#AccountFrom#
</CFQUERY>
<CFQUERY NAME="DepositCash"
DATASOURCE="BankDB">
UPDATE Accounts
SET Balance=Balance + #Amount#
WHERE Account_ID=#AccountTo#
</CFQUERY>
</CFTRANSACTION>
注意,只有对同一个数据源的操作才支持事务处理。
你可以指定CFTRANSACTION标签的可选属性ISOLATION。该属性提供了更精细的控制,控
制数据库引擎在执行事务处理时如何锁定数据。
ISOLATION属性的合法值有:
???????????????·READ_UNCOMMITTED
?????????????·READ_COMMITTED
?????????????·REPEATABLE_READ
??????????·SERIALIZABLE
注意:VERSIONING不再是ISOLATION属性的合法值,ColdFusion不再支持这个值。
事务处理的ODBC驱动程序支持
并非所有的驱动程序都支持事务处理,也并非所有支持事务处理的驱动程序都支持所有
的ISOLATION级别。当你试图对某个驱动程序使用事务处理/锁定级别的组合时,
ColdFusion会查询该驱动程序的事务处理能力。如果驱动程序不具备所需的事务处理能
力,则ColdFusion返回一个错误。
关于驱动程序所支持的ISOLATION级别及其对每种级别如何实现等内容,需参考具体驱
动程序的有关文档。
小结:
本章内容是本手册的重点之一,建议仔细阅读,并读懂所有的例子程序。需要强调的内
容有:
·Form中隐含字段的使用(传参,数据输入检查)。
·CFINSERT和CFUPDATE标签要求Form字段名与要操作的数据库字段名相同。
·根据数据库查询结果建立动态Form。
·根据Form提交结果建立动态SQL语句。





用CFFORM标签建立表单




用CFFORM标签建立表单
这一章将重点介绍如何用CFFORM标签建立基于Java程序片的动态表单,通过本章的学习,
你将可以使用一组基于Java的图形控件,而不需要直接编写Java代码。
用CFFORM标签建立表单
CFFORM标签使你能够建立动态表单,并提供了一组基于Java的表单控件,如树控件,滑
动条控件和网格控件。在CFFORM中也可以使用标准的HTML控件,如多选按钮,单选按钮、
文本框、编辑框等,CFFORM的优点在于你不需了解Java语言就可以象使用标准HTML控件
一样使用这些基于Java程序片的控件,从而使编程更加简单易学。
用CFFORM建立的表单与标准HTML表单有相同的结构,在<CFFORM>和
</CFFORM>这两个标签之间,你可以放置各种表单控件,如多选按钮和单选按钮
(用CFINPUT),数据网格(用CFGRID),树控件(CFTREE),以及下拉列表(用
CFSELECT)等。
你可以将HTML FORM标签与CFFORM标签结合使用,CFFORM标签由ColdFusion处理,
ColdFusion根据CFFORM标签动态地生成HTML表单,然后将HTML代码传递给浏览器,如果
你将现有的FORM标签都替换为CFFORM,该表单仍可以正常工作。
使用CFFORM建立表单比使用HTML FORM标签有如下优点:
· 为了使用Cold Fusion扩展,你不再需要在HTML
FORM中频繁使用CFOUTPUT,在CFFORM中可以直接使用ColdFusion的扩展内容。
· 在CFFORM中可以使用许多基于Java的控件,而不需要学习Java语言,这些动
态控件可以为表单提供强大的功能。
· 多数CFFORM控件提供了输入检查属性,你可以用这些属性来检查用户输入的
合法性。
· 使用CFAPPLET,可以更简单地在CFFORM
中嵌入你自己的Java程序片。
对几乎所有的CFFORM控件,你都可以指定字体特征,布局,大小,滚动属性,以及许多
其它选项。
由于每个基于Java的控件都需要在客户端运行一个Java程序片,这样,不支持Java或禁
止了Java的浏览器将无法支持包含了这些控件的表单。使用NOTSURPPORTED属性,可以
避免在浏览器中显示空白的程序片运行空间,而是提供一个错误信息。每个基于Java
的控件以及CFAPPLET标签都包含这一属性,你用NOTSURPPORTED属性指定一个错误信息,
当浏览器不支持Java时显示该信息。





CFFORM控件的输入检查




CFFORM控件的输入检查
CFINPUT和CFTEXTINPUT标签带有VALIDATE属性,利用该属性你可以为控件指定一个合法
的数据类型。你可以检查的数据类型如下表:
检查输入的合法性
数据类型
描述
Date
确保输入的日期是美国格式mm/dd/yyy。
Eurodate
确保输入的是欧洲日期格式dd/mm/yyyy。
Time
确保输入的时间格式为hh:mm:ss。
Float
确保输入的是一个浮点数。
Integer
确保输入的是一个整数。
Telephone
检查电话号码的输入。电话号码的格式必须为###-###-####。连字符(-)
也可以用空格代替,区号必须以1到9之间的数字开头。
Zipcode
可以是5位或9位数字,写成#####-####的格式。连字符可以用空格代替。
Creditcard
空格和破折号会被剔除,并使用Mod10算法检查数字。
Social_security_number
数字必须写成###-##-####的格式,也可以用空格代替连字符。
当你通过VALIDATE属性指定了一个输入数据类型时,ColdFusion会检查用户的输入与指
定的类型是否匹配,只有成功匹配时才提交表单数据。
除了上述的数据检查方法之外,下面的这些标签支持ONVALIDATE属性,该属性允许你指
定一个JavaScript函数来处理CFFORM的数据输入检查:
· CFINPUT
· CFGRID
· CFSLIDER
· CFTEXTINPUT
· CFTREE
ColdFusion将下列JavaScript对象传递给你在ONVALIDATE属性中所指定的JavaScript函
数。
· form-object
· input-object
· object-value
ONERROR属性允许你指定一个在输入检查失败时执行的JavaScript函数,例如,如果你
在ONVALIDATE中指定了一个函数来执行数据输入检查,你还可以在ONERROR中指定另一
个函数来执行检查失败处理,下列的标签均支持ONERROR属性:
· CFGRID
· CFINPUT
· CFSELECT
· CFSLIDER
· CFTEXTINPUT
· CFTREE
ColdFusion将下列JavaScript对象传递给ONERROR属性所指定的函数:
· torm-object
· inpnt-object
· object-value
· 错误信息文本
例子:表单输入检查
下面的便子利用JavaScript对输入的emai 地址进行检查:
<HTML>
<HEAD>
<TITLE>JavaScript Validation</TITLE>
<SCRIPT>
<!---
function testbox(form) {
Ctrl = form.inputbox1;
if (Ctrl.value == "" || Ctrl.value.indexOf (扏? 0) == -1) {
return (false);
} else
return (true);
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<H2>JavaScript validation test</H2>
<P>Please enter your email address:</P>
<CFFORM NAME="UpdateForm"
ACTION="update.cfm" >
<CFINPUT TYPE="text"
NAME="inputbox1"
REQUIRED="YES"
ONVALIDATE="testbox"
MESSAGE="Sorry, invalid entry."
SIZE="10"
MAXLENGTH="10">
<INPUT TYPE="Submit" VALUE=" Update... ">
</CFFORM>
</BODY>
</HTML>





用CFTREE建立树控件




用CFTREE建立树控件
树控件适于用来显示有层次的信息。利用CFTREE,你可以根据数据库查询结果建立树形
显示结构。你用CFTREEITEM建立树形结构的各个分支,你还可以选择使用六种内建的图
标来代表树控件中的各个分支。
根据查询结果建立树形结构。
下面的简单例子根据CFQUERY的查询结果建立树形显示结构,它使用了最少的CFTREE标
签和CFTREEITEM标签,演示了如何用CFML语言方便地建立树形结构。
首先,利用查询从数据源选择数据:
<CFQUERY NAME="Engineering"
DATASOURCE="cfsnippets">
SELECT FirstName +’ ‘+ LastName AS FullName
FROM EMPLOYEES
</CFQUERY>
然后,利用查询结果构建树控件:
<CFFORM
NAME="form1" ACTION="submit.cfm"
METHOD="Post">
<CFTREE NAME="tree1" REQUIRED="yes"
HSCROLL="no" vSCROLL="yes">
<CFTREEITEM VALUE=FullName
QUERY="Engineering"
QUERYASROOT="yes"
IMG="folder,document">
</CFTREE>
</CFFORM>
此例产生的树控件如下图所示:
这个例子用QUERYASROOT属性指定将查询名(Engineering)作为树控件的根。
QUERYASROOT属性的值可是Yes/No或者你想显示为查询结果的根的名字。
你可以根据几个不同的查询,利用来自不同数据源的数据建立一个树控件,使用
QUERYASROOT,你可以为每个查询指定一个根(ROOT)。
分组显示查询结果
假设你想根据员工所在的部门来组织员工信息,并显示一个能反映部门与员工关系的完
整列表。在这种情况下,ColdFusion提供了一个非常简单的方法,在CFTREE中显示排序
的CFQYERT查询结果。你只需在CFTREEITEM的VALUE属性中指定用逗号隔开的字段名,
ColdFusion就会认为你希望树控件能反映SQL语句的排序结果。如下例:
<!--- CFQUERY with an ORDER BY clause --->
<CFQUERY NAME="myquery"
DATASOURCE="cfsnippets">
SELECT DEPARTMENT, FirstName + ??+ LastName
AS FullName
FROM EMPLOYEES
ORDER BY DEPARTMENT
</CFQUERY>
<!---Build the tree control --->
<CFFORM NAME="form1" ACTION="submit.cfm"
METHOD="Post">
<CFTREE NAME="tree1"
HSCROLL="no"
VSCROLL="no"
BORDER="yes"
HEIGHT="350"
REQUIRED="yes">
<CFTREEITEM VALUE="Department, FullName"
QUERY="myquery"
QUERYASROOT="Department"
IMG="cd,folder">
</CFTREE>
<BR><INPUT TYPE="Submit"
VALUE="Submit">
</CFFORM>
注意IMG属性与VALUE属性之间的对应。第一个字段,
Department,使用ColdFusion的内建图标CD。第二个字段,FullName,使用另一个内建
图标folder。如果IMG属性被省略,则ColdFusion为树控件的每一级都使用folder图标。
此例的显示结果如下图所示:
如果用户选择了树控件中的“Peter Jacobsen”一项,则由Coldfusoion返回下面的
form变量:
form treel node=peter Jacobsen
form treel path=pepartment/sales/peter Jacobsen
注意:后面关于树控件的例子都使用上面的CFQUERY的查询结果,此查询的数据源是一
个Microsoft
Access数据库cfsnippets.mdb,要运行这些关于树控件的例子,只需引用“myquery”
即可。
CFTREE表单变量
在CFTREE标签中将REQUIRED 属性设为YES,可以强制用户必须从树控件中选择一项,无
论是否设置REQUIRED属性,ColdFusion都返回两个Form变量:
· form.treename.rode——返回用户所选的节点
· form.treename.path——返回用户选择的节点的完整路径,其格式为
root/node1/node2/node_n/value
只有当你将CFTREE的COMPLETEPATH属性设置为YES时,返回的路径才包括root部分,否
则路径将从第一个节点开始。
CFTREE的输入检查
CFTREE不支持VALIDATE属性,但你可以用REQUIRED属性强制用户对树控件作出选择。另
外,你可以在ONVALIDATE属性中指定一个JavaScript函数,由该函数执行输入检查。
构造树控件
用CFTREE可以建立非常复杂的树控件,而知道如何指定多个CFTREEITEM之间的关系将有
助于处理甚至是最复杂的树控件结构。
例子:一级树控件
下面的例子用一个根和多个项建立了一个树控件:
<CFFORM NAME="form1" ACTION="submit.cfm">
<CFTREE NAME="tree1">
<CFTREEITEM VALUE="FullName"
QUERY="myquery"
QUERYASROOT="Department">
</CFTREE>
<BR><INPUT TYPE="submit"
VALUE="Submit">
</CFFORM>
这个例子的显示结果为:
例子:多级树控件
构造一个树形结构时,你通过为树的每一项指定一个“父”来定义树的结构。在下面的
这个例子中,除最顶级以外,树的每一项都指定了一个“父”,PARENT属性使你可以定
义树控件的各元素之间关系。
<CFFORM NAME="form1" ACTION="cfform_submit.cfm"
METHOD="Post">
<CFTREE NAME="tree1" HSCROLL="no"
VSCROLL="no"
BORDER="no">
<CFTREEITEM VALUE="Divisions">
<CFTREEITEM VALUE="Development"
PARENT="Divisions" IMG="folder">
<CFTREEITEM VALUE="Product One"
PARENT="Development">
<CFTREEITEM VALUE="Product Two"
PARENT="Development">
<CFTREEITEM VALUE="GUI"
PARENT="Product Two" IMG="document">
<CFTREEITEM VALUE="Kernel"
PARENT="Product Two" IMG="document">
<CFTREEITEM VALUE="Product Three"
PARENT="Development">
<CFTREEITEM VALUE="QA"
PARENT="Divisions" IMG="folder">
<CFTREEITEM VALUE="Product One"
PARENT="QA">
<CFTREEITEM VALUE="Product Two" PARENT="QA">
<CFTREEITEM VALUE="Product Three"
PARENT="QA">
<CFTREEITEM VALUE="Support"
PARENT="Divisions" IMG="fixed">
<CFTREEITEM VALUE="Product Two"
PARENT="Support">
<CFTREEITEM VALUE="Sales"
PARENT="Divisions" IMG="cd">
<CFTREEITEM VALUE="Marketing"
PARENT="Divisions" IMG="document">
<CFTREEITEM VALUE="Finance"
PARENT="Divisions" IMG="element">
</CFTREE>
</CFFORM>
这个例子的显示结果为:
CFTREE中的图象名
当你使用TYPE=“Image”属性时,ColdFusion会试图显示一个与字段值相应的图象,
该图象可以是ColdFusion的内建图象,也可以是你自选的图象,自选图象应位于
cfide/classes目录或其子目录下,并应用相对的URL来引用。
内建的图象包括:
· cd
· computer
· document
· element
· folder
· floppy
· fixed
· remote
在CFTREEITEM中使用逗号
逗号用来分隔CFTREEITEM, VALUE, DISPLAY, IMG和HREF等属性的值。在CFTREE中你用
逗号来分隔字段名。如下例所示,VALUE属性指定了查询所返回的两个字段名:
<CFTREE NAME="tree1" VSCROLL="no"
HSCROLL="no" BORDER="no">
<CFTREEITEM VALUE="Department,LastName"
QUERY="myquery"
QUERYASROOT="Company B"
IMG="folder,folder,document"
PARENT="Company B">
</CFTREE>
在这个树控件中,Department和LastName是查询返回的两个字段。这个树根据不同的部
门(Department)名字来分组显示LastName的值(假设查询中包含了相应的order
by子句)。还应注意的是IMG属性的值。由于这个树控件共有三级,你可以通过用逗号
分隔的图象名,为每一级指定一个内建的或定制的图象。





在CFTREE中嵌入URL




在CFTREE中嵌入URL
CFTREEITEM标签的HREF属性允许你将树的一项指定为一个链接,要在CFTREE中使用这一
特性,你只需在HREF属性中定义该链接的目标地点(即URL)
例子:添加Web链接
<CFFORM ACTION="submit.cfm">
<CFTREE NAME="oak"
HIGHLIGHTHREF="../../yes"
HEIGHT="100"
WIDTH="200"
HSPACE="100"
VSPACE="6"
HSCROLL="no"
VSCROLL="no"
BORDER="no"
DELIMITER="?">
<CFTREEITEM VALUE="Important Links">
<CFTREEITEM VALUE="Allaire Home"
PARENT="Important Links"
IMG="document"
HREF="http://www.allaire.com">
<CFTREEITEM VALUE="Allaire Forums"
PARENT="Important Links"
IMG="document"
HREF="http://forums.allaire.com">
</CFTREE>
</CFFORM>
这个例子的显示结果为:
CFTREEITEM的APPENDKEY属性
当用户选择了树控件中的一项并提交表单时,变量CFTREEITEMKEY会被追加到URL后面,
传递给ACTION属性所指的文件,其格式为:
http://myserver.com? CFTREEITEMKEY=Selected_value
通过设置CFTREE的APPENDKEY属性为NO,你可以禁止该URL变量。
CFTREEITEM的TARGET属性
可以在CFTREEITEM标签中用TARGET属性为链接指定一个目标(TARGET)。当利用查询结
果构造树控件时,你可以将一列TARGET属性值用逗号隔开,使这些值分别对应于树控件
中不同级的链接项,例如:
TARGET=“FRAME_BODY,_blank,_top”





用CFGRID建立数据网格




用CFGRID建立数据网格
CFGRID是另一个基于Java程序片的CFFORM控件。一个网格控件类似于一个表,可以包含
来自CFQUERY的查询结果或其它来源的数据。与别的CFFORM标签一样,CFGRID也提供了
一系列数据格式选项以及用户输入检查选项,CFGRID的其它特性包括:
· 对网格中的数据进行排序
· 更新,插入和删除数据
· 网格中可以嵌入图象
当用户选择网格中的数据并提交表单时,ColdFusion将被选信息以form变量的形式传递
给ACTION属性所指的文件。
注意:如果你在CFGRID中指定了QUERY属性,但没有指定相应的CFGRIDITEM属性,则缺
省的网格将包含查询中的所有字段。
在CFGRID中使用CFGRIDCOLUMN标签就象在CFTREE中使用CFTREEITEM标签一样。
CFGRIDCOLUMN标签用于定义网格中的一列。
利用查询结果建立网格控件
下面的例子利用一个CFQUERY的查询结果构造了一个简单的数据网格:
<CFQUERY NAME="getdata"
DATASOURCE="cfsnippets">
SELECT * FROM Employees
</CFQUERY>
<CFFORM NAME="Form1" ACTION="submit.cfm"
METHOD="Post">
<CFGRID NAME="employee_grid" QUERY="getdata"
SELECTMODE="single">
<CFGRIDCOLUMN NAME="Employee_ID">
<CFGRIDCOLUMN NAME="LastName">
<CFGRIDCOLUMN NAME="Department">
</CFGRID>
<BR><INPUT TYPE="Submit"
VALUE="Submit">
</CFFORM>
这个例子的显结果类似于:
隐藏网格字段
你可以用CFGRIDCOLUMN的DISPLAY属性将你想从数据源中选择但不想显示给用户的字段
从网格中隐去,如用户ID号或其它的主关键字字段等。在下面的例子中,员工ID字段被
查询,但不被显示:
<CFQUERY NAME="getdata"
DATASOURCE="cfsnippets">
SELECT * FROM Employees
</CFQUERY>
<CFFORM NAME="Form1"
ACTION="submit.cfm"
METHOD="Post"
ENABLECAB="Yes">
<CFGRID NAME="grid1" QUERY="getdata"
SELECTMODE="single">
<CFGRIDCOLUMN DISPLAY="No"
NAME="Employee_ID">
<CFGRIDCOLUMN NAME="LastName">
<CFGRIDCOLUMN NAME="Department">
</CFGRID>
<BR><INPUT TYPE="Submit"
VALUE="Submit">
</CFFORM>





建立可更新的网格




建立可更新的网格
你可以建立允许用户进行数据编辑的网格,根据用户的编辑结果,你可以用CFQUERY标
签对数据源进行修改,也可以使用CFGRIDUPDATE标签,将用户对网格数据的编辑直接写
到数据库中。
单元格中的数据可以被编辑,一行数据可以被插入,删除或更新,但在此之前。你需要
在CFGRID中指定SELECTMODE=“EDIT”来允许编辑数据,还许要允许INSERT属性和
DELETE属性(将其值设为“YES”)。完成这些设置后,该网格即可用来对数据源进行
操作。
使用可更新网格对ODBC数据源进行修改的方法主要有两种。你可以建立一个文件,将
CFGRID表单变量传递给该文件,在该文件中用CFQUERY标签执行对数据源的更新,另一
种方法是将网格编辑结果传递给一个包含CFGRIDUPDATE标签的文件,该标签直接将编辑
结果写入数据源,虽然使用CFQUERY可以实现对数据源的完全控制,但对不需要复杂控
制的操作来说,CFGRIDUPOATE使用起来更加简单。
编辑网格中的数据
设置SELECTMODE=“EDIT”后,用户即可编辑网格中的数据。用户可以点击一个单元格,
然后用简单的编辑操作改单元格中的数据。设置INSERT=“YES”和DELETE=“YES”后,
用户可以选择一行数据并删除之,也可以选择一行数据,在该位置插入一个新行。当一
个包含CFGRID标签的CFFORM被提交时,数据的修改被记录在几个一维数组中,你可以象
引用其它的ColdFusion数组一样引用这些数组。
下列的这些数组用来跟踪网格数据的修改:
用于存储单元格编辑信息的数组
数组
描述
gridname.colname[row_index]
存储被编辑单元格的新值
gridname.Original.colname[row_index]
存储被编辑单元格的原始值
gridname.RowStatus.Action[row_index]
存储对单元格的编辑类型
例如,有一个网格“mygrid”,包含两个可显示字段CO11和CO12,一个隐藏字段CO13。
当用户选择并修改了某一行中的数据时,则下列数组被创建,用于保存被更新,插入或
删除的行的原始数据和新数据。
mygrid.col1[ row_index ]
mygrid.col2[ row_index ]
mygrid.col3[ row_index ]
mygrid.original.col1[ row_index ]
mygrid.original.col2[ row_index ]
mygrid.original.col3[ row_index ]
其中row_index是数组的索引值。
如果用户修改了CO12字段的某个单元格,你可以用如下的方式引用编辑操作类型、该单
元格的原始值,以及编辑后的新值:
<CFSET edittype = mygrid.RowStatus.Action[1]><BR>
<CFSET new_value = mygrid.col2[1]><BR>
<CFSET old_value = mygrid.original.col2[1]>
为INSERT按钮和DELETE按钮指定替代文本
如果你希望可更新网格的插入和删除按钮使用不同于“Insert”和“Delete”的文本,
你可以在INSERTBUTTON属性和DELETEBUTTON属性中指定替代的文本。
对网格数据排序
CFGRID标签的SORT属性用于允许在网格控件中包含排序按钮,允许排序后,排序按钮会
被自动添加到网格中。点击该按钮时,网格数据会按选中的字段进行排序。ColdFusion
将字段值视为文本或数字而进行排序。
下列的CFGRID属性用于定义与排序有关的各个选项
· PICTUREBAR——当设置为YES时,排序按钮是一个图形按钮,而非文本按钮。
· SORTASCENDINGBUTTON——用于指定升序排序按钮的显示文本,缺省值为
“A? Z”
· SORTDESECNDINGBUTTON——用于指定降序排序按钮的显示文本,缺省值为
“Z? A”
注意:用户在点击排序按钮之前必须首先选择一个字段。
例子:可编辑的网格
下面的例子演示了可更新网格的使用,在这个例子中,SELECTMODE属性被设置为
“Edit”,INSERT属性和DELETE属性被设置为“yes”。当这个表单被提交时,
handle_grid.cfm文件被调用,该文件显示编辑操作的类型,并直接对数据源执行相应
的更新、删除或插入等操作。
Grid.cfm
<HTML>
<HEAD>
<TITLE>Simple Update Grid Example</TITLE>
</HEAD>
<CFQUERY NAME="CourseList"
DATASOURCE="cfsnippets">
SELECT * FROM Courses
</CFQUERY>
<BODY BGCOLOR="#FFFFFF">
<CFFORM NAME="GridForm"
ACTION="handle_grid.cfm">
<CFGRID NAME="course_grid"
HEIGHT=170
WIDTH=400
HSPACE=10
VSPACE=6
ALIGN="RIGHT"
SELECTCOLOR="white"
SELECTMODE="edit"
ROWHEADERS="YES"
ROWHEADERWIDTH=25
ROWHEADERALIGN="right"
COLHEADERS="YES"
QUERY="CourseList"
GRIDDATAALIGN="left"
BGCOLOR="green"
INSERT="YES"
DELETE="YES"
SORT="YES"
MAXROWS=60>
<CFGRIDCOLUMN NAME="course_id"
HEADER="Course ID"
WIDTH=80
ITALIC="NO"
HEADERALIGN="center"
HEADERITALIC="NO"
HEADERBOLD="YES"
DISPLAY="NO">
<CFGRIDCOLUMN NAME="number"
HEADER="Course ##"
WIDTH=80
ITALIC="NO"
HEADERALIGN="center"
HEADERITALIC="NO"
HEADERBOLD="YES"
DISPLAY="YES"
SELECT="YES">
<CFGRIDCOLUMN NAME="description"
HEADER="Description"
WIDTH=240
ITALIC="No"
HEADERALIGN="center"
HEADERITALIC="No"
HEADERBOLD="Yes"
BOLD="Yes"
ITALIC="Yes"
DISPLAY="Yes">
</CFGRID>
<!---
<H3>Editable Grid</H3>
This is a grid that is populated <BR>
from a query. The select mode is <BR>
update. The description column<BR>
is presented in Bold and Italic.<BR><BR> --->
<INPUT TYPE="Submit" VALUE=" Push me... ">
<BR>
</CFFORM>
</BODY>
</HTML>
这个例子的显示结果类似于下图:
你对网格数据的修改将反映在数据源cfsnippets的表Courses中,你可以在Studio中查
开这个表。
Handle_grid.cfm
<HTML>
<HEAD>
<TITLE>Catch submitted grid values</TITLE>
</HEAD>
<BODY>
<H3>Grid values for FORM.Course_grid row updates</H3>
<CFIF IsDefined("form.course_grid.rowstatus.action")>
<CFLOOP INDEX = "Counter" FROM = "1" TO =
#ArrayLen(form.course_grid.rowstatus.action)#>
<CFOUTPUT>
The row action for #Counter# is:
#form.course_grid.rowstatus.action[Counter]#
<BR><BR>
</CFOUTPUT>
<CFIF form.course_grid.rowstatus.action[Counter] IS
"D">
<CFQUERY NAME="InsertNewCourse"
DATASOURCE="cfsnippets">
DELETE from courses
WHERE course_id=#form.course_grid.original.course_id[Counter]#
</CFQUERY>
<CFELSEIF form.course_grid.rowstatus.action[Counter] IS
"U">
<CFQUERY NAME="UpdateExistingCourse"
DATASOURCE="cfsnippets">
UPDATE courses
SET description=’#form.course_grid.description[Counter]#’,
"Number"=’#form.course_grid.number[Counter]#’
WHERE
course_id=#form.course_grid.original.course_id[Counter]#
</CFQUERY>
<CFELSEIF form.course_grid.rowstatus.action[Counter] IS
"I">
<CFQUERY NAME="InsertNewCourse"
DATASOURCE="cfsnippets">
INSERT into courses
("Number", description)
VALUES (‘#form.course_grid.number[Counter]#’,
‘#form.course_grid.description[Counter]#’)
</CFQUERY>
</CFIF>
</CFLOOP>
</CFIF>
</BODY>
</HTML>
使用CFGRIDUPDATE
CFGRIDUPDATE标签可以根据CFGRID的内容直接对数据源进行更新,你不需要在CFQUERY
中使用SQL语句来完成数据的更新,CFGRIDUPDATE标签可以直接取得CFGRID中的数据编
辑信息,自动完成整个处理过程。
在前面的例子中,来自可编辑网格的数据被传给一个文件,该文件在CFIF结构中使用
CFQUERY标签完成对数据源的更新,而在许多情况下,用CFGRIDUPDATE标签使程序更加
简单。
例如,下面的代码从一个名为“Courses”的网格接收数据,对数据源进行更新。
<CFGRIDUPDATE GRID="Courses"
DATASOURCE="CF 4.0 Examples"
TABLENAME="Courses"
KEYONLY="NO">
当表单被提交时,存储有关数据修改信息的数组被传递给CFGRIDUPDATE标签,此标签根
据这些数组的内容构造必要的SQL语句来完成数据的更新,从而你不必要自己构造复杂
的SQL语句,非常方便。
KEYONLY属性
CFGRIDUPDATE标签包含一个KEYONLY属性,该属性可以强制ColdFusion对被更新字段的
原始值与表中的字段值进行比较。如果两者相同,也就是说,在网格数据被编辑的过程
的没有其它进程曾改变过数据库中的数据,则更新成功,如果两者不相同,则产生错误。
当你要确保没有其它进程曾更新过该数据时,应设置KEYONLY=“NO”。如果不可能有其
它进程更改该数据,可设置KEYONLY=“YES”。
在网格中嵌入图象
CFGRIDROW标签使你能够在网格单元格中放入图象,首先你要在CFGRIDCOLUMN标签中设
置TYPE=“IMAGE”,以告诉ColdFusion将该列数据理解为一个图象。你可以使用
ColdFusion的内建图象(与CFTREEITEM相同),也可以指定自选的图象。下面的这段代
码演示了如何在网格中嵌入ColdFusion的内建图象。
...
<CFGRIDCOLUMN NAME="dept_name"
HEADER="Dept"
SELECT="NO"
DATAALIGN="Center"
WIDTH=40
TYPE=IMAGE>
<CFGRIDCOLUMN NAME="emp_lname"
HEADER="Name">
<CFGRIDROW DATA="folder,Jones">
<CFGRIDROW DATA="document,Smith">
...
注意,在CFGRIDROW中,用逗号将显示在第一列的图象名与显示在第二列的数据分隔开。
在网格中使用自己的图象
当你想用自己的图象代替ColdFusion的内建图象时,你需要指定该图象所在目录的相对
路径,以及图象文件名。指定图象文件的相对路径时,要注意该路径是相对于支持
CFGRID控件的Java类的路径,它通常是:
Webroot/cfide/classes/images
因此你可以指定一个此路径的相对路径,或者将要使用的图象文件放在
cfide/classes/images目录下,然后即可直接使用文件名而无须指定路径,就象使用内
建图象一样。
在下面的代码段中,CFGRIDROW标签使用了webroot/images目录下的图象文件:
...
<CFGRIDCOLUMN NAME="dept_name"
HEADER="Dept"
SELECT="NO"
DATAALIGN="Center"
WIDTH=40
TYPE=IMAGE>
<CFGRIDCOLUMN NAME="emp_lname"
HEADER="Name">
<CFGRIDROW DATA="../../../images/icon1.gif,Jones">
<CFGRIDROW DATA="../../../images/icon2.gif,Smith">
...


网格数据选择选项



网格数据选择选项
你可以控制用户如何与你的网格控件相交互,你可以限制一个用户只能浏览网格中的数
据。你可以在SELECTMOOE属性中指定几个不同的选择选项。
· Single——限制用户只能选择网格控件的一个单元格。
· Column——当用户选择一个单元格时,包含此单元格的一列数据均被选取。
· Row——当用户选择一个单元格时,包含此单元格的一行数据均被选取。
· Browse——用户不能选择单元格,只能浏览数据。
· Edit——用户可以编辑单元格数据。
选择模式与form变量
根据SELECTMODE属性的不同取值,网格数据被提交为不同形式的form变量:
· 当SELECTMODE=“single”时,返回的变量为grid-name.selectedname及被选
中的值。
· 当SELECTMODE=“Column”时,返回的是被选列的用逗号隔开的所有字段值。
· 当SELECTMODE=“Row”时,返回的变量为gridname.Columnl_name和grid_
name.Column2_name等,以及相应的被选字段值。
· 当SELECTMODE=“Browse”时,没有返回数据。
· 当SELECTMODE=“Edit”时,如果单元格数据被修改,则创建并返回三个一维
数组。
使用URL属性
当在单元格中使用URL时,SELECTMODE属性的值决定了该链接是限制于一个单元格,还
是扩展到该单元格所在的行或列。当用户点击一个链接时,一个CFGRIDKEY变量被追加
到URL后面,其格式为:
http://myserver.com?CFGRIDKEY=selection
Selection的值由SELECTMODE属性的值决定:
· 当SELECTMODE=“single”时,Selection即用户选中的单元格的值。
· 当SELECTMODE=“ROW”时,Selection是被选单元格所在行的各单元格的值,
用逗号将各单元格的值隔开,起始于该行的第一个单元格。
· 当SELECTMODE=“Column”时,Selection是被选单元格所在列的各单元格的
值,起始于该列的第一个单元格,各单元格的值用逗号隔开。
HREF属性
你可以用HREF属性将一个超链接与被选中的行或单元格相关联。ColdFusion将HREF属性
的值理解为一个存储链接文本的查询字段或链接文本自身。HREF的链接目标仅限于当前
的应用程序文件。
在下面的这段代码中,两个CFGRIDCOLUMN使用了HREF属性,由于HREF属性引用了另一个
CFGRIDCOLUMN,从而每一行都链接一个不同的URL,此URL由被选中行的dept_url字段的
值决定。注意最后一个CFGRIDCOLUMN是一个隐藏字段,用于隐藏dept_url字段的值。
<CFFORM NAME="GridForm"
ACTION="catch_grid10.cfm"
TARGET="Lower">
<CFGRID NAME="grid_ten"
HEIGHT=170
WIDTH=400
HSPACE=10
VSPACE=6
ALIGN="Right"
SELECTMODE="Row"
ROWHEADERS="Yes"
COLHEADERS="Yes"
QUERY="DeptList"
GRIDDATAALIGN="Left"
HIGHLIGHTHREF="../../No"
APPENDKEY="No"
SORT="Yes">
<CFGRIDCOLUMN NAME="dept_id"
HEADER="Department"
WIDTH=80
ITALIC="No"
HEADERALIGN="Center"
HEADERITALIC="No"
HEADERBOLD="Yes"
HREF="../../dept_url"
TYPE="Numeric">
<CFGRIDCOLUMN NAME="dept_name"
HEADER="Name"
ITALIC="No"
HEADERALIGN="Center"
HEADERITALIC="No"
HEADERBOLD="Yes"
HREF="dept_url">
<CFGRIDCOLUMN NAME="dept_url"
DISPLAY="No">
</CFGRID>
<INPUT TYPE="Submit" VALUE="Submit">
<BR>
</CFFORM>
CFGRIDKEY的APPENDKEY属性
当用户选择了网格数据并提交表单时,CFGRIDKEY变量即被追加到URL后面,传递给
ACTION属性所指的文件。你可以通过设置APPENDKEY=“NO”来禁止这个URL变量。



建立滑动条控件



建立滑动条控件
CFSLIDER是ColdFusion提供的另一个基于Java的表单控件。使用CFSLIDER你可以建立滑
动条,并可以为滑动条标识文本设置一系列格式选项,可以设置滑动条的比例,范围,
位置等。
与CFTREE和CFGRID一样,通过ONVALIDATE 属性指定的JanaScript函数,可以进行输入
检查。
例子:CFSLIDER控件
下面的例子建立了一个简单的CFSLIDER控件:
<CFFORM NAME="Form1" ACTION="submit.cfm"
METHOD="Post">
<CFSLIDER NAME="myslider"
GROOVECOLOR="black"
BGCOLOR="white"
TEXTCOLOR="black"
FONT="Trebuchet MS"
BOLD="yes"
RANGE="0,1000"
SCALE="10"
VALUE="640"
FONTSIZE="24"
LABEL="Slider %value%"
WIDTH="400">
</CFFORM>
显示结果如下图:
CFSLIDER表单变量
来自CFSLIDER控件的表单变量的值决定于滑动条的位置。该表单变量被传递为:
slider_name=Slider_value
在上面的例子中,表单变量为:
myslider=slider_value
CFSLIDER的格式选项
与其它的CFFORM控件一样,CFSLIDER提供了许多关于格式,位置和布局的选项。你可以
指定滑槽的颜色,以及标识文本的字体、大小、加粗、倾斜和颜色等选项。



建立文本输入框


建立文本输入框
CFTEXTINPUT标签与HTML INPUT=text标签功能相似,但利用CFTEXTINPUT你可以指定字
体和布局选项,并可以通过JavaScript或VALIDATE属性进行输入检查。
例子:CFTEXTINPUT控件
下面的例子是一个简单的CFTEXTINPUT控件,这个例子对日期输入进行检查,即用户必
须按照mm/dd/yy的格式输入一个合法的日期值。
<BR>Please enter a date:
<CFFORM NAME="Form1" ACTION="cfform_submit.cfm"
METHOD="Post">
<CFTEXTINPUT NAME="entertext"
VALUE="mm/dd/yy"
MAXLENGTH="10"
VALIDATE="date"
FONT="Trebuchet MS">
<BR><INPUT TYPE="Submit"
VALUE="Submit">
</CFFORM>
此例的显示结果为:
CFTEXTINPUT表单变量
从CFTEXTINPUT控件返回的form变量的值即用户的输入值,其格式为:
textinput_name=textinput_value
在上一个例子中,返回的form变量为:
entertext=textinput_value
在ACTION属性所指的文件用,应将该变量引用为#entertext#。
CFTEXTINPUT的输入检查
你可以利用VALIDATE属性对以下格式的数据进行输入检查:
检查输入的合法性
数据类型
描述
Date
确保输入的日期是美国格式mm/dd/yyy。
Eurodate
确保输入的是欧洲日期格式dd/mm/yyyy。
Time
确保输入的时间格式为hh:mm:ss。
Float
确保输入的是一个浮点数。
Integer
确保输入的是一个整数。
Telephone
检查电话号码的输入。电话号码的格式必须为###-###-####。连字符(-)
也可以用空格代替,区号必须以1到9之间的数字开头。
Zipcode
可以是5位或9位数字,写成#####-####的格式。连字符可以用空格代替。
Creditcard
空格和破折号会被剔除,并使用Mod10算法检查数字。
Social_security_number
数字必须写成###-##-####的格式,也可以用空格代替连字符。


建立下拉列表框




建立下拉列表框
你可以用CFSELECT建立与HTML SELECT标签相似的下拉列表框,但CFSELECT提供了对用
户输入,错误处理等的更全面的控制,并允许你根据数据库查询结果构造下拉列表。
用查询结果构造CFSELECT
利用查询结果构造下拉列表时,你只需指定为CFSELECT提供数据的查询名和要显示在下
拉列表中的查询字段名。如下例:
<CFQUERY NAME="myquery"
DATASOURCE="cfsnippets">
SELECT * FROM Employees
</CFQUERY>
<CFFORM NAME="Form1" ACTION="submit.cfm"
METHOD="Post">
<CFSELECT NAME="myselectbox"
QUERY="myquery"
VALUE="Employee_ID"
DISPLAY="FirstName"
REQUIRED="yes"
MULTIPLE="yes"
SIZE="8">
</CFSELECT>
<BR><INPUT TYPE="Submit"
VALUE="Submit">
</CFFORM>
此例的显示结果类似于:
注意例子中使用了MULTIPLE属性,用户可以选择多项内容。当MULTIPLE属性被忽略或设
置为SINGLE,并且SIZE属性被设置为零时,下拉列表框的显示结果则为:
另外应该注意的是,在此例中用VALUE属性指定了表Employee的主关键字,因此传递给
ACTION属性所指文件的form变量的值是该主关键字的值,而不是显示在列表框中的文本。



建立FORM控件


建立FORM控件
与HTML INPUT标签相似,CFINPUT标签支持下列表单输入控件:
· 单选按钮
· 多选按钮
· 文本输入框
· 密码输入框
CFINPUT也支持用VALIDATE属性或JavaScript函数进行数据输入检查。
例子:CFINPUT控件
下面的代码是一个包含了多种CFINPUT控件的表单:
<CFFORM NAME="Form1" ACTION="submit.cfm"
METHOD="Post">
<TABLE CELLPADDING=5 border=0>
<TR><TD>Please enter your user login:<BR>
<CFINPUT TYPE="text" NAME="loginID"
VALUE="name"></TD></TR>
<TR><TD>Please also enter your password:<BR>
<CFINPUT TYPE="password" NAME="pwd"
VALUE="password"></TD></TR>
<TR><TD>Please select one:<BR>
<CFINPUT TYPE="radio" NAME="radio1"
VALUE="select1">Embodied<BR>
<CFINPUT TYPE="radio" NAME="radio1"
CHECKED="yes"
VALUE="select2">
Disembodied<BR>
<CFINPUT TYPE="radio" NAME="radio1"
VALUE="select3">Don’tKnow</TD></TR>
<TR><TD>Make your selections here:<BR>
<CFINPUT TYPE="checkbox" NAME="checkbox1"
VALUE="one">Derrida<BR>
<CFINPUT TYPE="checkbox" NAME="checkbox1"
CHECKED="yes"
VALUE="two">Foucault<BR>
<CFINPUT TYPE="checkbox" NAME="checkbox1"
VALUE="three">
Kristeva</TD></TR>
<TR><TD><INPUT TYPE="Submit"
VALUE="Submit"></TD></TR>
</TABLE>
</CFFORM>
这段代码可生成如下图所示的表单:


嵌入Java程序片


嵌入Java程序片
CFAPPLET标签使你可以在CFFORM中嵌入Java程序片。要使用这个标签,首先要用
ColdFusion
Administrator对Java程序片进行注册。在Administrator中,你定义Java程序片的接口,
对其进行封装,从而使CFAPPLET标签的使用非常简单。与HTML
APPLET标签相比,CFAPPLET有如下几个优点:
· 返回值——由于CFAPPLET需要指定一个form字段名,因此你不必编写额外的
JavaScript代码来获取程序片的返回值,你可以象对待其它form变量一样直接引用返回
值:form.Variablerame。
·
使用简单——由于程序片的接口在Administrator中定义,应用程序文件中的每个
CFQPPLET标签只需引用程序片的名字并指定一个form变量名即可。
· 参数选项——通过在CFAPPLET中指定参数值,你可以覆盖在Administrator
中设定的参数值。否则ColdFusion将使用你在Administrator
中设定的参数值。
当一个程序片被注册之后,指定程序片名和form变量名即可使用该程序片:
<CFAPPLET APPLETSOURCE="Calculator"
NAME="calc_value">
与此相反,若使用HTML APPLET标签,你必须在每次使用Java程序片时设定所有的参数
注册Java程序片
在ColdFusion文件中使用Java程序片之前,必须先对程序片进行注册。注册的步骤为:
1.从ColdFusion程序组中点击Administrator图标,输入管理员密码(如果需要的话),
打开ColdFusion
Administrator。
2.点击Applets按钮,打开Registered Applets网页。
3.为要注册的程序片输入一个名字,然后点击Register New
Applet。
4.输入程序片所需的信息,选择你想要的高度、宽度、垂直和水平方向的空间,以及布
局设置。
程序片注册所需的信息如下表所列:
程序片注册域

描述
Codebase
程序片的URL,即程序片所在的目录。程序片类文件必须存放在浏览器根目录下,如:
http://servername/classes
Code
包含程序片子类的文件名。此文件名与URL相对应。不需要指定后缀名.class。
Method
程序片中返回一个字符串的方法名。你在CFAPPLET标签的NAME属性中使用这个方法名,
将该方法的返回值赋给一个FORM变量。如果此程序片没有方法,可另此域保持为空。
Height
该程序片在垂直方向的高度(象素个数)
Width
该程序片在水平方向的宽度(象素个数)
Vspace
该程序片上方和下方的空隙(象素个数)
Hspace
该程序片左右两边的空隙(象素个数)
Align
布局方式
Java
Not Supported Message
不支持Java的浏览器将显示此信息。如果你想覆盖此信息,可以在CFAPPLET
NOTSUPPORTED属性中指定另外的信息。
Parameter
Name
程序片所需参数的名字。
Value
对每个参数指定一个缺省值。程序片的文档中会说明各个参数的合法值。
5.点击Creae,完成注册过程
用CFAPPLET嵌入一个程序片
对一个Java程序片进行注册之后,你就可以用CFAPPLET标签在ColdFusion文件中嵌入该
程序片。CFAPPLET有两个必须的属性,APPLETSOURCE和NAME。由于程序片已经注册,每
个参数都已指定了缺省值,因此你可以用非常简单的形式嵌入该程序片。
<CFAPPLET APPLETSOURCE=" appletname"
NAME="form_variable">
覆盖布局设置和位置设置
要覆盖Administrator
中定义的各个选项设置,你可以使用可选的CFAPPLET参数,指定其它的选项值。例如,
下面的CFAPPLET指定了定制的位置设置和布局设置。
<CFAPPLET APPLETSOURCE="myapplet"
NAME="applet1_var"
HEIGHT=400
WIDTH=200
VSPACE=125
HSPACE=125
ALIGN="left">
覆盖参数值
你也可以为Java程序片提供新的参数值,以覆盖Administrator中定义的缺省值。要注
意的是,要覆盖一个参数,你必须已经在Administrator中为程序片定义了该参数并提
供了一个缺省值:
<CFAPPLET APPLETSOURCE="myapplet"
NAME="applet1_var"
Param1="registered parameter"
Param2="registered parameter">
处理来自程序片的form变量
CFAPPLET标签要求你必须为程序片指定一个form变量名。这个变量可以象其它form变量
一样以form.variable_name的形式被引用,其值是Java程序片的返回值。
并非所有的Java程序片都有返回值,有些程序片,如图形动画,并不返回数据。对这种
程序片,Administrator中的方法(method)域保持为空。而其它的程序片都有一个会
返回数据的方法。注册每个程序片时,你只能使用一个方法。如果一个程序片具有多个
方法,你可以用同一个名字为你想使用的每个方法再注册一次该程序片。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值