第三期: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=1871e826d3945c355df09e5ef8190a6e&threadid=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=783cb977b6551d6a2dc52c87555e0208&threadid=116459
ColdFusionMX第一個安全性漏洞
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208&threadid=121286
ColdFusionMX企業版標準文檔
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208&threadid=121621
Coldfusino MX 學習心得
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208&threadid=120616
Cfmx 中文問題解決方案
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208&threadid=120844
如何改變ColdFusionMX的連接埠
http://www.flashempire.net/showthread.php?s=783cb977b6551d6a2dc52c87555e0208&threadid=118258