Colorful Life2010

Coldfusion页面的代码重用(zt)
Weather:阴转晴

译自: Dreamweaver MX 帮助文档Coldfusion部分

Coldfusion页面的代码重用
这章主要叙述Coldfusion页面的代码重用。 重用的目的主要是让你可以只写一次,以后可以多次使用,不用再重复的拷贝。 本章主要就是讲解这些技术,并对在什么情况下应该使用那种代码重用的方式进行说明。
内容
· 关于 CFML 的代码重用机制
· 使用cfinclude标签包含页面
· 使用用户自定义函数
· 使用自定义cfml标签
· 使用cfx标签
· 使用coldfusion组件
· 选择合适的Coldfusion代码重用方式

一、关于 CFML 的代码重用机制

Coldfusion提供几种代码重用的机制,可以使你只要写一次代码,就可以在多个地方使用。其中一些机制还可以扩展Coldfusion的内建机制。
Coldfusion提供以下可代码重用的机制:
· 使用cfinclude标签包含coldfuision页面
· 用户自定义函数(udfs)
· 自定义cfml标签
· cfx(coldfusion扩展)标签
· coldfusion组件
下面的本章的后继部分将说明每种机制的特性和应该在什么情况下使用那种机制。而本章的后续章节将逐个详细说明。本章的最后一部分将通过表格的方式列出什么情况下该使用那种机制。
除此之外,Coldfusion还可以使用下面的方式来使用其他技术:
· 使用jsp标签
· Java对象,包括在java运行环境和javabeans内的对象.
· 微软COm(componet object model)对象
· CORBA (Common Object Request Broker Architecture)对象
· Web服务(web services)

二、使用cfinclude标签包含页面

cfinclude标签可以使一个页面的内容包含在另外一个页面中,被包含的页面就象包含它的页面里的一段代码被执行。 有了它我们就可以达到“一些书写,多次使用”的目的。 我们只要把需要多次应用的代码都放在一个页面里,而不需要每次使用的时候都把这段代码拷贝一次。 例如:我们可以通过cfinclude标签来放置一个网页的页眉和页脚,这些页眉和页脚在许多页面上都是一样的。 通过这样的方法,如果我们要改变网页页眉和页脚的演示,只需要改动一个文件就行了,而不需要去改所有的文件。
在这样的模式中,被包含的页面使属于主页面的一部分,只不过它是存在外部文件里的。 cfinclude标签不能给被包含的页面传递变量,但是被包含页面可以使用包含它的页面里的所有变量。 下面我们用图形来说明这一模型:
1、使用cfinclude标签
当您使用cfinclude标签来把一个coldfusion页面包含到另一个coldfusion页面时,包含其他页面的那个页面一般称为“呼叫页面”(calling page)。 当Coldfusion解释过程中遇到cfinclude标签时,它就会去执行被包含的页面,然后用它的输出来替代cfinclude标签。 被包含的页面也可以改变包含它的页面里的变量。
下面是一cfinclude标签的示例:
<cfinclude template = "header.cfm">
coldfusion会去搜查下面几种类型的包含文件:
· 根据标签内指定路径的页面,相对于标签所在页面的路径。
· 如果如果路径最前面包含斜杠/,coldfusion将从根目录往下按指定路径搜索,这根目录的具体位置可以在coldfusion管理里面设置。
注意:不能跨页面来执行cfml的代码段。 比如说,如果你使用<cfoutput>来开始一段输出,你必须要在同一个页面里放上</cfoutput>来结束,而不能把</cfoutput>放到一个包含页面里来结束这段输出。
注意:一个页面千万不要去包含它本身。 这样做会导致一个无限的死循环,你只有通过停止服务器才能把这个循环给停止了。

2、包含页面的代码:
1. 创建一个名为header.cfm的Coldfusion页面来显示您公司的logo标志。 可以是下面简单的代码,或者更复杂的一些代码来显示一个完整的网页顶部(页眉):
<img src="mylogo.gif">
<br>

(为了能使图片正常显示,你需要把公司的logo图片(mylogo.gif)和header.cfm放在同一个目录下))

2. 创建一个coldfusion页面,内容如下:
<html>
<head>
<title>Test for Include</title>
</head>
<body>
<cfinclude template="header.cfm">
</body>
</html>
3. 把改页面存为includeheader.cfm并在浏览器里进行浏览。
你将会在页面里面看到您公司的logo标志。
3、推荐用法
在下面情况下推荐使用cfinclude标签:
· 用于放置网页的页眉和页脚(顶部和底部)
· 使一个包含很多逻辑块的页面更容易被阅读,理解和管理
· 存放一段在很多地方都需要重复使用的,不需用传递参数的比较长的代码段。

三、使用用户自定义函数

用户自定义函数(udfs)就是产生一段函数,通过对它传递函数就可以返回所需要的结果。 You can define您可以通过cfscript或cffunction标签来定义 UDFs。 这两个技术有一些区别,其中下面的是最主要的:
· 如果您使用cffunction标签,你的函数可以包含cfml标签。
· 如果您使用cfscript来写函数,则不能包含cfml标签。
您可以象使用标准coldfusion函数一样在您的应用页面里使用UDFs。 你可以为一段经常用到的算法或过程创建一个函数,这样你就可以通过引用这段函数来实现这个算法或过程。
和自定义标签一样,您可以十分方便的和别人一起分享你的udfs。 例如:http://www.cflib.org就是一个专门为用户提供开放式的自定义函数网站。
1、调用UDFs
你可以象使用coldfusion内建函数一样使用UDF。 例如:下面的代码就是调用一个名为myfunct的函数并向它传递两个参数:
<cfset returnvalue=MyFunct(Arg1, Arg2)>
2、推荐用法
一般我们会在下面情况下使用udfs,当也不仅仅局限于此:
· 数据的常规方面,比如一段转置矩阵的函数
· 对字符串、日期和时间操作方面,例如确定一个字符串是不是合法的IP地址
· 数学计算方面,包括标准三角和统计学方面的操作或计算贷款的分期偿还
· 对外部程序的调用,比如COM或CORBA,例如,我们可以用一个函数去获取Windows文件系统下一个分区的可用空间信息。
在下面的情况下可以考虑使用udfs:
· 必须通过传递函数才能获得返回值。 udfs可以返回复杂的数值,包括包含很多单一值的structutes(结构)。
· 您想要提供一个逻辑单元,比如数据操作。
· 必须使用递归来实现的功能。
· 您需要向别人发布你的代码。
如果用udf和用户自定义标签都可以实现你的目的,请优先考虑使用udf,因为它比自定义标签需要更少的系统额外开销。

四、使用自定义cfml标签

自定义标签具有一般coldfuion标签一样的性质。他们可以完成下面的任务:
· 带差数。
· 可以有标签主体,开始和结束标签。
· 当遇到开始标签的时候时候 coldfusion可进行特定的操作。
· 如果有结束标签,Coldfuion又可以进行不同的操作,该操作可以是和仅有开始标签进行的操作不同。
· 在自定义标签里面可以包含任何coldfusion页面里合法的元素,包括Coldfusion内建标签,自定义标签,甚至JSP标签或者javascript代码。
· 允许递归调用,就是说,如果设计恰当,一个自定义标签内部可以调用本身。
· 通过全局变量向调用页面返回结果,但是自定义标签不能象函数那样直接返回结果。
虽然自定义标签和被 cfincluede标签引用的页面都是coldfuion页面,但是coldfuion对他们的处理方式是不同的。 当页面调用一个自定义标签,该页面的代码将暂时停止执行知道自定义标签内的代码全部被执行完。 当自定义标签的代码执行完毕,将返回到调用该标签的页面,继续执行该页面的代码。 下面的图例示范了这一过程。 箭头表示coldfuion对页面执行的流程。

1、调用自定义cfml标签
不像内建标签,你可以通过下面三种方法调用自定义的cfml标签:
· 直接调用。
· 使用cfmodule标签调用。
· 使用cfimport标签调用标签库目录。
直接调用一个cfml自定义标签,只需要把改标签所在的cfm文件的文件名去掉.cfm的扩展名,在前面加上cf_前缀,然后放到尖括号<>里就行了。 比如说,如果用来存放自定义标签代码的文件名是mytag.cfm,我们可以用下面的方式来直接调用该标签:
<cf_myTag>
同时只要给标签加上斜杠(/),就可以构成一个结束的标签:
</cf_myTag>

2、推荐用法
Coldfusion自定义标签让你可以把复杂的代码和编程逻辑抽象为十分简单的形式。 这些标签可以使你的代码保持一致的cfml设计风格。 你可以很容易的发布你的自定义标签,让别人和你一起分享。 例如:,macromedia coldfusion developer’s专门为用户提供自定义标签;参见http://devex.macromedia.com/developer/gallery/index.cfm。
我们一般在下面的情况下使用cfml自定义标签:
· 你需要一个标签式的结构,包括开始标签,结束标签和标签主体。
· 您打算通过开始标签,结束标签把特殊的进程联系起来。
· 使用一种包含子标签或下级标签的逻辑结果。 这种结构类似于cfform标签,该标签使用子标签来表示表单里面独立的字段元素。
· 在代码可以直接返回结果时,我们不需要使用函数的形式。
· 必须使用递归来实现的功能。
· 一些综合性的功能。
· 发布的代码需要先进行加密。
如果用udf和用户自定义标签都可以实现你的目的,请优先考虑使用udf,因为它比自定义标签需要更少的系统额外开销

五、使用cfx标签

Coldfusion扩展(cfx)标签是用户用java或C++写的自定义标签。 一般用cfx标签来实现cfml不能实现的功能。 通过cfx标签可以把java或c++代码引用coldfusion里面。 不像cfml自定义标签,cfx标签不允许有标签块和结束标签。
cfx可以向调用它的页面返回变量或者向调用页面写入文本。
cfx标签可以实现下面功能:
· 允许有自定义属性。
· 产生和处理coldfusion查询。
· 可以动态生成html并返回给客户端。
· 设置调用页面内的变量。
· 遇到异常情况可以返回标准的coldfusion错误信息。
1、调用cfx标签
要调用一个cfx标签,在类名前面加上cfx_然后放入尖括号内就行了。 例如,可以使用下面的代码调用一个类名为MyCFXClass的cfx标签,并传递一个参数:
<cfx_MyCFXClass myArgument="arg1">
2、推荐用法
cfx标签提供了一种使用c++或java代码的方法。 除此之外,你还可以使用cfobject标签来调用你创建的java类和com对象。 不过cfx标签含有一些cfobject没有的内建属性:
· cfx标签更容易被cfml代码调用。 可以象其他标签一样在cfml代码里直接使用cfx标签,可以使用标准的标签方式传递函数。
· coldfusion提供一些预先设置好的java类或c++代码,使开发cfx标签更加方便和容易。 这类包括对请求处理的支持,错误报告,以及查询管理。
您可以在下面环境下考虑使用cfx标签:
· 您已经有一些写好的java或C++代码,想直接用到coldfusion程序中。
· 单纯使用coldfusion不能实现的功能。
· 想使用标签的格式引用本地的java或com对象来实现一项新的功能,但不想通过cfobject标签的方式。
· 您想要使用coldfuion提供的java和c++类来开发cfx代码。

六、使用coldfusion组件

不同于其他的coldfusion可重用的机制,coldfusion组件可以集合多个互相关联的函数。 一个coldfusion组件本质上是一套相互联系的自定义函数和变量,对组件的功能进行控制和操作。 coldfusion组件可以通过设置使数据只被它自身的函数调用,而不被其他的应用程序调用,即使那些程序调用该组件。
coldfusion组件具有下面的特性:
· 可以在一个独立的单元里实现一定的功能。
· 为互联网上的其他应用提供Web服务(web services)。
· 可以直接为Flash客户端提供coldfusion服务。
· 用于类似于面向对象编程的一些特性:数据隐藏,继承,打包和内省。
1、创建和使用coldfusion组件
创建和使用一个组件相对于自定义函数(udf)稍微复杂一点。 比用说,一个组件可以包含一个或多个函数。 您可以使用多种方式调用coldfuion组件,例如使用cfinvoke和cfobject标签。 另外,你还可以使用表单,urls,flash客户端的actionscript来调用。
我们可以用下面的代码通过cfinvoke的方式来调用一个组件:
<cfinvoke component="componentName" method="methodName" returnVariable="variableName" argumentCollection="argumentStruct">


2、推荐用法
可以在下面情况下考虑使用coldfusion组件:
· 创建Web服务(web services)。 (在coldfusion里面创建web服务只能通过组件实现))
· 创建可以被flash调用的服务。
· 创建一些需要共享数据的函数库。
· 需要根据权限和请求位置提供服务的安全机制。
· 使用面向对象的方法开发应代码,通过对象方式来创建和扩展一些特性。

七、选择合适的Coldfusion代码重用方式

下面通过表格的形式说明在什么情况下使用那种代码重用的方式比较合适。 字母P代表Preferred(最好)。 (可能一种情况下有几个P)。)A表示除了用最佳的方法,在某种特定情况下可以考虑用这种方法替换。
表格里不包括cfx标签。 一般在涉及到C++或java写的代码的时候才用到cfx标签。
目的 cfinclude 标签 自定义标签 自定义函数UDF 组件
为许同页面提供相同的,包含有cfml,html或静态文本的代码。 P
给每一个网页创建相同的页眉和页脚。 P
把一个页面包含在另一个页面中。 P
把页面分割成小的独立的逻辑单元. P
需要使用调用页面的变量. A P P
需要使用递归来实现的功能. P P P
发布你的代码和别人共享. P P P
需要有标签体 P
需要使用子标签. P
提供计算,数据操作,或者其他的过程。 A P
提供一个函数,通过输入参数返回结果(可能是很复杂的结果)。 A P
使用变量,并且变量名可能在使用中经常变换。 A P P
可以被flash方便的使用。 A A P
使用内建的用户安全特性。 A P
封装多个相互联系的函数。 P
创建 web services P
使用面向对象的编程方式 P

文章来源:http://www.blueidea.com/bbs/newsdetail.asp?id=1077198 蓝色理想

历史上的今天: [2010/06/02]强迫症

[Coldfusion页面的代码重用(zt)]的回复

Post a Comment~