第四期:ColdFusionMX Basic Tag編程
序言
任何一種程序再簡單也要具備一定的邏輯和算法,Coldfusion也不例外。如果只是靠簡單的標簽的堆砌,是無法真正實現(xiàn)企業(yè)商業(yè)邏輯的。而且,我在這里非?隙ǖ奶岢鲆稽c,就是簡單絕對不等于功能弱小。目前,網(wǎng)絡技術發(fā)展到了一個注重表現(xiàn)的時代,就是每一個開發(fā)出來的網(wǎng)絡應用,要在實現(xiàn)邏輯的同時,具備讓客戶有豐富的用戶體驗是另一個追求的目標。Flash+Flashremoting+cf serverside script就是一種極具體驗的開發(fā)手段。而對于開發(fā)工具,眾多的開發(fā)廠商更是在工具的易用性上做足了文章,微軟vs.net開發(fā)平臺的完整統(tǒng)一性,Oracle9i JDeveloper開發(fā)j2ee程序的wizard方式,Macromedia DreamweaverMX眾多的服務器端的腳本語言的支持,都是在工具易用性上的一種體現(xiàn)。我們今天要給大家講解的就是簡單易用的coldfusion loop。通過cf中不同的循環(huán),能夠?qū)崿F(xiàn)很多在cf中編程的邏輯。
這里的序言還要補充說明一點,作者已經(jīng)找到了操作access數(shù)據(jù)庫時的中文完全解決的方法,如果哪位開發(fā)者有興趣,請去這里查看:
第一部分 Basic tag編程深入
上一期我們講了操作數(shù)據(jù)庫的第一個重要的標簽,cfquery。但是我們只是講解了如何使用cfquery進行數(shù)據(jù)庫的查詢,現(xiàn)在我們深入講解一下cfquery的作用,然后在來講解另外兩個操作數(shù)據(jù)庫的標簽cfinsert和cfupdate。
先來看看cfsnippets這個數(shù)據(jù)庫中employees這個表的構(gòu)造。
隨著教程的深入,代碼的編寫采用verdana字體的8號,并且使用籃色,請學習者注意。
我們可以使用cfquery來做數(shù)據(jù)的插入,編寫的形式非常的簡單,代碼的方式如下:
<CFTRANSACTION>
<CFQUERY NAME="test" DATASOURCE="cfsnippets">
Insert Into Employees(FirstName,lastname,email,phone,department)
Values('Mj','king','mjking@263.net','1234567','Technical')
</CFQUERY>
<CFQUERY NAME="test" DATASOURCE="cfsnippets">
Select MAX(Emp_id) as number_id
From Employees
</CFQUERY>
</CFTRANSACTION>
插入數(shù)據(jù)成功!
你新插入的id是:
<cfoutput query="test">#number_id#</cfoutput>
下面我們來講解一下上面的這一段代碼,其中最主要的部分是應用了兩個cfquery的標簽的組合,實現(xiàn)了數(shù)據(jù)插入和最新插入的員工id的查詢。其中第一個cfquery插入了一組記錄到Employees這個table里去,除了沒有處理emp_id這個默認的員工id的自增主鍵之外,其他的幾個字段都對應給予了插入。在插入之后,第二個cfquery做的是將剛剛插入的記錄的emp_id給查詢出來。比如我們要開發(fā)一個內(nèi)部網(wǎng)的員工模塊,有可能在做了新員工的輸入之后,馬上系統(tǒng)要告知該員工的工號,就可以采用這種方式。但是會有一個問題,如果你在請求server做insert的同時,有另外一個人正好剛剛做完insert,正要查詢出他的id,這樣有可能查出的id是你的,因為這時候,系統(tǒng)有可能響應給對方你剛做完insert的記錄的emp_id的值。為了避免這樣的現(xiàn)象發(fā)現(xiàn),我們在兩個cfquery之外使用了Cftransaction這個標簽。
Cftransaction是一個協(xié)調(diào)事務處理的標簽,它把處理不同事務的作為一個整體,如果其中的某一個操作不成功,那么所有的操作都會被服務器還原(就是roll back),有這樣的功能真的是太好了。
另外,使用cfquery還可以進行數(shù)據(jù)庫的update,讓我們來看下面的代碼:
<Cfparam name="URL.number_id" default="20">
<Cfquery name="test" datasource="cfsnippets">
Select emp_id
From Employees
Where emp_id=#URL.number_id#
</Cfquery>
<cfoutput>#test.emp_id#</cfoutput>
<cfoutput>#test.recordcount#</cfoutput>
<Cfif test.RecordCount EQ 0>
沒有這個員工記錄
<Cfabort>
</Cfif>
<!--- 進行數(shù)據(jù)庫更新 --->
<Cfquery name="test" datasource="cfsnippets">
Update Employees
Set FirstName='Zerlot',
LastName='Ma',
email='zerlot.ma@hdtworld.com',
phone='7654321'
department='market'
Where emp_id=#URL.number_id#
</Cfquery>
<cfoutput>更新成功!</cfoutput>
好,我們使用cfquery做成功了insert和update,那么下面我們開始講解cfinsert和cfupdate這兩個標簽。
在開始講解之前,我們將簡要說明一下access操作中文的問題,目前從access數(shù)據(jù)庫中把中文顯示出來還沒有解決方案,至少到2002年7月還沒有。但是,進行access數(shù)據(jù)庫的插入已經(jīng)可以解決了,解決方式如下:
在你的應用根目錄下建立一個application.cfm文件,加入下面這行代碼:
<cfcontent type="text/html; charset=gb2312">
在你的每一個cfm頁面模板的開頭加入下面代碼:
<cfcontent type="text/html; charset=gb2312">
<cfset setEncoding("URL", "gb2312")>
<cfset setEncoding("Form", "gb2312")>
然后使用form表單或者cfquery進行插入中文就沒有問題了。但是從access中查詢并顯示某一條中文記錄還是有問題,目前作者還沒有確切的方法。所以作者本人的教程使用access是出于簡單,但是如果是開發(fā)者使用cfmx來開發(fā)應用的話,勸各位使用sqlserver和oracle的企業(yè)數(shù)據(jù)庫,這些數(shù)據(jù)庫都沒有什么問題。
Cfinsert和cfupdate是coldfusion中兩個常用的tag,通過點擊DreamweaverMX中CFbasic的兩個圖標來操作它們。
點擊 圖標,將執(zhí)行cfinsert這個標簽的設定功能。點擊后的窗口如下所示:
以上經(jīng)常用到的屬性是datasource、tablename和Formfields三個屬性,其中datasource是你在coldfusion administrator數(shù)據(jù)源設定中設置好的名稱,tablename是要更新的表,Formfields是和數(shù)據(jù)庫表中字段對應名稱一致的form控件名稱(注意必須一致才行)。我們看下面的列子:
<!--- 下面的代碼使用了cfinsert更新了數(shù)據(jù)表格,沒有使用cfquery--->
<!--- 如果表單有提交的動作,那么開始處理cfinsert動作--->
<cfif IsDefined ("form.posted")>
<cfinsert dataSource = "cfsnippets"
tableName = "Comments"
formFields = "Email,FromUser,Subject,MessText,Posted">
<h3><I>你的記錄已經(jīng)被提交。</i></h3>
</cfif>
<!--- 使用cfquery顯示插入數(shù)據(jù) --->
<cfquery name = "GetComments" dataSource = "cfsnippets">
SELECT
CommentID, EMail, FromUser, Subject, CommtType, MessText, Posted, Processed
FROM
Comments
</cfquery>
<html>
<head></head>
<h3>cfinsert</h3>
<!--- 顯示數(shù)據(jù) --->
<table>
<tr>
<td>From User</td><td>Subject</td><td>Comment Type</td>
<td>Message</td><td>Date Posted</td>
</tr>
<cfoutput query = "GetComments">
<tr>
<td valign = top><a href = "mailto:#Email#">#FromUser#</A></td>
<td valign = top>#Subject#</td>
<td valign = top>#CommtType#</td>
<td valign = top><font size = "-2">#Left(MessText, 125)#</font></td>
<td valign = top>#Posted#</td>
</tr>
</cfoutput>
</table>
<p>Next, we’ll offer the opportunity to enter a comment:
<!---輸入表單--->
<form action = "cfinsert.cfm" method = "post">
<pre>
Email: <input type = "Text" name = "email">
From: <input type = "Text" name = "fromUser">
Subject:<input type = "Text" name = "subject">
Message:<textarea name = "MessText" COLS = "40" ROWS = "6"></textarea>
Date Posted: <cfoutput>#DateFormat(Now())#</cfoutput>
<!---動態(tài)顯示時間--->
<input type = "hidden"
name = "posted" value = "<cfoutput>#Now()#</cfoutput>">
</pre>
<input type = "Submit"
name = "" value = "insert my comment">
</form>
那么我們執(zhí)行的結(jié)果可以看到瀏覽器顯示了我們剛剛輸入的信息,這里作者就不給出截圖,目的是讓大家自己去執(zhí)行,自己去查看結(jié)果,注意,本數(shù)據(jù)庫為access,應用程序不支持中文,如果各位想測試中文,可以構(gòu)建自己的應用程序來測試中文(使用sqlserver),只須在每個頁面的開頭中加入如下代碼即可:
<cfprocessingdirective pageencoding="gb2312">
<cfcontent type="text/html; charset=gb2312">
<cfset setEncoding("URL", "gb2312")>
<cfset setEncoding("Form", "gb2312")>
Cfinsert我們講解完了,那么作為作者本人,不是非常推薦使用Cfinsert,如果要做大量的數(shù)據(jù)庫的插入,我希望各位開發(fā)人員能夠靈活的使用cfquery而不是cfinsert。下面我們講解一下cfupdate這個標簽。單擊 圖標,會出現(xiàn)如下的界面:
各位可能看到cfupdate的窗口設置和cfinsert的很類似,是的,這兩個Tag都是對于Form表單進行專屬操作的標簽。對于cfupdate的使用方法,作者這里不想多費筆墨,它的使用和cfinsert幾乎是一樣的,同樣,我們用一段程序來看看cfupdate的作用。
程序使用了官方的一段腳本
<!--- 使用cfupdate更新數(shù)據(jù)庫 --->
<!--- 檢測course_ID這個值,如果存在則更新數(shù)據(jù)記錄--->
<cfif IsDefined("form.Course_ID")>
<!--- 檢測Course_ID是不是一個數(shù)字 --->
<cfif Not IsNumeric(form.Course_ID)>
<cfabort>
</cfif>
<!---做更新--->
<cfupdate datasource="cfsnippets"
tablename="Courses"
formfields="Descript, Course_ID">
</cfif>
<!--- 使用一個query來查看通過url傳過來的course_ID是否在對應的記錄上做了更新,各位開發(fā)人員可以使用這種查詢的技巧來驗證數(shù)據(jù)庫是否更新,而不用打開數(shù)據(jù)庫去查看--->
<cfquery name="GetCourseInfo" DATASOURCE="cfsnippets">
SELECT Number, Course_ID, Descript
FROM Courses
<cfif IsDefined("url.Course_ID")>
WHERE Course_ID = #Trim(url.Course_ID)#
</cfif>
ORDER by Number
</cfquery>
<html>
<head>
<title>CFUPDATE </title>
</head>
<body>
<H3>cfupdate更新實例</H3>
<cfif IsDefined("url.Course_ID")>
課程號:<cfoutput>#GetCourseInfo.Number#</cfoutput>
<form method="post" action="cfupdate.cfm">
<P>課程描述<BR>
<textarea name="Descript" cols="40" rows="5">
<cfoutput>#Trim(GetCourseInfo.Descript)#</cfoutput>
</textarea><br>
<input type="Hidden" NAME="Course_ID"
value="<cfoutput>#Trim(GetCourseInfo.Course_ID)#</cfoutput>">
<p><input type="Submit" value="Click to Update">
</form>
<cfelse>
<cftable query="GetCourseInfo" htmltable colheaders>
<cfcol text="<a href='cfupdate.cfm?Course_ID=#Trim(Course_ID)#'>Edit Me</a>"
width=10 header="Edit<br>this Entry">
<cfcol text="#Trim(Number)#" WIDTH="4" HEADER="Course Number">
<cfcol text="#Trim(Descript)#" WIDTH=100 HEADER="Course Description">
</cftable>
</cfif>
</body>
</html>
上面這段程序是官方的一段標準的使用cfupdate的代碼,其中包括了檢測從url傳遞過來的參數(shù),以及對傳遞參數(shù)course_ID所在的數(shù)據(jù)庫的記錄進行更新的操作。這個程序非常精辟,希望各位開發(fā)者能夠很好的研究。其中,第一次訪問不帶參數(shù)而顯示一個記錄級的方法都非常的實用,可以用在實際的開發(fā)當中。在這里,作者從本人的開發(fā)經(jīng)驗再次提出一個建議,建議大家在實際的開發(fā)當中對于經(jīng)常操作數(shù)據(jù)庫的程序編寫時,能不用cfinsert和cfupdate就不用,因為這兩個tag雖然方便,但是是犧牲了靈活性和效能來取得的。希望大家使用cfquery來進行數(shù)據(jù)庫的查詢,插入和更新。
好了,下面我們輕松一下,講解兩個非常容易看懂的tag,這兩個tag在大家進行開發(fā)的過程中使用的頻率也是很高的。一個是cfinclude,另一個是cflocation。
單擊 中的左邊的圖標,就會使用coldfusion中的cfinclude標簽,并彈出如下的窗口:
這個標簽就是用來在coldfusion的某個頁面中反復使用其他的頁面模板,它與asp中的include的作用幾乎是一樣的。比如在coldfusion要嵌入一個站點統(tǒng)一標準的頁眉和頁腳,一個是header.cfm,另一個是footer.cfm,那么,就可以使用cfinclude來實現(xiàn)。
<cfinclude template="header.cfm">
使用cfinclude也有缺點,隨著企業(yè)應用的不斷發(fā)展,業(yè)務邏輯和表現(xiàn)兩者需要進行分離的要求越來越高,那么我們就需要進行組件的設計,這樣,完全混合邏輯和表現(xiàn)的cfinclude標簽就不是很適用了,但是目前的coldfusionMx有了它最新的cfc(coldfusion components),使用這個方法可以達到邏輯與表現(xiàn)的抽離。但是cfinclude的優(yōu)點也是具有的,就是同cf component一樣可以一次性的修改頁面代碼來完成site中的所有引用,另外,cfinclude還可以包含很多的application和session的方法。
單擊上面兩個圖標中右邊的圖標,就是使用coldfusion的另外一個tag,cflocation。這個標簽起到了一個頁面跳轉(zhuǎn)的作用,它經(jīng)常與cfabort使用。比如我們做一個用戶驗證的程序,當進行一些判斷之后,發(fā)現(xiàn)用戶并不擁有權限,那么就需要把他自動送回到首頁或者某個頁面,這個時候,我們就要使用cflocation這個標簽,例如:
<cfif form.registername EQ “”>
<cflocation url="http://www.macromedia.com" addtoken="No">
<cfabort>
</cfif>
那么我們在DreamweaverMX使用cflocation的時候,看到的設置窗口如下:
最后,我們要進行一下coldfusionMx中的函數(shù)說明,coldfusionMX中的函數(shù)分為15類,包括Array, Authentication,Conversion,Date/Time,Decision,Display and Formatting,Dynamic Evaluation,International,List,Mathematical,Query,String,Structure,System,XML,Other十五個種類。這些分類包括了256個coldfusion函數(shù),應該可以滿足開發(fā)應用的需求,而且各位也還可以自己組合定義自己的function和component來使用,這樣就可以滿足開發(fā)的需要了。作者在這里不介紹Function的單獨應用了,以后會在教程中隨著程序說明一些常用的funtions。如果開發(fā)者在使用上有困難或者不明白使用的方法,可以去這個地方查看Functions的應用和示例:
http://examples.macromedia.com/coldfusion/examples/index.cfm
好了,這期的教程就講到這里,下一期,我們講解coldfusion中重要的cf Flow也就是循環(huán)。下期見!!
第二部分 論壇coldfusion探討之二
l Flash Remoting 實現(xiàn) FLashMX 和 ColdFusionMX 的通信
http://www.flashempire.net/showthread.php?s=22c923d2c64f6f43642b0b7dd40ae2ab&threadid=124099
l 你怎么得到關于官方tag的標準用例代碼
http://www.flashempire.net/showthread.php?s=22c923d2c64f6f43642b0b7dd40ae2ab&threadid=121883
l asp.net還是cfmx呢?
http://www.flashempire.net/showthread.php?s=22c923d2c64f6f43642b0b7dd40ae2ab&threadid=123532
l 寵物商店部署有感
http://www.flashempire.net/showthread.php?s=22c923d2c64f6f43642b0b7dd40ae2ab&threadid=122125
l Macromedia 尋求 solution partner
http://www.flashempire.net/showthread.php?s=22c923d2c64f6f43642b0b7dd40ae2ab&threadid=123151
第三部分 資源列表
相關于Macromedia MX系列知識的了解請訪問:
http://www.macromedia.com
http://www.macromediachina.com
http://www.flashempire.net
http://m.95time.cn
關于Macromedia 產(chǎn)品策略分析中文文章請訪問:
http://61.156.17.126/efe_news/newsread.php?id=123
下載Macromedia MX系列產(chǎn)品請訪問:
http://www.macromedia.com/software/trial_download/
* Macromedia ColdFusion MX和JRun4可以免費在官方網(wǎng)站得到開發(fā)者版本,同商業(yè)版本相比,只是限制了開發(fā)者版本的ip訪問限制,服務器高級報表工具,服務器均衡負載功能等一些高級功能的使用。
注釋:
JRun4、ColdFusion MX、Flash MX、Dreamweaver MX、Fireworks MX都是Macromedia公司的注冊產(chǎn)品。
出處:藍色理想
責任編輯:藍色
上一頁 第三期:ColdFusionMX編程入門 下一頁 第五期:ColdFusionMX中的循環(huán)
◎進入論壇網(wǎng)絡編程版塊參加討論
|