第三期:ColdFusionMX编程入门
序言
上一期我们讲解了ColdFusionMX的基本管理操作,并且熟悉了ColdFusionMX的管理界面布局,而且上一期最后我们演示了两个非常短小的coldfusion程序,这一期会详细讲解coldfusion的入门编程,其中包括在asp中对于初学者而言非常令人头疼的数据库操作。
在每次开始进入正题之前,每一期的序言内容都会为大家介绍一些关于ColdFusion发展或者其他一些具有价值的小知识,第一期为大家介绍了Macromedia MX产品的策略和coldfusionMX在该产品策略中的位置,而第二期则为大家介绍了ColdfusionMX的版本差异,那么这一期的序言让我们了解一些什么呢?关于ColdFusion的发展。
1995年是个值得纪念的年代,因为发生在那个年月的事情已经是上个世纪的事情了,而且不单单是这么多。如果老资历的开发人员回忆一下的话,那个时候的web是html和cgi称雄的天下,静态页面是html,而动态程序则90%以上是cgi,在我印象中便是如此。美国的一对兄弟allire,在为自己的客户解决数据库访问的问题时,感觉到了cgi程序在编写和维护上的难度是不能容忍的困难。于是,具有计算机天赋的Jeremy Allire便在1995年编写了一种快速响应且易于编写的动态脚本语言,叫做coldfusion,一经推出,便震撼整个网络行业。之后,兄弟俩看到了coldfusion的发展前途,便成立了Allire公司(后来被macromedia收购)。之后的几年,全球500强中的一半都采用了coldfusion来解决公司不同情况的问题。通过不断的版本修改和开发者的不断壮大,Coldfusion后来发展成为业界知名的企业级解决方案的开发首选。现在,为了产品线的统一,为了工业标准的统一,为了完全兼容Java平台,Macromedia发布了ColdfusionMX。而众位以前经常看到的Neo这个词则是macromedia对于使用新一代coldfusion开发行业解决方案的编码名称。
如果大家看到neo这个词,就不难理解Macromedia对于coldfusionMX的殷切期望,大名鼎鼎的电影《黑客帝国》中的男主人公的名字也叫做Neo。以上的相似之处只是作者本人的推测而已了。好,不多聊了,进入我们这一期的正题。
第一部分 ColdFusionMX Basic tag编程
作者本人看过很多关于中英文的教材,认为最有效的一种方式就是参照实例的代码段来配合讲解的过程最为优秀。所以,对于每一个coldfuiosn的tag,作者不打算一一赘述,各位朋友可以通过查看一些reference来了解所有的tag功能和语法。关于标准的文档,请在安装coldfusionmx之后参考administrator管理界面里包含的官方文档。
那么作者采用一种什么样的方式来帮助想学习ColdFusionMX的朋友快速的进入动手编写代码的境界呢?如果是采用把所有的Tag全部都按照顺序讲解,那么会造成学习者兴趣不同程度的下降。各位可能在前面的教程中知道了Macromedia MX中DreamweaverMX和ColdFusionMX之间的关系。DreamweaverMX的推出就是为开发ColdFusionMX的应用提供一个完善的工具,因为它集成了以前ColdFusion Studio、UltraDev、Dreamweaver、HomeSite四款产品的主要功能于一身,所以,只用DreamweaverMX来制作静态页面,可以说只用到了不到三分之一的功能。那么,本系列的教程就从DreamweaverMX中集成的开发ColdfusionMX程序功能入手,让大家先了解如何在DreamweaverMX中开发ColdFusionMX程序,然后再提供给大家使用ColdFusionMX开发高级应用的技巧。
打开DreamweaverMX的界面可以看到处于右上方快捷Object面板,而其中会有如下三个Object面板是CFML Basic、CFML FLOW、CFML Advanced,而本教程的讲解就从CFML Basic开始。
CFML Basic被选中后会出现如下的图标排列:
那么从左到右的图标依次表示CfServerVariables、CFQuery、CFOutput、CFInsert、CFUpdate、CFInclude、CFLocation、CFSet、CFParam、注释、变量符号、CFScript。我们的教程也从CFSet开始。因为它是ColdFusionMX中最简单也是最重要的一个Tag。
单击 图标,会出现如下代码段:cfset >,这个cfset的标签就是Coldfusion中设置变量的特有标签。在ColdFusion中,每个特有的由CFMX Server来负责解释的Tag都用cf开头,如cfset、cfquery等。而cfset的标准语法格式是:
等号左边表示变量名称,等号右边是变量值。很简单,如果你要创建一个叫做var1的变量,赋值为hello,friend!,那么你需要这样写出你的程序代码:
cfset var1="Hello,friend!">
那么你要设置中文,就这样写好了:
cfset var1="你好,朋友!">
那么,当你为你的变量设置一个数值时,就不需要在变量值的两侧加上双引号了。比如:
cfset PI=3.1415926>。另外,cfset这个tag的作用还可以进行数值的运算和变量的动态转移。进行数值计算和变量跳转的编码方式也非常的简单,请看下面的代码片断:
cfset PI=3.1415926>
cfset number_1=PI*10>
cfset number_2=number_1>
我想有一点点程序经验的朋友对上面代码的理解都应该不成问题,它执行了一个PI值的赋值,以及对PI变量的乘法,结果赋值给number_1,最后,number_1变量的结果指向变量number_2。
另外,Cfset还有另外一种用法,让我们来看看:
cfset var1="Test">
cfset "#var1#"="hello!">
cfoutput>#test#/cfoutput>
结果输出是什么?答案是:hello!这个字符串。原因很简单,hello!这个字符串付给了一个叫做"#var1#"的变量,这个变量等价于test,也就是test这个字符串自动变为一个变量名称。
单击 图标,叹号表示的tag是cfparam,这个tag的基本功能和cfset是一致的,也是为变量赋值,那么它与cfset有什么区别呢?区别就是检查一个变量是否存在,若存在,则给予一个默认值。看看点击它以后出现的属性设置窗口:
在上图中可以看到cfparam具有三个属性,那就是name、Default、Type,name表示变量的名称,Default表示变量的初始值,默认为空,Type表示变量的类型,CFMX为cfparam设置了如下类型:
变量类型已经涵盖了我们用ColdFusion进行编码是可能用到的变量类型。Cfparam这个Tag的信息可以点击属性设置窗口中的tag info来了解详细的使用方法,以后其他的tag也可以在属性窗口中通过点击tag info来了解。那么,设置完cfparam之后,出现的代码行如下:
cfparam name="URL.id" default="1" type="any">
这行代码等价于:
cfif not definede(URL.id)>
cfset URL.id=1>
/cfif>
判断URL.id这个变量是否存在,如果不存在,那么给一个值1。这个功能经常在开发注册和验证的模块中配合cfform这个tag使用,后面的教程就会看到。
单击 图标,就是在你的cfm页面里面加入coldfusion特有的注释符号:!--- content --->,例如:
!---
设置一个变量名字叫做var_hello
--->
上面这段代码就在.cfm被cf服务器解释的过程中被忽略,良好的注释习惯是开发大规模复杂应用的必要,而且也是一个优秀的开发者应该具备的素质。
单击 图标,会出现以后大家经常在.cfm文件中遇到的##标记,那么它用来显示coldfusion中的变量结果,就像前面用到的程序:
cfset var1="Test">
cfoutput>#var1#/cfoutput>
就是将var1变量的值显示出来。
单击 图标,则会在页面中添加特有的coldfusion Server variable。DreamweaverMX中弹出的界面是:
而CFMX支持的Server variable有以下种类:
下面就把Server variables中经常用到的变量做简要介绍。Server variables在coldfusion中被成为CGI variables。它使用了Server端的通用网关接口变量。而CGI是很普遍的一种脚本方式,ColdfusionMX也支持CGI-Bin特有的一些变量格式。
HTTP_REFERER:判断浏览者来自哪个URL
HTTP_USER_AGENT:判断使用的浏览器类型,目前流行的几款浏览器都可以识别。
QUERY_STRING:就是.cfm?后面参数附带的信息。
REMOTE_ADDR:浏览者的IP地址
其他的变量各位可以通过查看官方提供的Reference来了解,这里就不再赘述。
让我们来看这段代码:
cfoutput>
你好!
您的浏览器是#CGI.HTTP_USER_AGENT#!
/cfoutput>
结果显示是作者本人的浏览器版本:
您的浏览器是Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)!
单击 图标,则是使用coldfusion中最为常用的tag:cfquery。这个标签用来完成数据库查询。
在开始说明数据库查询之前,作者本人对广大开发者提一个醒,希望各位用coldfusionmx作开发的时候,尽量避免使用access和mysql,因为这两款数据库与coldfusionmx进行信息交互会出现或多或少的中文问题,希望各位使用SQL Server数据库或者oracle。当然使用access或者mysql进行英文处理当然没有问题。早期的coldfusion5在处理数据库上,access等小型数据库不存在中文问题,可能由于coldfusion核心代码被重新编写,jdbc对应的中文问题就出来了,但是相信macromedia不久就会修正这个问题。作者本人在使用cfquery的时候,出于讲解方便,会使用access数据库,但是后续的用到中文更改数据库记录的操作都会转向SqlServer,请大家注意。
如何解决中文问题,请各位参考这里的信息:
http://www.flashempire.net/showthread.php?s=1871e826d3945c355df09e5ef8190a6ethreadid=120844
点击cfquery标签之后dwmx出现的界面是这样的:
上图就是关于设置cfquery的窗口,图形左边的红色矩形内的三个部分可以对cfquery进行不同细节程度的设置,general是我们最长用到的设置,connection则是连接设置,一般connection的部分属性直接就可以通过cfmx administrator中的datasource设定来确定了。Persistent Queries表示设定一个持续的可以从缓存里调用的查询。下面是cfquery的标准语法:
其中,name属性是必须要有的,就是给你定义的cfquery一个名字,以后其他地方要调用的时候就会用到这个name属性值找到相对的query。Datasource则是该查询来自的数据源的名称,而数据源的名称则是通过设定cfmx administrator的。这里有必要插入一段关于设置数据源的方法。打开cfmx administrator管理界面,点击Data Services里的data Sources,然后看到管理界面的右侧区域出现cfmx administrator已经定义好了的数据源,截图如下:
上图表示1的部分数据库driver用的是microsoft access,而被2框选的部分则是两个透过windows odbc设置的数据源名称,数据驱动用的是windows的odbc socket。而被3框选中的区域则是使用Microsoft SQL Server驱动定义的数据源。设置access数据库是一件非常容易的事情,首先你的access数据库可以放在你本地硬盘的任何一个位置,并不是非要放在webserver的某个目录之下,然后,从上图中,可以从add new data source中填写一个你想要的数据源名称,名称只要是标准的字符串就可以了,不能用数字开头。然后,从Driver的下拉选项中,选择Microsoft access这个驱动,然后点击add,就进入了详细设置页面:
基本上,设置access数据库不需要设置什么高级选项,但是如果有需要,比如限制对数据库的操作等等,可以点击show advanced settings来修改。上图中的cfsnippets就是安装完coldfusionmx后的默认案例数据库,就像装完access这个软件后,自动就有northwind这个库一样。下面的cfquery例子我们就以cfsnippets为主。而sql server只是多加了几步的设置,首先,在设置sqlserver的数据源时要填入sql server的database name,其次,要输入sql server所在的ip,本机就用localhost就可以,最重要的是,必须输入一个能够有访问该数据库的权限的用户名和密码,作者这里推荐在sql server里设置好特定的用户名和密码,而不是使用默认的sa帐号。
回到cfquery属性说明,其他的属性则不是必须具备的属性。关于属性的说明可以参考coldfusionMx自带的reference 手册。
让我们来看一段简单的cfquery的代码:
CFQUERY NAME="test" DATASOURCE="cfsnippets">
SELECT *
FROM Employees
ORDER BY Emp_ID
/CFQUERY>
cfoutput query="test">
#Emp_ID# | #FirstName# | #LastName# | #EMail# | #Phone# | #Department# br>
/cfoutput>
结果是什么?看看下面的截图:
令人惊奇的是可以循环输出!!!数数cf代码,只有几行,而asp,jsp,php要完成同样的效果,需要写几行代码呢?想必用过的人都知道。
再来看一个复杂点的cfquery代码:
cfquery name="queryname" datasource="cfsnippets">
SELECT *
FROM Employees
WHERE LastName = 'Peterson'
/cfquery>
cfoutput>#queryname.FirstName# br>
#queryname.LastName# br>
#queryname.Department# br>
#queryname.recordcount# br>
#queryname.currentrow# br>
#queryname.columnlist#
/cfoutput>
cfquery Name="queryname" datasource="cfsnippets">
SELECT *
FROM Employees
/cfquery>
table border="1">
tr>
td> Last Name /td>
td> First Name /td>
td> Department /td>
/tr>
cfoutput query="queryname">
tr>
td>#LastName#/td>
td>#FirstName#/td>
td>#Department#/td>
/tr>
/cfoutput>
/table>
那么结果如下截图:
我们首先是select出一段关于perterson这个雇员的相关信息,然后再列出所有雇员的信息。其次是用queryname.recordcount查看符合的记录数,用queryname.currentrow查看当前的记录是在数据库中的第几条,用queryname.columnlist表示数据库的列的一个排序。最后我们还看到,几行的代码让整个雇员表中的数据在html table中循环输出,是不是各位已经感觉到coldfusion的简单快捷了?以后的教程中还有更令人吃惊的功能,包括内置的全文检索引擎,Generator的Data Driven flash(image),cf component和web services等功能的讲解。
下一期的教程接着为大家讲解cf basic tag编程,包括操作数据库的cfinsert,、cfupdate;cfinclude和cflocation标签的使用,还要讲解如何编写coldfusion founction。好了,各位,咱们下一期见。
第二部分 论坛coldfusion探讨
如何得到开发者版本的ColdfusionMX
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=116459
ColdFusionMX第一个安全漏洞
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=121286
ColdFusionMX企业版标准文档
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=121621
Coldfusino MX 学习心得
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=120616
Cfmx 中文问题解决方法
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=120844
如何改变ColdFusionMX的端口
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=118258