ColdFusionMX 編程指南 ColdFusionMX中的迴圈

來源:互聯網
上載者:User

第五期:ColdFusionMX中的迴圈

序言

任何一種程式再簡單也要具備一定的邏輯和演算法,Coldfusion也不例外。如果只是靠簡單的標籤的堆砌,是無法真正實現企業商業邏輯的。而且,我在這裡非常肯定的提出一點,就是簡單絕對不等於功能弱小。目前,網路技術發展到了一個注重表現的時代,就是每一個開發出來的網路應用,要在實現邏輯的同時,具備讓客戶有豐富的使用者體驗是另一個追求的目標。Flash+Flashremoting+cf serverside script就是一種極具體驗的開發手段。而對於開發工具,眾多的開發廠商更是在工具的易用性上做足了文章,微軟vs.net開發平台的完整統一性,Oracle9i JDeveloper開發j2ee程式的wizard方式,Macromedia DreamweaverMX眾多的伺服器端的指令碼語言的支援,都是在工具易用性上的一種體現。我們今天要給大家講解的就是簡單易用的coldfusion loop。通過cf中不同的迴圈嵌套,能夠實現很多在cf中編程的邏輯。

這裡的序言還要補充說明一點,操作access資料庫時的中文解決的方法,如果哪位開發人員有興趣,請去這裡查看並參與探討:

http://www.flashempire.net/showthread.php?s=a85407ff13de51915c82a57b7eb2e1ee&threadid=125029


第一部分 看看CF中的流程式控制制和迴圈

我們點擊DreamweaverMX中Insert面板裡的cf flow標籤,會看到如下的一行表徵圖:

這行表徵圖幾乎完成了coldfusion中最重要的流程和迴圈處理。談到流程,我們在學習任何一門語言的過程中第一個接觸到的就是if…then…else這個流程式控制制語句。想必很多從事網頁設計的朋友都不可避免的接觸過這個邏輯。這個邏輯是簡單的,但是是最常用到的。在中,用文字顯示“if else elsif”就是使用cf中的if流程式控制制。點擊標有文字“if”的時候,我們用原代碼的方式觀察頁面,就會看到在游標所在出已經插入了<cfif></cfif>這個程式碼片段。我們把所有在cf中用<cfxxx>…</cfxxx>都看作一個封閉的程式碼片段,不管它有多長,也不管它有多短。

使用cfif標籤,標準的簡單描述應該是這樣的:

<cfif 你要判斷的條件>

你要做的事情:可以是一行輸出,也可以是若干個其他的複雜的程式碼片段。

</cfif>

那麼我們經常使用一些判斷條件的操作符來決定cfif的流程的走向,因為在cfif的邏輯判斷中,只有真(1)和假(0)兩種,如果條件為真,就做cfif標籤中間嵌套的事務,如果為假,就跳出這個邏輯,去處理下一個邏輯。那麼cf中的操作符非常的人性話,它使用語言表達判斷,而不是符號。比如,“=”在cfif的條件操作符中要表達為“EQ”,“>”要表示為“GREATER THAN”或者“GT”。如果我們判斷a是否等於B,那麼在cf中要這樣寫:

<cfif A EQ B>

<cfset A=B>

</cfif>

使用詳細的條件操作符請看下錶:

Operator(解釋)

縮寫

Operator(解釋)

縮寫

IS(==)

EQUAL,EQ

GREAT THAN OR EQUAL TO(>=)

GTE,GE

IS NOT(<>)

NOT EQUAL,NEQ

LESS THAN OR EQUAL TO(<=)

LTE,LE

GREATER THAN(>)

GT

Contains(包括)

LESS THAN(<)

LT

Does Not Contain(不包括)

那麼另外的else和elsif是嵌套在完整的cfif中的,下面這段代碼是一個完整的說明:

<cfif 運算式1>

程式碼片段1

<cfelseif 運算式2>

程式碼片段2

<cfelse>

程式碼片段3

</cfif>

如果運算式一成立,則做程式碼片段1,如果運算式1不成立,則判斷運算式2是否成立,如果運算式2成立,則做程式碼片段2,否則做程式碼片段3。各位沒有開發基礎的朋友,可以試試這段小代碼,之後運行一下就明白結果了。

<cfif 1 is 0>

<cfoutput>1</cfoutput>

<cfelseif 2 is 0>

<cfoutput>2</cfoutput>

<cfelse>

<cfoutput>3</cfoutput>

</cfif>

開發程式我們在控制流程程的過程中,還用到了switch…case方法,在coldfusion的編程方式中同樣支援。而對於Switch…case方法,使用起來也是很簡單的,這裡進行一下簡單的講解。點擊 這三個表徵圖來完成cfswitch的操作,目的在於讓開發人員進行同一種運算式對於多種結果值的條件下進行流程的選擇。點擊了左邊的表徵圖之後,我們會看到下面的視窗:

文法操作如下:

<cfswitch expression= "#var#">

<cfcase value= "x1">

action1

</cfcase>

<cfcase value= "x2">

action2

</cfcase>

<cfdefaultcase>

default action

</cfdefaultcase>

</cfswitch>

文法解釋非常的簡單,對於運算式expression,用cfcase的value屬性來反映運算式中#var#的值,然後針對不同的值,來響應不同的action,做不同的操作,如果沒有值匹配,那麼做cfdefaultcase標籤中的預設action。來個macromedia官方標準的程式段看看:

<cfquery name = "GetEmployees" dataSource = "cfsnippets">

SELECT Emp_ID, FirstName, LastName, EMail, Phone, Department

FROM Employees

</cfquery>

<h3>cfswitch Example</h3>

<p>Each time the case is fulfilled, the specific information is printed;

if the case is not fulfilled, the default case is output </p>

<cfoutput query="GetEmployees">

<cfswitch expression="#Trim(Department)#">

<cfcase value="Sales">

#FirstName# #LastName# is in <b>sales</b><br><br>

</cfcase>

<cfcase value="Accounting">

#FirstName# #LastName# is in <b>accounting</b><br><br>

</cfcase> <cfcase value="Administration">

#FirstName# #LastName# is in <b>administration</b><br><br>

</cfcase>

<cfdefaultcase>

#FirstName# #LastName# is not in Sales, Accounting, or

Administration.<br><br>

</cfdefaultcase>

</cfswitch>

</cfoutput>

這段代碼就是通過了cfswitch來顯示cfmx預設資料來源cfsnippets中Employees表中的人員,而方式用department(所在的部門)變數在cfswitch中cfcase的不同value來區分顯示開來。

我們來看cf flow面板中的另外3個表徵圖集合: ,這3個表徵圖從左至右,依次是cftry、cfcatch、cfthrow。這3個tag在進行cf應用程式的編寫調試過程中,起到了重要的作用。這3個標籤實際上是進行了應用程式的錯誤和異常的處理。為什麼要有錯誤和異常的處理?作者本人認為有兩個大的方面的作用。第一,就是提醒開發人員應用程式出錯或異常,同時使系統在交付給客戶之後出現錯誤或異常後,能夠使用不同方式的處理給客戶一個可靠的感覺。第二,就是減少應用程式遭受攻擊的可能。如果我們不使用錯誤和異常處理,那麼我們經常可以看到,如果程式處理出錯,會在web瀏覽器裡暴露出不該出現的資訊,比如資料庫表名,欄位名,甚至對資料庫的操作等等。其實這些出錯資訊是不應該對外顯示在web瀏覽器裡的。

我們在編寫coldfusion應用程式的時候,應該注意一下可能出現的錯誤類型,從而能使用cfmx administrator裡的設定和cftry等tag結合來處理這些錯誤。我們經常遇到的錯誤分為五類:語法錯誤、資料庫操作錯誤、應用伺服器(application server)環境錯誤、邏輯錯誤和驗證錯誤。按照這些錯誤的重要性來排序,第一位的就是應用伺服器環境錯誤,這些錯誤由application server產生,它可能會導致整個coldfusion應用不能運行。所以排在最為重要的位置。其他的我們應該力圖減少文法和邏輯錯誤,因為這種錯誤可以通過不斷的debug來修正,而且這類錯誤的調試比較消耗精力。

我們先來看,這是我操作cfmx administrator->debugging settiongs的過程中的一個:

如果你選擇了Enable Robust Exception Information這個選項,在cfm頁面出現錯誤的時候,將通過瀏覽器可以看到application顯示的應用錯誤資訊,包括頁面模板實體路徑、頁面的URI,錯誤行數(不一定準確)、操作的資料庫語句、資料來源名稱、Java堆棧的trace方式等等。這樣其中一些資訊顯然是你在把項目提交給客戶後不希望顯示的,所以在production server上安裝完coldfusionMX之後,要把這個選項的勾選去掉。

通過簡單的介紹<cftry>和<cfcatch>之後,可能很多人都不會使用,那麼我們用一個最最簡單的資料庫的操作來說明錯誤處理的作用。回憶先前的程式,我們先寫下一段簡單的資料庫query程式段:

<CFQUERY NAME="demo" DATASOURCE="cfsnippets">

SELECT Emp_ID, LastName

FROM Employees

</CFQUERY>

如果我們把cfsnippets的名稱改成xxx,那麼我們看看會發生什麼情況?請看下面的:

上面的這張是cf server自動給出的錯誤資訊顯示頁面。這個頁面上,看看我們提供了哪些重要的資訊給來自外部的訪問人員?資料來源名稱,檔案的實體路徑,sql查詢的語句。這些資訊完全給那些帶有惡意的訪問者以可乘之機。那麼我們應該使用<cftry>和<cfcatch>來避免這些報錯資訊的顯示。修改以後的代碼如下:

<cftry>

<CFQUERY NAME="demo" DATASOURCE="xxx">

SELECT Emp_ID, LastName

FROM Employees

</CFQUERY>

<CFCatch Type="database">

對不起!我們不能串連到資料庫伺服器!非常抱歉!

<CFAbort>

</CFCatch>

</cftry>

之後我們看到的瀏覽器中的顯示資訊為:

“對不起!我們不能串連到資料庫伺服器!非常抱歉!”

這樣,很多非常重要的,涉及到安全性的資訊就被保護了起來,同樣也就降低了伺服器被惡意攻擊的可能性。
第二部分 在原有的基礎之上深入一下

很多開發人員在學習了五個部分的基本coldfusionMX的知識後,已經可以進行一些簡單的應用程式編寫了。那麼我們就在原有的基礎之上,深入一下。講解coldfusionMX的最新的CFComponent的基本知識。關於本教程的中的一些CFComponent的資料來源於macromedia官方。

在開始講解CFComponent(以下簡稱CFC)之前,先來一段簡單的概要,讓各位開發人員在整體上對CFC進行一下介紹。很多開發人員可能對asp都比較熟悉,asp可以和com,com+結合起來應用而com就是基於微軟的一種組件技術。說這種技術高深也好,易用也罷,從我這裡認為,組件開發技術就是提供給應用程式一組高可用性的代碼。什麼是可用性?在英文裡就是reuse。專業一點就是代碼重用。CFC也不例外,通過簡單的將許多不同功能的cfml程式碼片段進行一定邏輯的組合,並賦予不同的訪問方式,就構成了CFC。那麼CFC相比對於以前的CF的自訂標籤又有什麼優勢和不同?CFC最大的優點就是不包含表現性質的代碼,也就是說,一個CFC具有某種純粹的邏輯,然後通過不同的調用方式和附加性的修飾標籤來呈現給外部不同的結果,是完全符合web技術開發的需求,那就是表現與邏輯分離。而,custom tag則不是這樣,它是構造一個Function,可以把表現與邏輯混在一起,通過其他cfm頁面的操作來呈現結果。還有一個不同是CFC是一種對象,具有不同的訪問方式,也具有了method的入口操作方式,也具有了參數控制方式。如果上面這部分解釋理解比較吃力的話,那麼我們用一個經常開發的模組來說明問題。我們經常在開發互動性網站的時候,經常會開發使用者註冊和驗證模組,按照一般的開發方式,會有很多個頁面,比如login.cfm、checkuser.cfm等等一堆的頁面來進行使用者的登入(註冊)操作。我們的邏輯代碼會寫在所有的需要處理的後台檔案中。那麼會出現何種煩雜的現象?用<cfquery>組成不同的資料庫作業碼段來進行使用者名稱和密碼的尋找,返回尋找結果,進行form表單輸入值和資料庫結果的驗證,通過不同頁面上的不同的嵌入性的邏輯代碼來相應使用者的不同操作。這樣的開發方式不是不可以,但是我們建議cf開發人員採用一種更先進的開發方式CFC進行相應功能的開發。那麼開發相同功能模組的CFC是一種什麼樣子的開發思路呢?我們可以把需要的程式碼片段集合在一起,通過特有的構成CFC的Tag把這些程式碼片段變成特有的Components,另外,賦予它們不同的method。還是針對使用者註冊和登入驗證的功能模組,我們換成這種思路:

l 定義一個user object,把所有對於使用者的通用操作封裝在這個object裡

l 定義對於user object的操作方法,例如add(),delete(),update(),get()等等一些通用的操作方法,同樣也可以再增加一些,例如verifyPassword(),GetEmail()等等。

l 對於不同使用者傳遞不同的參數給特定的方法來實現相應功能。

好了,不用我說了,大家已經可以分辨出使用CFC的優點:可用性強,開發效率高,擴充性強。

那麼,我們用什麼來構造一個CFC呢?很複雜?令人頭疼?都不是,用基本的cfml文法知識,外加幾個特定的構造CFC的tag就可以實現了。那麼構造CFC的幾個tag如下:

l <CFComponent>定義一個CFC

l <CFFunction>定義一個CFC中的操作方法(method)

l <CFArgument>定義method接收的參數

l <CFReturn>返回一個值,或者從method返回。

我們現在構造一個非常簡單的cfc,看下面的代碼:

<!--- Browser id component --->
<CFCOMPONENT>
    <!--- Is the browser IE? --->
    <CFFUNCTION NAME="IsIE">
                               <!--- Init variable --->
                               <CFSET result="No">
                               <!--- Look for IE identifier --->
                               <CFIF FindNoCase("MSIE", CGI.HTTP_USER_AGENT)>
                                              <!--- Yep, got it --->
                                              <CFSET result="Yes">
                               </CFIF>
                               <!--- Return result --->
               <CFRETURN result>
               </CFFUNCTION>
</CFCOMPONENT>

檔案儲存體成為browser.cfc,我們大家可以看到,所有的cf代碼在<cfcomponent></cfcomponent>標籤之間。這個cfc有一個Function叫做IsIE,目的是判斷瀏覽器的類型。預設的結果是No,那麼如果檢測出有MSIE這個串(不分大小寫),結果為true。這個Function返回的值就是result。很簡單是不是?

在構造好browser.cfc這個Component之後,如何應用這個browser.cfc呢?在存放browser.cfc的目錄下再產生一個test.cfm檔案,這個檔案中的代碼使用下面的編寫方式:

<!--- Invoke browser CFC --->
<CFINVOKE COMPONENT="browser"
METHOD="IsIE"
RETURNVARIABLE="result_ie">

<!--- Feedback --->
<CFOUTPUT>
Your browser is:<BR>
IE: #YesNoFormat(result_ie)#<BR>
</CFOUTPUT>

之後執行test.cfm這個檔案,得到的結果是:

Your browser is:
IE: Yes

Test.cfm這個檔案使用了<cfInvoke>這個標籤調用了browser這個cfc,並且調用了IsIE這個方法,返回的值是使用result_ie。上面的cfc只是一個判斷ie瀏覽器的程式,下面來個全的:

<CFCOMPONENT>

<!--- Is the browser IE? --->

<CFFUNCTION NAME="IsIE"

RETURNTYPE="boolean"

HINT="Is browser Microsoft IE">

<!--- If no browser id passed, used current --->

<CFARGUMENT NAME="browser"

REQUIRED="no"

DEFAULT="#CGI.HTTP_USER_AGENT#"

HINT="Browser ID, defaults to CGI ID">

<!--- Init variable --->

<CFSET result="No">

<!--- Look for IE identifier --->

<CFIF FindNoCase("MSIE", browser)>

<!--- Yep, got it --->

<CFSET result="Yes">

</CFIF>

<!--- Return result --->

<CFRETURN result>

</CFFUNCTION>

<!--- Is the browser Netscape? --->

<CFFUNCTION NAME="IsNetscape"

RETURNTYPE="boolean"

HINT="Is browser Netscape">

<!--- If no browser id passed, used current --->

<CFARGUMENT NAME="browser"

REQUIRED="no"

DEFAULT="#CGI.HTTP_USER_AGENT#"

HINT="Browser ID, defaults to CGI ID">

<!--- Init variable --->

<CFSET result="No">

<!--- Look for Netscape identifier and no IE identifier --->

<CFIF FindNoCase("mozilla", browser) AND NOT FindNoCase("MSIE", browser)>

<!--- Yep, got it --->

<CFSET result="Yes">

</CFIF>

<!--- Return result --->

<CFRETURN result>

</CFFUNCTION>

<!--- Is the browser Dreamweaver? --->

<CFFUNCTION NAME="IsDreamweaver"

RETURNTYPE="boolean"

HINT="Is browser Dreamweaver">

<!--- If no browser id passed, used current --->

<CFARGUMENT NAME="browser"

REQUIRED="no"

DEFAULT="#CGI.HTTP_USER_AGENT#"

HINT="Browser ID, defaults to CGI ID">

<!--- Init variable --->

<CFSET result="No">

<!--- Look for DW identifier --->

<CFIF FindNoCase("mmhttp", browser)>

<!--- Yep, got it --->

<CFSET result="Yes">

</CFIF>

<!--- Return result --->

<CFRETURN result>

</CFFUNCTION>

<!--- Identify a browser

Returns: IE - Internet Explorer

NS ?Netscape

DW ?Dreamweaver

Empty string is unknown

--->

<CFFUNCTION NAME="Identify"

RETURNTYPE="string"

HINT="Identify a browser">

<!--- If no browser id passed, used current --->

<CFARGUMENT NAME="browser"

REQUIRED="no"

DEFAULT="#CGI.HTTP_USER_AGENT#"

HINT="Browser ID, defaults to CGI ID">

<!--- Init variable --->

<CFSET result="">

<CFIF IsIE(browser)>

<CFSET result="IE">

<CFELSEIF IsNetscape(browser)>

<CFSET result="NS">

<CFELSEIF IsDreamweaver(browser)>

<CFSET result="DW">

</CFIF>

<!--- Return result --->

<CFRETURN result>

</CFFUNCTION>

</CFCOMPONENT>

上面的第2個CFC複雜了一些,我們覆蓋儲存成為browser.cfc,這個cfc中包含了4個Function(method):

IsIE,測試瀏覽器是否為MS的瀏覽器;IsNescape測試是否是Nescape(mozilla)瀏覽器;IsDreamweaver測試是否內嵌Dreamweaver;Identify返回所有的結果,如果以上3種都不是,返回空串。程式還為CFFunction添加了兩個新的屬性:ReturnType是對傳回值的一個類型確認(validate),如果不是ReturnType所描述的類型,將會顯示一個錯誤。另外,我們的Function中還添加了<CFArgument>這個標籤,來設定BrowserID這個值,而且設定Required屬性為no是保證有檢測不出來的browserid的時候,提供一個預設的CGI ID。如果required的屬性設定為yes,那麼特定的參數傳遞如果不符合要求,就會報錯。我們可以通過下面的這個test.cfm程式來調用上面的這段複雜的browser.cfc:

<!--- Check for IE --->

<CFINVOKE COMPONENT="browser"

METHOD="IsIE"

RETURNVARIABLE="result_ie">

<!--- Check for Netscape --->

<CFINVOKE COMPONENT="browser"

METHOD="IsNetscape"

RETURNVARIABLE="result_ns">

<!--- Check for DW --->

<CFINVOKE COMPONENT="browser"

METHOD="IsDreamweaver"

RETURNVARIABLE="result_dw">

<!--- Identify browser --->

<CFINVOKE COMPONENT="browser"

METHOD="Identify"

RETURNVARIABLE="result_id">

<!--- Feedback --->

<CFOUTPUT>

Your browser is:<BR>

IE: #YesNoFormat(result_ie)#<BR>

NS: #YesNoFormat(result_ns)#<BR>

DW: #YesNoFormat(result_dw)#<BR>

ID: #result_id#<BR>

</CFOUTPUT>

顯示的結果為:

Your browser is:
IE: Yes
NS: No
DW: No
ID: IE

其實我們可以用兩種方式從內部觀察一個cfc,第一種就是通過直接的url訪問。上面第2個最終的browser.cfc在我原生url為:

http://localhost:8500/cfdev/browser.cfc

輸入這個url後,會先看到cf administrator的介面,輸入登入的密碼後,系統會報告一個browser.cfc的詳細資料給開發人員,如下:

詳細的介紹了這個cfc的結構和詳細資料,想要看到這個前提是必須有cf server administrator的密碼許可權哦!

第二種方法就是通過dwmx來import這個cfc,從而可以看到dwmx會自動的識別出這個CFC了:

然後我們從組件這個面板裡直接把所需要調用的cfc method直接drap & drop到右邊的編程地區裡去,就可以了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.