阅读内容 

ColdFusion 4 初级教程(长)

[日期:2005-11-09] 来源:  作者: [字体: ]

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中,一个变量就是分配了一个值的参数,变量的使用存在于ColdFusion应
用程序的方方面面,不使用变量而开发应用程序是不可想象的。例如,在处理表单输入
时,要用变量将表单中的数据传递给ACTION属性所指定的网页。这种变量也被称为动态
参数。
变量的创建
用CFSET创建变量
创建变量的最简单的方法是用CFSET标签,你可以在应用程序的任何地方使用CFSET标签,
所创建的变量可以在同一文件中该标签后面的任何位置引用。只需指定变量名,并分配
一个静态值或一个参数,或表达式。其语法为:
<CFSET VariableName = Value, Parameter, or Expression>
例1:静态值
<CFSET FirstName = “Jack”>
此例创建了一个变量 FirstName,其值为静态值Jack,注意变量的值为字符串时要使用
双引号。再如,创建一个变量UserNumber,其值为数26:
<CFSET UserNumber=26>
例2:动态参数
<CFSET CurrentUserID=GetUserID.User_ID>
例中,GetUserID是一个数据库查询操作的查询名,User_ID是所查询的一个字段名。此
例定义了变量CurrentUserID,其值为一个数据库查询结果的User_ID字段的值。再如:
<CFSET UserDescription = “#UserName# is a wonderful person.”>
其中UserName是另一个变量。
例3:表达式
你可以用CFSET创建一个变量,将一个表达式的值分配给它,如:
<CFSET TotalValue = 2*(4+5)>
<CFSET Pay=”John’s take home pay is”&(TotalValue-1000)>
注意:在ColdFusion中,变量没有类型之分,也就是说,你不需要指定变量值的数据类
型。
检测变量的存在
在使用一个变量之前,你可以用函数IsDefined检测它是否存在。例如,下面的例子检
测名为Order_ID的变量是否存在:
<CFIF Not IsDefined(“FORM.Order_ID)>
<CFLOCATION URL=”previous_page.cfm”>
</CFIF>
如果你试图使用一个没有定义的变量,ColdFusion将无法处理该文件。





用CFPARAM创建缺省变量




用CFPARAM创建缺省变量
创建变量的另一个方法是使用CFPARAM标签,该标签先检测变量是否存在,如果该变量
不存在,则提供一个缺省值。CFPARAM标签的语法为:
<CFPARAM NAME=”VariableName” DEFAULT=”DefaultValue”>
根据不同的需要,使用CFPARAM标签的方式有两种:
·只提供NAME属性,检测所必需的变量是否存在,如果不存在,ColdFusion
Server停止处理该文件 。例如,下面的语句指出,该文件需要两个变量StartRow和
RowsToFetch,处理才能继续进行:
<CFPARAM NAME=”Form.StartRow”>
<CFPARAM NAME=”Form.RowsToFetch”>
如果包含这两个标签的文件被调用,但没有提供两个变量中的任一个,则会发生错误,
文件被停止处理。
·同时提供NAME属性和DEFAULT属性,检测一个可选的变量是否存在,如果存在,
则处理继续进行,该变量的值不作改变;如果变量不存在,则创建该变量,赋值为
DEFAULT属性所提供的值。例如:
<CFPARAM NAME=”cookie.SearchString” DEFAULT=”temple”>
你可以用CFPARAM标签代替分支语句,为URL及Form变量设置缺省值。
在网页中显示变量及井号的使用
要在网页中显示一个变量,需把变量包含在CFOUTPUT标签中,例如:
<CFOUTPUT>
Your favorite color is #Clint.FavoriteColor#.
</CFOUTPUT>
注意,在CFOUTPUT标签内,要始终把变量名括在井号(#)中。这表示该变量名要被当
作动态参数来计算其值,ColdFusion将输出变量的值而不是变量名本身。
当要区分一个字符串是变量还是文本时,需要使用井号,以表示该位置要用变量的值来
代替。例如:
<CFQUERY NAME=”search” DATASOURCE=”Company”>
Select * From Employees Where LastName=’#Form.LastName#’
</CFQUERY>
在CFSET标签中,不要滥用井号,例如,不要用<CFSET x=#Cos(0)#+>;而要用
<CFSET X=Cos(0)+1>
由于井号在ColdFusion中有特殊用途,要表示井号本身时,需用两个连续的井号来表示。





变量命名规范




变量命名规范
ColdFusion变量及form字段的命名应遵循如下规范:
·变量名必须以字母开头,后面可以跟任意多个字母,数字,或下划线 。
·变量名中不能包含空格和特殊字符。例如,UserName_1,UserName_2,UserName
是合法的命名,1stUset,WhatAName!,和User-Name都是非法的变量名。
·对字段名和变量名,应使用描述性的名字,而不是简写。这使其他人更容易读
懂你的程序,也帮助你自己记住该变量的用途。
·注意,在同一个CFM文件中,变量名和查询名不能相同。
·ColdFusion变量不区分大小写。
变量的引用范围
你已经注意到,在上面的某些例子中,变量名带有前缀,下面就将讨论这方面的内容。
ColdFusion变量没有数据类型之分,但变量有不同的来源(如来自表单,查询等)和不
同的引用范围(如本文件范围内,整个应用程序范围内等)。ColdFusion用前缀来区分
不同来源或引用范围的同名变量。例如,Form.State表示来自Form提交的变量State,
而URL.State表示来自URL的变量State,这是两个不同的变量。在创建变量时,除非两
个不同范围的变量同名,你不必要使用前缀,但使用前缀使程序更加清晰,并且可提高
处理速度。
下表列出了ColdFusion中变量前缀的类型,关于这些类型的详细内容将在后文讨论:
变量前缀
类型
使用方法
查询变量
QueryName.variablename
局部变量
Variables.variablename
URL参数变量
URL.variablename
Form字段变量
Form.variablename
Client变量
Client.variablename
Server变量
Server.variablename
Session变量
Session.variablename
应用程序变量
Application.variablename
HTTP
Cookies变量
Cookie.variablename
CGI环境变量
CGI.variablename
当你没有指定变量前缀时,ColdFusion将按如下的顺序搜索该变量:
用CFSET和CFQUERY创建的局部变量
CGI变量
File变量
URL变量
Form变量
Cookie变量
Client变量
注意:ColdFusion不会自动搜索Application变量和Session变量,定义和使用这两种变
量必须用前缀。





变量的种类




变量的种类
以下对ColdFusion的各种变量进行逐一介绍。
局部变量
局部变量是用CFSET标签和CFPARAM标签所创建的变量的缺省类型。这种变量只能在创建
它的文件中或包含该文件的文件中引用。
查询变量
一旦执行了一个查询,就可以通过查询变量来访问查询的结果。查询变量的前缀是查询
名,变量名即是表中的字段名。例如,你执行了一个名为LookupUser的查询,所查询的
字段之一是名为ID的字段,那么你可以用变量LookupUser.ID来访问查询结果中的ID字
段的值。
URL变量
URL变量以variablename=value的形式追加在URL后面,传递给URL所指的网页,在该网
页中用URL.variablename引用该变量。
Form变量
网页之间传递参数的最常用方法就是用Form变量。当客户在Form字段中输入数据并提交,
其输入的数据以Form变量的形式传递给ACTION属性所指的网页,在该网页中用
Form.variablename引用该变量,variablename即是Form字段的名字。
Cookie变量
Cookie是服务器端的应用程序(如ColdFusion)在浏览器中存储信息的一种机制。存储
在浏览器中的Cookie可以返回给服务器端应用程序。利用Cookie,应用程序可以创建与
某个特定浏览器相关的变量。例如,你可以为背景颜色建立一个Cookie,从而使你的站
点在不同客户的浏览器中具有不同的颜色。
Cookie是与特定站点相关的,当浏览器访问一个特定的站点时,基于该站点的Cookie被
传至服务器端。
可以用SSL(Secure Sockets
layer)对Cookie进行加密。Cookie将一直存在,直到它们到期或被删除。目前的主流浏
览器都支持Cookie。
 
创建Cookie
标签CFCOOKIE用来建立Cookie,例如:
<CFCOOKIE NAME="User_ID" VALUE="2344"
EXPIRES="100">
这个例子创建了变量Cookie.User_ID,其值为2344,将在100天后到期。
Cookie建立之后,同一站点上的所有ColdFusion网页均可以引用该Cookie。这意味着你
可以用Cookie在网页间传递参数。注意,Cookie不适于用来存储安全信息,如密码,信
用卡号码等。
注意:如果在创建Cookie的文件中,在CFCOOKIE标签后执行了CFLOCATION标签,则
CFCOOKIE标签创建的Cookie将会丢失。
在网页中使用Cookie
一旦在客户浏览器中存储了Cookie,每当浏览器请求你站点的网页时,Cookie变量会被
自动传给Web服务器。与其它类型的变量一样,你可以使用前缀来引用Cookie变量的值,
例如:
<CFOUTPUT> #Cookie.User_ID#
</CFOUTPUT>
删除Cookie
要是删除一个Cookie,你可以用CFCOOKIE标签,将EXPIRES属性设为“now”,例如:
<CFCOOKIE NAME="User_ID" VALUE="#User_ID#"
EXPIRES="now">
当浏览器关闭时,这个Cookie会被删除。
Client变量
Client变量是与特定客户相关的变量。当客户在一个应用程序的不同文件间移动(此处
“移动”指客户从一个文件中链接到另一个文件)时,Client变量可以用来维持客户的
状态,识别一个特定的客户。
对一个启动了客户状态管理的应用程序,ColdFusion为每一个请求该应用程序文件的浏
览器建立一个客户记录,客户记录由一个唯一的令牌来标识,令牌存储在客户浏览器的
一个Cookie中。有了客户记录后,就可以在客户记录中定义Client变量,这些变量可在
整个应用程序的任何文件中引用。当客户请求一个文件时,ColdFusion根据浏览器提供
的令牌来选择相应的客户记录,于是所有的Client变量均可以使用。
创建client变量的步骤如下:
在Application.cfm文件的CFAPPLICATION标签中,设置CLIENTMANAGEMENT=”yes”,启
动客户状态管理。(关于Application.cfm文件后文有介绍)
在CFAPPLICATION标签中,通过设置CLIENTSTORAGE属性,选择client变量的存储位置。
其缺省位置在ColdFusion Administrator中设置,可以是注册表,已存在的数据源,或
Cookies。
用CFSET或CFPARAM创建该变量。例如:
<CFSET Client.FavoriteColor=”Conflower Blue”>
标准Client变量
ColdFusion提供了几个标准Client变量,这些变量有助于记录客户访问你站点的次数和
上次访问的时间等信息。例如,下面的例子显示了客户上次访问你站点的时间:
<CFOUTPUT>
Welcome back to the Web SuperShop, your last visit
was on #DateFormat(Client.LastVisit)#.
</CFOUTPUT>
标准Client变量具有只读属性,你可以访问它们,但不能在程序中设定它们的值。这些
变量包括:
·CFID
·CFToken
·URLToken
·HitCount
·TimeCreated
·LastVisit
不利用Cookie而实现客户状态管理
ColdFusion中,客户状态管理被设计为使用Cookie,这是识别一个客户的标准方法。
你也可以不利用Cookie而实现客户状态管理,要做到这一点,你必须通过隐藏的Form字
段或URL变量,在网页之间传递客户ID(CFID)和客户安全令牌(CFTOKEN),这需要教
高的编程技巧。
Client变量的存储
Client变量的缺省存储位置是系统注册表,你可以用ColdFusion Administrator改变其
缺省位置,将Client变量存在SQL数据库或Cookie中。在Application.cfm文件中用
CFAPPLICATION标签的CLIENTSTORAGE属性可以设置Client变量的存储位置,该设置将覆
ColdFusion Administrator的缺省设置。例如:
<CFAPPLICATION NAME="myapplication"
CLIENTMANAGEMENT="Yes"
CLIENTSTORAGE="mydatasource">
如果不设置CLIENTSTORAGE属性,ColdFusion将使用缺省设置。注意,Client变量的存
储机制具有排斥性,当使用某一种存储类型时,其他存储类型的Client变量不可访问。
用Cookie存储Client变量时,应考虑如下的限制因素:
·Netscape Navigator只允许为一个特定主机设置20个Cookie。ColdFusion使用
了两个Cookie用于CFID和CFTOKEN,并用一个名为CFGLOBALS的Cookie存储客户的全局数
据如HitCount,TimeCreated,和LastVisit。
·Netscape Navigator设定了每个Cookie不能大于4K字节的限制。也就是说你不
能在Cookie中存储过多的数据。
·如果客户浏览器禁止使用Cookie,Client变量将不能工作。
得到Client变量列表
使用函数GetClientVariableslist()可以获得Client变量的列表,该函数返回的是用逗
号隔开的,由CFAPPLICATION所确定的应用程序范围内的Client变量的名字。标准
Client变量不在返回列表中。
删除Client变量
用函数DeleteClientVariable()删除Client变量,例如:
<CFSET
IsDeleteSuccessful=DeleteClientVariable("MyClientVariable")>
该函数只能删除由CFAPPLICATION确定的应用程序范围内的Client变量。
同样,通过ColdFusion
Administrator中的设置,可以在一个特定的天数之后删除Client变量,对存储在注册
表中的变量,其缺省值是90天,对存储在数据库中的变量,缺省值是10天。注意,你不
能删除系统提供的标准Client变量。
Application变量和Session变量
Application变量和Session变量是整个应用程序范围内的变量,在应用程序的任何文件
中都可以访问。你要在变量名前面加前缀才能访问这些变量,例如,
“Session.MyVariable”,“Application.MyVariable”。由于它们可在整个应用程序
范围内访问,因此可以利用它们在网页间传递数据。
允许Application变量和Session变量
与Client变量一样,可以用CFAPPLICATION标签允许Application变量和Session变量。
(具体语法请参阅ColdFusion文档CFML language reference部分)
与Client变量不同的是,Application变量和Session变量始终保存在服务器的内存中,
这使得它们的存取速度更快。另外,你可以用ColdFusion Administrator或在
CFAPPLICATION中,设置这两种变量的生存时间。你也可以完全禁止Application变量和
Session变量。
Session变量
与Client变量一样,Session变量与某个特定的客户相关,它也需要一个客户ID,并始
终与客户ID连系在一起。当客户第一次请求一个ColdFusion应用程序文件时,即建立一
个Session,Session有一定的生存时间,如果在限定的时间内客户没有向服务器发出请
求,则该Session结束。
如果两个客户连接到服务器上的同一个应用程序,这是两个独立的Session,每个客户
都有自己的Session变量,它们可能有不同的值,客户不能访问别人的Session变量。
Session变量适于存储与特定客户有关的全局性信息。当客户第一次请求网页时,有关
信息被初始化在Session变量中,客户访问其它网页时,这些信息仍可以直接使用。
要允许Session变量,可在Application.cfm文件的CFAPPLICATION标签中设置
SESSIONMANAGEMENT
Session变量的生存期
Session变量有一个特定的生存期,正是这个生存期定义了一个“Session”。当你在一
个Session变量的生存期内访问它时,该变量可以访问,如果超过了生存期,该变量将
不再存在。
Session变量的缺省过期时间是20分钟,即如果浏览器在20分钟内没有与服务器联系,
该Session将被结束。你可以用ColdFusion Administrator改变这一缺省设置。
你也可以用CFAPPLICATION标签的SESSIONTIMEOUT属性来设置Session变量的过期时间,
这将覆盖Administrator的缺省设置。
Application变量
Application变量也是可以在整个应用程序范围内访问的变量。与Session变量不同的是,
Application变量不针对特定的客户,它不需要与特定的客户ID相关联,一个应用程序
的所有客户可以访问同一个Application变量。这种变量适于存储应用程序级的不与特
定客户相关的,由所有客户共同使用的数据。
这里有必要解释一下什么是“应用程序”。在ColdFusion中,通过在Application.cfm
文件的CFAPPLICATION标签中设置NAME属性,为应用程序指定一个应用程序名,所有具
有相同应用程序名的文件属于同一个应用程序,而同一个应用程序的所有文件共享所有
的Application变量,这些变量对所有的客户都相同。(关于Application.cfm文件及
“应用程序”的定义,后文有更多叙述)
Application变量的生存期
应用程序也有一定的生存期,当第一个访问者请求一个应用程序中的某个文件时,
ColdFusion初始化该应用程序,如果在限定的时间内没有客户再请求该应用程序的文件,
则该应用程序被结束,Application变量不再存在。
Application变量的缺省过期时间是2天。你可以用ColdFusion Administrator改变这个
缺省值。你也可以用CFAPPLICATION标签的APPLICATIONTIMEOUT属性设置Application变
量的过期时间,从而覆盖Asministrator的缺省设置。
注意:使用Application变量和Session变量时,必须使用前缀。
Server变量
Server变量可以在当前Web服务器所服务的所有应用程序中,由所有的客户引用,直到
ColdFusion Server关闭。
Server变量适于存储不经常改变的,可以被多个客户和多个应用程序共享的数据。你可
以用Server变量存储运行在你站点上的所有应用程序都需要的信息,例如关于某个数据
源的信息。
ColdFusion带有下列内建的Server变量:
·Server.ColdFusion.ProductName—--返回ColdFusion产品名。
·Server.ColdFusion.ProductVersion---返回ColdFusion的版本信息。
·Server.ColdFusion.ProductLevel---返回ColdFusion的产品等级信息。
·Server.ColdFusion.SerialNumber---返回ColdFusion的序列号。
·Server.OS.Name---返回服务器操作系统的名字。
·Server.OS.AdditionalInformation---返回关于操作系统的附加信息。
·Server.OS.Version---返回服务器操作系统的版本信息。
·Server.OS.BuildNumber---返回服务器操作系统的建立号。
注意:Server变量具有读-写属性,小心不要覆盖了内建的Server变量。
 
 
CGI环境变量
每当浏览器向Web服务器请求服务时,就会创建一系列环境变量,有些由浏览器创建,
有些由服务器创建。这些变量称为CGI变量,用前缀“CGI”来引用(既使服务器使用
API而不是CGIColdFusion相通信)。
环境变量中是浏览器和服务器之间对话的一些相关数据,如IP地址,浏览器类型,通过
认证的客户名等。你可以在浏览器所请求的文件中的任何位置引用CGI环境变量。所有
CGI变量都是只读的。
注意,在你的应用程序中可以引用的CGI变量与具体的浏览器和Web服务器软件有关。
检测CGI变量
因为并非每种浏览器都支持所有的CGI变量,当测试一个CGI变量的存在时,ColdFusion
总是返回TRUE,既使浏览器并不支持该变量。避免这种情况的方法是检测一个空字符串,
而不是检测逻辑值,例如:
<CFIF CGI. varname IS NOT "">
CGI variable exists
<CFELSE>
CGI variable does not exist
</CFIF>
服务器CGI变量
下表列出了由服务器创建的最常用的CGI变量(并非每种浏览器都支持这些变量):
服务器CGI变量
变量
描述
SERVER_SOFTWARE
响应请求的服务器软件的名字和版本。格式:名字/版本。
SERVER_NAME
服务器的主机名,DNS别名,或IP地址。
GATEWAY_INTERFACE
服务器所遵循的CGI规范的版本。格式:CGI/版本。
SERVER_PROTOCOL
这次请求所使用的协议的名字和版本。格式:protocol/版本
SERVER_PORT
请求传至的端口号。
REQUEST_METHOD
请求服务时使用的方法,对HTTP是Get,Head,Post等。
PATH_INFO
由浏览器提供的特殊路径信息。访问脚本可以使用虚拟路径,后面跟以特殊路径信息,
该信息存在PATH_INFO中。
PATH_TRANSLATED
服务器转换过的PATH_INFO,虚拟路径映射为物理路径。
SCRIPT_NAME
指向要执行的脚本的虚拟路径,用于自引用的URLs.
QUERY_STRING
跟在URL中“?”后面的查询信息。
REMOTE_HOST
请求服务的主机名。如果服务器不知道这项信息,它将创建REMOTE_ADDR,而不是
REMOTE_HOST。
REMOTE_ADDR
请求服务的远程主机的IP地址。
AUTH_TYPE
如果服务器支持客户认证,并且脚本受保护,此变量包含基于特定协议的认证方法。
REMOTE_USER
AUTH_USER
如果服务器支持客户认证,并且脚本受保护,此变量包含已认证的客户名。
REMOTE_IDENT
如果HTTP服务器支持RFC931标识,这个变量被设置为远程的客户名。
CONTENT_TYPE
对带有附加信息的查询,如HTTP POST和PUT,此变量指出附加信息的类型。
CONTENT_LENTH
客户提供的信息的长度。
客户CGI变量
下表列出了由浏览器创建后传递给服务器的,最常用的CGI环境变量:
客户CGI变量
变量
描述
HTTP_REFERER
引用的文档。这是链接所来自的文档或提交Form数据的文档。
HTTP_USER_AGENT
客户当前使用的浏览器。格式:软件/版本库/版本。





利用URL和Form传递变量




利用URL和Form传递变量
上文中已讲到,利用Client变量,Session变量,Application变量等,可以在不同的网
页之间传递数据,下面介绍利用URL和FORM来传递变量的方法。这两种方法可以在网页
之间传递局部变量。
利用URL传递参数
你可以把参数附加在URL中,传递给该URL所指向的目标文件。用一个问号将要传递的参
数与URL的文件地址隔开,在问号后面追加上变量名及其值,于是在目标文件内就可以
引用该变量,这种变量即前文所述的URL变量。例如:
<A HREF="example.cfm?user_id=5&color=#mycolor#">
在这个例子中,变量user_id,值为5,和变量color,值为表达式#mycolor#的值,被传
递给超链接所指的文件example.cfm。
在目标文件example.cfm中,你可以用URL.user_id和URL.color的形式来引用这两个变
量,如:
<CFOUTPUT>
Your user ID is #URL.user_id# and
your favorite color is #URL.mycolor#.
</CFOUTPUT>
利用URL传参时,应注意以下几点:
·用一个问号将URL地址与要传递的参数隔开。
·用符号“&”将不同的参数隔开。
·不要使用空格,有些浏览器在检测到空格时,会将URL截断。
·不要使用特殊字符,如&,?,.,和#。
如果你要传递的值有可能包含空格和特殊字符,应使用函数URLEncodeFormat(),例
如:
<CFSET FullName="Bob Smith">
<CFOUTPUT>
<A
HREF="printname.cfm?FullName=#URLEncodedFormat(FullName)#">
Click here</A>
</CFOUTPUT>
关于此函数的详细信息请参阅CFML language reference。
用Form传递参数
通常,使用Form接收客户的输入,然后在Action属性所指的文件中利用Form变量得到客
户输入的数据并作处理。你也可以利用隐藏字段从一个网页向另一个网页传递参数。例
如,下面的Form中包含一个名为Customer_ID的隐藏字段,被传递到文件example.cfm中。
<FORM ACTION="example.cfm" METHOD="Post">
<INPUT TYPE="Hidden"
NAME="Customer_ID" VALUE="24">
<INPUT TYPE="Submit" VALUE="Enter">
</FORM>
在文件example.cfm中,你可以用Form.Customer_ID的形式引用该变量。
也可以用隐藏字段传递动态参数,如查询结果等,例如:
<FORM ACTION="example.cfm" METHOD="Post">
<CFOUTPUT QUERY="GetCustomer">
<INPUT TYPE="Hidden" NAME="Customer_ID"
VALUE="#Customer_ID#">
</CFOUTPUT>
<INPUT TYPE="Submit" VALUE="Enter">
</FORM>
小节:
本章介绍了ColdFusion的变量,其要点是各种变量的引用范围和生存期,另外要注意井
号的使用。





条件选择




条件选择
每当客户请求一个应用程序文件时,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 serverOracle驱动程序,以及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>





数据输入检查




数据输入检查
当你使用表单接收用户输入以执行