第三期:ColdFusionMX編程入門
序言
上一期我們講解了ColdFusionMX的基本管理操作,并且熟悉了ColdFusionMX的管理界面布局,而且上一期最后我們演示了兩個(gè)非常短小的coldfusion程序,這一期會(huì)詳細(xì)講解coldfusion的入門編程,其中包括在asp中對(duì)于初學(xué)者而言非常令人頭疼的數(shù)據(jù)庫操作。
在每次開始進(jìn)入正題之前,每一期的序言內(nèi)容都會(huì)為大家介紹一些關(guān)于ColdFusion發(fā)展或者其他一些具有價(jià)值的小知識(shí),第一期為大家介紹了Macromedia MX產(chǎn)品的策略和coldfusionMX在該產(chǎn)品策略中的位置,而第二期則為大家介紹了ColdfusionMX的版本差異,那么這一期的序言讓我們了解一些什么呢?關(guān)于ColdFusion的發(fā)展。
1995年是個(gè)值得紀(jì)念的年代,因?yàn)榘l(fā)生在那個(gè)年月的事情已經(jīng)是上個(gè)世紀(jì)的事情了,而且不單單是這么多。如果老資歷的開發(fā)人員回憶一下的話,那個(gè)時(shí)候的web是html和cgi稱雄的天下,靜態(tài)頁面是html,而動(dòng)態(tài)程序則90%以上是cgi,在我印象中便是如此。美國的一對(duì)兄弟allire,在為自己的客戶解決數(shù)據(jù)庫訪問的問題時(shí),感覺到了cgi程序在編寫和維護(hù)上的難度是不能容忍的困難。于是,具有計(jì)算機(jī)天賦的Jeremy Allire便在1995年編寫了一種快速響應(yīng)且易于編寫的動(dòng)態(tài)腳本語言,叫做coldfusion,一經(jīng)推出,便震撼整個(gè)網(wǎng)絡(luò)行業(yè)。之后,兄弟倆看到了coldfusion的發(fā)展前途,便成立了Allire公司(后來被macromedia收購)。之后的幾年,全球500強(qiáng)中的一半都采用了coldfusion來解決公司不同情況的問題。通過不斷的版本修改和開發(fā)者的不斷壯大,Coldfusion后來發(fā)展成為業(yè)界知名的企業(yè)級(jí)解決方案的開發(fā)首選?,F(xiàn)在,為了產(chǎn)品線的統(tǒng)一,為了工業(yè)標(biāo)準(zhǔn)的統(tǒng)一,為了完全兼容Java平臺(tái),Macromedia發(fā)布了ColdfusionMX。而眾位以前經(jīng)常看到的Neo這個(gè)詞則是macromedia對(duì)于使用新一代coldfusion開發(fā)行業(yè)解決方案的編碼名稱。
如果大家看到neo這個(gè)詞,就不難理解Macromedia對(duì)于coldfusionMX的殷切期望,大名鼎鼎的電影《黑客帝國》中的男主人公的名字也叫做Neo。以上的相似之處只是作者本人的推測而已了。好,不多聊了,進(jìn)入我們這一期的正題。
第一部分 ColdFusionMX Basic tag編程
作者本人看過很多關(guān)于中英文的教材,認(rèn)為最有效的一種方式就是參照實(shí)例的代碼段來配合講解的過程最為優(yōu)秀。所以,對(duì)于每一個(gè)coldfuiosn的tag,作者不打算一一贅述,各位朋友可以通過查看一些reference來了解所有的tag功能和語法。關(guān)于標(biāo)準(zhǔn)的文檔,請?jiān)诎惭bcoldfusionmx之后參考administrator管理界面里包含的官方文檔。
那么作者采用一種什么樣的方式來幫助想學(xué)習(xí)ColdFusionMX的朋友快速的進(jìn)入動(dòng)手編寫代碼的境界呢?如果是采用把所有的Tag全部都按照順序講解,那么會(huì)造成學(xué)習(xí)者興趣不同程度的下降。各位可能在前面的教程中知道了Macromedia MX中DreamweaverMX和ColdFusionMX之間的關(guān)系。DreamweaverMX的推出就是為開發(fā)ColdFusionMX的應(yīng)用提供一個(gè)完善的工具,因?yàn)樗闪艘郧癈oldFusion Studio、UltraDev、Dreamweaver、HomeSite四款產(chǎn)品的主要功能于一身,所以,只用DreamweaverMX來制作靜態(tài)頁面,可以說只用到了不到三分之一的功能。那么,本系列的教程就從DreamweaverMX中集成的開發(fā)ColdfusionMX程序功能入手,讓大家先了解如何在DreamweaverMX中開發(fā)ColdFusionMX程序,然后再提供給大家使用ColdFusionMX開發(fā)高級(jí)應(yīng)用的技巧。
打開DreamweaverMX的界面可以看到處于右上方快捷Object面板,而其中會(huì)有如下三個(gè)Object面板是CFML Basic、CFML FLOW、CFML Advanced,而本教程的講解就從CFML Basic開始。
CFML Basic被選中后會(huì)出現(xiàn)如下的圖標(biāo)排列:
那么從左到右的圖標(biāo)依次表示CfServerVariables、CFQuery、CFOutput、CFInsert、CFUpdate、CFInclude、CFLocation、CFSet、CFParam、注釋、變量符號(hào)、CFScript。我們的教程也從CFSet開始。因?yàn)樗荂oldFusionMX中最簡單也是最重要的一個(gè)Tag。
單擊
圖標(biāo),會(huì)出現(xiàn)如下代碼段:cfset >,這個(gè)cfset的標(biāo)簽就是Coldfusion中設(shè)置變量的特有標(biāo)簽。在ColdFusion中,每個(gè)特有的由CFMX Server來負(fù)責(zé)解釋的Tag都用cf開頭,如cfset、cfquery等。而cfset的標(biāo)準(zhǔn)語法格式是:
等號(hào)左邊表示變量名稱,等號(hào)右邊是變量值。很簡單,如果你要?jiǎng)?chuàng)建一個(gè)叫做var1的變量,賦值為hello,friend!,那么你需要這樣寫出你的程序代碼:
cfset var1="Hello,friend!">
那么你要設(shè)置中文,就這樣寫好了:
cfset var1="你好,朋友!">
那么,當(dāng)你為你的變量設(shè)置一個(gè)數(shù)值時(shí),就不需要在變量值的兩側(cè)加上雙引號(hào)了。比如:
cfset PI=3.1415926>。另外,cfset這個(gè)tag的作用還可以進(jìn)行數(shù)值的運(yùn)算和變量的動(dòng)態(tài)轉(zhuǎn)移。進(jìn)行數(shù)值計(jì)算和變量跳轉(zhuǎn)的編碼方式也非常的簡單,請看下面的代碼片斷:
cfset PI=3.1415926>
cfset number_1=PI*10>
cfset number_2=number_1>
我想有一點(diǎn)點(diǎn)程序經(jīng)驗(yàn)的朋友對(duì)上面代碼的理解都應(yīng)該不成問題,它執(zhí)行了一個(gè)PI值的賦值,以及對(duì)PI變量的乘法,結(jié)果賦值給number_1,最后,number_1變量的結(jié)果指向變量number_2。
另外,Cfset還有另外一種用法,讓我們來看看:
cfset var1="Test">
cfset "#var1#"="hello!">
cfoutput>#test#/cfoutput>
結(jié)果輸出是什么?答案是:hello!這個(gè)字符串。原因很簡單,hello!這個(gè)字符串付給了一個(gè)叫做"#var1#"的變量,這個(gè)變量等價(jià)于test,也就是test這個(gè)字符串自動(dòng)變?yōu)橐粋€(gè)變量名稱。
單擊
圖標(biāo),嘆號(hào)表示的tag是cfparam,這個(gè)tag的基本功能和cfset是一致的,也是為變量賦值,那么它與cfset有什么區(qū)別呢?區(qū)別就是檢查一個(gè)變量是否存在,若存在,則給予一個(gè)默認(rèn)值??纯袋c(diǎn)擊它以后出現(xiàn)的屬性設(shè)置窗口:
在上圖中可以看到cfparam具有三個(gè)屬性,那就是name、Default、Type,name表示變量的名稱,Default表示變量的初始值,默認(rèn)為空,Type表示變量的類型,CFMX為cfparam設(shè)置了如下類型:
變量類型已經(jīng)涵蓋了我們用ColdFusion進(jìn)行編碼是可能用到的變量類型。Cfparam這個(gè)Tag的信息可以點(diǎn)擊屬性設(shè)置窗口中的tag info來了解詳細(xì)的使用方法,以后其他的tag也可以在屬性窗口中通過點(diǎn)擊tag info來了解。那么,設(shè)置完cfparam之后,出現(xiàn)的代碼行如下:
cfparam name="URL.id" default="1" type="any">
這行代碼等價(jià)于:
cfif not definede(URL.id)>
cfset URL.id=1>
/cfif>
判斷URL.id這個(gè)變量是否存在,如果不存在,那么給一個(gè)值1。這個(gè)功能經(jīng)常在開發(fā)注冊和驗(yàn)證的模塊中配合cfform這個(gè)tag使用,后面的教程就會(huì)看到。
單擊
圖標(biāo),就是在你的cfm頁面里面加入coldfusion特有的注釋符號(hào):!--- content --->,例如:
!---
設(shè)置一個(gè)變量名字叫做var_hello
--->
上面這段代碼就在.cfm被cf服務(wù)器解釋的過程中被忽略,良好的注釋習(xí)慣是開發(fā)大規(guī)模復(fù)雜應(yīng)用的必要,而且也是一個(gè)優(yōu)秀的開發(fā)者應(yīng)該具備的素質(zhì)。
單擊
圖標(biāo),會(huì)出現(xiàn)以后大家經(jīng)常在.cfm文件中遇到的##標(biāo)記,那么它用來顯示coldfusion中的變量結(jié)果,就像前面用到的程序:
cfset var1="Test">
cfoutput>#var1#/cfoutput>
就是將var1變量的值顯示出來。
單擊
圖標(biāo),則會(huì)在頁面中添加特有的coldfusion Server variable。DreamweaverMX中彈出的界面是:
而CFMX支持的Server variable有以下種類:
下面就把Server variables中經(jīng)常用到的變量做簡要介紹。Server variables在coldfusion中被成為CGI variables。它使用了Server端的通用網(wǎng)關(guān)接口變量。而CGI是很普遍的一種腳本方式,ColdfusionMX也支持CGI-Bin特有的一些變量格式。
HTTP_REFERER:判斷瀏覽者來自哪個(gè)URL
HTTP_USER_AGENT:判斷使用的瀏覽器類型,目前流行的幾款瀏覽器都可以識(shí)別。
QUERY_STRING:就是.cfm?后面參數(shù)附帶的信息。
REMOTE_ADDR:瀏覽者的IP地址
其他的變量各位可以通過查看官方提供的Reference來了解,這里就不再贅述。
讓我們來看這段代碼:
cfoutput>
你好!
您的瀏覽器是#CGI.HTTP_USER_AGENT#!
/cfoutput>
結(jié)果顯示是作者本人的瀏覽器版本:
您的瀏覽器是Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)!
單擊
圖標(biāo),則是使用coldfusion中最為常用的tag:cfquery。這個(gè)標(biāo)簽用來完成數(shù)據(jù)庫查詢。
在開始說明數(shù)據(jù)庫查詢之前,作者本人對(duì)廣大開發(fā)者提一個(gè)醒,希望各位用coldfusionmx作開發(fā)的時(shí)候,盡量避免使用access和mysql,因?yàn)檫@兩款數(shù)據(jù)庫與coldfusionmx進(jìn)行信息交互會(huì)出現(xiàn)或多或少的中文問題,希望各位使用SQL Server數(shù)據(jù)庫或者oracle。當(dāng)然使用access或者mysql進(jìn)行英文處理當(dāng)然沒有問題。早期的coldfusion5在處理數(shù)據(jù)庫上,access等小型數(shù)據(jù)庫不存在中文問題,可能由于coldfusion核心代碼被重新編寫,jdbc對(duì)應(yīng)的中文問題就出來了,但是相信macromedia不久就會(huì)修正這個(gè)問題。作者本人在使用cfquery的時(shí)候,出于講解方便,會(huì)使用access數(shù)據(jù)庫,但是后續(xù)的用到中文更改數(shù)據(jù)庫記錄的操作都會(huì)轉(zhuǎn)向SqlServer,請大家注意。
如何解決中文問題,請各位參考這里的信息:
http://www.flashempire.net/showthread.php?s=1871e826d3945c355df09e5ef8190a6ethreadid=120844
點(diǎn)擊cfquery標(biāo)簽之后dwmx出現(xiàn)的界面是這樣的:
上圖就是關(guān)于設(shè)置cfquery的窗口,圖形左邊的紅色矩形內(nèi)的三個(gè)部分可以對(duì)cfquery進(jìn)行不同細(xì)節(jié)程度的設(shè)置,general是我們最長用到的設(shè)置,connection則是連接設(shè)置,一般connection的部分屬性直接就可以通過cfmx administrator中的datasource設(shè)定來確定了。Persistent Queries表示設(shè)定一個(gè)持續(xù)的可以從緩存里調(diào)用的查詢。下面是cfquery的標(biāo)準(zhǔn)語法:
其中,name屬性是必須要有的,就是給你定義的cfquery一個(gè)名字,以后其他地方要調(diào)用的時(shí)候就會(huì)用到這個(gè)name屬性值找到相對(duì)的query。Datasource則是該查詢來自的數(shù)據(jù)源的名稱,而數(shù)據(jù)源的名稱則是通過設(shè)定cfmx administrator的。這里有必要插入一段關(guān)于設(shè)置數(shù)據(jù)源的方法。打開cfmx administrator管理界面,點(diǎn)擊Data Services里的data Sources,然后看到管理界面的右側(cè)區(qū)域出現(xiàn)cfmx administrator已經(jīng)定義好了的數(shù)據(jù)源,截圖如下:
上圖表示1的部分?jǐn)?shù)據(jù)庫driver用的是microsoft access,而被2框選的部分則是兩個(gè)透過windows odbc設(shè)置的數(shù)據(jù)源名稱,數(shù)據(jù)驅(qū)動(dòng)用的是windows的odbc socket。而被3框選中的區(qū)域則是使用Microsoft SQL Server驅(qū)動(dòng)定義的數(shù)據(jù)源。設(shè)置access數(shù)據(jù)庫是一件非常容易的事情,首先你的access數(shù)據(jù)庫可以放在你本地硬盤的任何一個(gè)位置,并不是非要放在webserver的某個(gè)目錄之下,然后,從上圖中,可以從add new data source中填寫一個(gè)你想要的數(shù)據(jù)源名稱,名稱只要是標(biāo)準(zhǔn)的字符串就可以了,不能用數(shù)字開頭。然后,從Driver的下拉選項(xiàng)中,選擇Microsoft access這個(gè)驅(qū)動(dòng),然后點(diǎn)擊add,就進(jìn)入了詳細(xì)設(shè)置頁面:
基本上,設(shè)置access數(shù)據(jù)庫不需要設(shè)置什么高級(jí)選項(xiàng),但是如果有需要,比如限制對(duì)數(shù)據(jù)庫的操作等等,可以點(diǎn)擊show advanced settings來修改。上圖中的cfsnippets就是安裝完coldfusionmx后的默認(rèn)案例數(shù)據(jù)庫,就像裝完access這個(gè)軟件后,自動(dòng)就有northwind這個(gè)庫一樣。下面的cfquery例子我們就以cfsnippets為主。而sql server只是多加了幾步的設(shè)置,首先,在設(shè)置sqlserver的數(shù)據(jù)源時(shí)要填入sql server的database name,其次,要輸入sql server所在的ip,本機(jī)就用localhost就可以,最重要的是,必須輸入一個(gè)能夠有訪問該數(shù)據(jù)庫的權(quán)限的用戶名和密碼,作者這里推薦在sql server里設(shè)置好特定的用戶名和密碼,而不是使用默認(rèn)的sa帳號(hào)。
回到cfquery屬性說明,其他的屬性則不是必須具備的屬性。關(guān)于屬性的說明可以參考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>
結(jié)果是什么?看看下面的截圖:
令人驚奇的是可以循環(huán)輸出?。?!數(shù)數(shù)cf代碼,只有幾行,而asp,jsp,php要完成同樣的效果,需要寫幾行代碼呢?想必用過的人都知道。
再來看一個(gè)復(fù)雜點(diǎn)的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>
那么結(jié)果如下截圖:
我們首先是select出一段關(guān)于perterson這個(gè)雇員的相關(guān)信息,然后再列出所有雇員的信息。其次是用queryname.recordcount查看符合的記錄數(shù),用queryname.currentrow查看當(dāng)前的記錄是在數(shù)據(jù)庫中的第幾條,用queryname.columnlist表示數(shù)據(jù)庫的列的一個(gè)排序。最后我們還看到,幾行的代碼讓整個(gè)雇員表中的數(shù)據(jù)在html table中循環(huán)輸出,是不是各位已經(jīng)感覺到coldfusion的簡單快捷了?以后的教程中還有更令人吃驚的功能,包括內(nèi)置的全文檢索引擎,Generator的Data Driven flash(image),cf component和web services等功能的講解。
下一期的教程接著為大家講解cf basic tag編程,包括操作數(shù)據(jù)庫的cfinsert,、cfupdate;cfinclude和cflocation標(biāo)簽的使用,還要講解如何編寫coldfusion founction。好了,各位,咱們下一期見。
第二部分 論壇coldfusion探討
如何得到開發(fā)者版本的ColdfusionMX
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=116459
ColdFusionMX第一個(gè)安全漏洞
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=121286
ColdFusionMX企業(yè)版標(biāo)準(zhǔn)文檔
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208threadid=121621
Coldfusino MX 學(xué)習(xí)心得
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