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。各位沒有開發(fā)基礎(chǔ)的朋友,可以試試這段小代碼,之后運行一下就明白結(jié)果了。
cfif 1 is 0>
cfoutput>1/cfoutput>
cfelseif 2 is 0>
cfoutput>2/cfoutput>
cfelse>
cfoutput>3/cfoutput>
/cfif>
開發(fā)程序我們在控制流程的過程中,還用到了switch…case方法,在coldfusion的編程方式中同樣支持。而對于Switch…case方法,使用起來也是很簡單的,這里進行一下簡單的講解。點擊 這三個圖標(biāo)來完成cfswitch的操作,目的在于讓開發(fā)者進行同一種表達式對于多種結(jié)果值的條件下進行流程的選擇。點擊了左邊的圖標(biāo)之后,我們會看到下面的窗口:
語法操作如下:
cfswitch expression= "#var#">
cfcase value= "x1">
action1
/cfcase>
cfcase value= "x2">
action2
/cfcase>
…
cfdefaultcase>
default action
/cfdefaultcase>
/cfswitch>
語法解釋非常的簡單,對于表達式expression,用cfcase的value屬性來反映表達式中#var#的值,然后針對不同的值,來響應(yīng)不同的action,做不同的操作,如果沒有值匹配,那么做cfdefaultcase標(biāo)簽中的默認(rèn)action。來個macromedia官方標(biāo)準(zhǔn)的程序段看看:
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默認(rèn)數(shù)據(jù)源cfsnippets中Employees表中的人員,而方式用department(所在的部門)變量在cfswitch中cfcase的不同value來區(qū)分顯示開來。
我們來看cf flow面板中的另外3個圖標(biāo)集合: ,這3個圖標(biāo)從左到右,依次是cftry、cfcatch、cfthrow。這3個tag在進行cf應(yīng)用程序的編寫調(diào)試過程中,起到了重要的作用。這3個標(biāo)簽實際上是進行了應(yīng)用程序的錯誤和異常的處理。為什么要有錯誤和異常的處理?作者本人認(rèn)為有兩個大的方面的作用。第一,就是提醒開發(fā)人員應(yīng)用程序出錯或異常,同時使系統(tǒng)在交付給客戶之后出現(xiàn)錯誤或異常后,能夠使用不同方式的處理給客戶一個可靠的感覺。第二,就是減少應(yīng)用程序遭受攻擊的可能。如果我們不使用錯誤和異常處理,那么我們經(jīng)常可以看到,如果程序處理出錯,會在web瀏覽器里暴露出不該出現(xiàn)的信息,比如數(shù)據(jù)庫表名,字段名,甚至對數(shù)據(jù)庫的操作等等。其實這些出錯信息是不應(yīng)該對外顯示在web瀏覽器里的。
我們在編寫coldfusion應(yīng)用程序的時候,應(yīng)該注意一下可能出現(xiàn)的錯誤類型,從而能使用cfmx administrator里的設(shè)定和cftry等tag結(jié)合來處理這些錯誤。我們經(jīng)常遇到的錯誤分為五類:語法錯誤、數(shù)據(jù)庫操作錯誤、應(yīng)用服務(wù)器(application server)環(huán)境錯誤、邏輯錯誤和驗證錯誤。按照這些錯誤的重要性來排序,第一位的就是應(yīng)用服務(wù)器環(huán)境錯誤,這些錯誤由application server產(chǎn)生,它可能會導(dǎo)致整個coldfusion應(yīng)用不能運行。所以排在最為重要的位置。其他的我們應(yīng)該力圖減少語法和邏輯錯誤,因為這種錯誤可以通過不斷的debug來修正,而且這類錯誤的調(diào)試比較消耗精力。
我們先來看下圖,這是我操作cfmx administrator->debugging settiongs的過程中的一個截圖:
如果你選擇了Enable Robust Exception Information這個選項,在cfm頁面出現(xiàn)錯誤的時候,將通過瀏覽器可以看到application顯示的應(yīng)用錯誤信息,包括頁面模板物理路徑、頁面的URI,錯誤行數(shù)(不一定準(zhǔn)確)、操作的數(shù)據(jù)庫語句、數(shù)據(jù)源名稱、Java堆棧的trace方式等等。這樣其中一些信息顯然是你在把項目提交給客戶后不希望顯示的,所以在production server上安裝完coldfusionMX之后,要把這個選項的勾選去掉。
通過簡單的介紹cftry>和cfcatch>之后,可能很多人都不會使用,那么我們用一個最最簡單的數(shù)據(jù)庫的操作來說明錯誤處理的作用。回憶先前的程序,我們先寫下一段簡單的數(shù)據(jù)庫query程序段:
CFQUERY NAME="demo" DATASOURCE="cfsnippets">
SELECT Emp_ID, LastName
FROM Employees
/CFQUERY>
如果我們把cfsnippets的名稱改成xxx,那么我們看看會發(fā)生什么情況?請看下面的截圖:
上面的這張截圖是cf server自動給出的錯誤信息顯示頁面。這個頁面上,看看我們提供了哪些重要的信息給來自外部的訪問人員?數(shù)據(jù)源名稱,文件的物理路徑,sql查詢的語句。這些信息完全給那些帶有惡意的訪問者以可乘之機。那么我們應(yīng)該使用cftry>和cfcatch>來避免這些報錯信息的顯示。修改以后的代碼如下:
cftry>
CFQUERY NAME="demo" DATASOURCE="xxx">
SELECT Emp_ID, LastName
FROM Employees
/CFQUERY>
CFCatch Type="database">
對不起!我們不能連接到數(shù)據(jù)庫服務(wù)器!非常抱歉!
CFAbort>
/CFCatch>
/cftry>
之后我們看到的瀏覽器中的顯示信息為:
“對不起!我們不能連接到數(shù)據(jù)庫服務(wù)器!非常抱歉!”
這樣,很多非常重要的,涉及到安全性的信息就被保護了起來,同樣也就降低了服務(wù)器被惡意攻擊的可能性。
第二部分 在原有的基礎(chǔ)之上深入一下
很多開發(fā)人員在學(xué)習(xí)了五個部分的基本coldfusionMX的知識后,已經(jīng)可以進行一些簡單的應(yīng)用程序編寫了。那么我們就在原有的基礎(chǔ)之上,深入一下。講解coldfusionMX的最新的CFComponent的基本知識。關(guān)于本教程的中的一些CFComponent的資料來源于macromedia官方。
在開始講解CFComponent(以下簡稱CFC)之前,先來一段簡單的概要,讓各位開發(fā)人員在整體上對CFC進行一下介紹。很多開發(fā)人員可能對asp都比較熟悉,asp可以和com,com+結(jié)合起來應(yīng)用而com就是基于微軟的一種組件技術(shù)。說這種技術(shù)高深也好,易用也罷,從我這里認(rèn)為,組件開發(fā)技術(shù)就是提供給應(yīng)用程序一組高可用性的代碼。什么是可用性?在英文里就是reuse。專業(yè)一點就是代碼重用。CFC也不例外,通過簡單的將許多不同功能的cfml代碼段進行一定邏輯的組合,并賦予不同的訪問方式,就構(gòu)成了CFC。那么CFC相比對于以前的CF的自定義標(biāo)簽又有什么優(yōu)勢和不同?CFC最大的優(yōu)點就是不包含表現(xiàn)性質(zhì)的代碼,也就是說,一個CFC具有某種純粹的邏輯,然后通過不同的調(diào)用方式和附加性的修飾標(biāo)簽來呈現(xiàn)給外部不同的結(jié)果,是完全符合web技術(shù)開發(fā)的需求,那就是表現(xiàn)與邏輯分離。而,custom tag則不是這樣,它是構(gòu)造一個Function,可以把表現(xiàn)與邏輯混在一起,通過其他cfm頁面的操作來呈現(xiàn)結(jié)果。還有一個不同是CFC是一種對象,具有不同的訪問方式,也具有了method的入口操作方式,也具有了參數(shù)控制方式。如果上面這部分解釋理解比較吃力的話,那么我們用一個經(jīng)常開發(fā)的模塊來說明問題。我們經(jīng)常在開發(fā)互動性網(wǎng)站的時候,經(jīng)常會開發(fā)用戶注冊和驗證模塊,按照一般的開發(fā)方式,會有很多個頁面,比如login.cfm、checkuser.cfm等等一堆的頁面來進行用戶的登錄(注冊)操作。我們的邏輯代碼會寫在所有的需要處理的后臺文件中。那么會出現(xiàn)何種煩雜的現(xiàn)象?用cfquery>組成不同的數(shù)據(jù)庫操作代碼段來進行用戶名和密碼的查找,返回查找結(jié)果,進行form表單輸入值和數(shù)據(jù)庫結(jié)果的驗證,通過不同頁面上的不同的嵌入性的邏輯代碼來相應(yīng)用戶的不同操作。這樣的開發(fā)方式不是不可以,但是我們建議cf開發(fā)人員采用一種更先進的開發(fā)方式CFC進行相應(yīng)功能的開發(fā)。那么開發(fā)相同功能模塊的CFC是一種什么樣子的開發(fā)思路呢?我們可以把需要的代碼段集合在一起,通過特有的構(gòu)成CFC的Tag把這些代碼段變成特有的Components,另外,賦予它們不同的method。還是針對用戶注冊和登錄驗證的功能模塊,我們換成這種思路:
l 定義一個user object,把所有對于用戶的通用操作封裝在這個object里
l 定義對于user object的操作方法,例如add(),delete(),update(),get()等等一些通用的操作方法,同樣也可以再增加一些,例如verifyPassword(),GetEmail()等等。
l 對于不同用戶傳遞不同的參數(shù)給特定的方法來實現(xiàn)相應(yīng)功能。
好了,不用我說了,大家已經(jīng)可以分辨出使用CFC的優(yōu)點:可用性強,開發(fā)效率高,擴展性強。
那么,我們用什么來構(gòu)造一個CFC呢?很復(fù)雜?令人頭疼?都不是,用基本的cfml語法知識,外加幾個特定的構(gòu)造CFC的tag就可以實現(xiàn)了。那么構(gòu)造CFC的幾個tag如下:
l CFComponent>定義一個CFC
l CFFunction>定義一個CFC中的操作方法(method)
l CFArgument>定義method接收的參數(shù)
l CFReturn>返回一個值,或者從method返回。
我們現(xiàn)在構(gòu)造一個非常簡單的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>標(biāo)簽之間。這個cfc有一個Function叫做IsIE,目的是判斷瀏覽器的類型。默認(rèn)的結(jié)果是No,那么如果檢測出有MSIE這個串(不分大小寫),結(jié)果為true。這個Function返回的值就是result。很簡單是不是?
在構(gòu)造好browser.cfc這個Component之后,如何應(yīng)用這個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>
之后執(zhí)行test.cfm這個文件,得到的結(jié)果是:
Your browser is:
IE: Yes
Test.cfm這個文件使用了cfInvoke>這個標(biāo)簽調(diào)用了browser這個cfc,并且調(diào)用了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復(fù)雜了一些,我們覆蓋存儲成為browser.cfc,這個cfc中包含了4個Function(method):
IsIE,測試瀏覽器是否為MS的瀏覽器;IsNescape測試是否是Nescape(mozilla)瀏覽器;IsDreamweaver測試是否內(nèi)嵌Dreamweaver;Identify返回所有的結(jié)果,如果以上3種都不是,返回空串。程序還為CFFunction添加了兩個新的屬性:ReturnType是對返回值的一個類型確認(rèn)(validate),如果不是ReturnType所描述的類型,將會顯示一個錯誤。另外,我們的Function中還添加了CFArgument>這個標(biāo)簽,來設(shè)定BrowserID這個值,而且設(shè)定Required屬性為no是保證有檢測不出來的browserid的時候,提供一個默認(rèn)的CGI ID。如果required的屬性設(shè)定為yes,那么特定的參數(shù)傳遞如果不符合要求,就會報錯。我們可以通過下面的這個test.cfm程序來調(diào)用上面的這段復(fù)雜的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>
顯示的結(jié)果為:
Your browser is:
IE: Yes
NS: No
DW: No
ID: IE
其實我們可以用兩種方式從內(nèi)部觀察一個cfc,第一種就是通過直接的url訪問。上面第2個最終的browser.cfc在我本機的url為:
http://localhost:8500/cfdev/browser.cfc
輸入這個url后,會先看到cf administrator的界面,輸入登錄的密碼后,系統(tǒng)會報告一個browser.cfc的詳細信息給開發(fā)人員,截圖如下:
上圖詳細的介紹了這個cfc的結(jié)構(gòu)和詳細信息,想要看到這個前提是必須有cf server administrator的密碼權(quán)限哦!
第二種方法就是通過dwmx來import這個cfc,從而可以看到dwmx會自動的識別出這個CFC了:
然后我們從組件這個面板里直接把所需要調(diào)用的cfc method直接drap drop到右邊的編程區(qū)域里去,就可以了。
標(biāo)簽:宜春 松原 鄂州 河北 石嘴山 六安 自貢 淄博
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ColdFusionMX 編程指南 ColdFusionMX中的循環(huán)》,本文關(guān)鍵詞 ColdFusionMX,編程,指南,中的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。