Unit 5:模版重用和结构控制

ColdFusion 在结构上具有很大的灵活性,它可以对应用文件的流向进行控制,针对不同的条件调用不同的文件,它也支持源代码重用,具有很强的可扩展性。可将经常使用的代码保存为 CFML 模块或 CFX ,日后重复应用于其他应用和界面中。也可以利用 CFML、C\C++、COM、CORBA、JavaScript、VBScript 建立自己的部件和标识。通过<CFX_XXX>调入页中。

常用源程序重用

使用 CFINCLUDE 可以完成常用源程序重用的任务。你可以利用 CFINCLUDE 做许多有用的事:

  • 如果有一段代码是你在多个应用中重复使用的,每次书写此段代码十分浪费时

间,你可以将此段代码放到单独的页中,在每一个要用到它的应用程序中调用。

  • 你可以建立一个头文件"header.cfm"

    和尾文件"footer.cfm",在文件中包括头尾的格式和风格,在每一个应用文件中调用这两个文件使你的所有文件看起来形式风格统一。

  • 如果你编写了一个极其复杂的 CFIF/CFELSE

    语句,使阅读你程序的人觉得你的

程序结构复杂、难于阅读,你可以将一些处理放到新的一页中,并给它起一个一望便知的名字,这样可使你的程序清楚、易读。

CFINCLUDE 的语法是:

<CFINCLUDE TEMPLATE="FileName"> //文件名要包括相对的路径名例如:

<CFINCLUDE TEMPLATE="header.cfm">

... Page contents

<CFINCLUDE TEMPLATE="footer.cfm">

或是:

<CFINCLUDE TEMPLATE="../index.cfm">

使用 Custom tags

由于 ColdFusion 具有很强的扩展性,用户可以自己编写 Tag 在应用程序中使用,也有不少 ColdFusion 的爱好者和技术人员自己编写一些十分有用的 Tag,供大家使用,在http://www.allaire.com/taggallery中你就可以找到不少有用的 Tag。所有用 CF_打头的Tag 都是 CFML 用户用 CFML 编写的 tags, 那些以 CFX_ 打头的 Tag 是用 C/C++编写的ColdFusion 扩展。

下面先讲如何加入一个 CFX_打头的 Tag:

  • 首先 C/C++编写的程序必须先编译,生成 DLL

    为后缀的动态链接库后才可以用做Custom tags。

  • 打开 ColdFusion Administrator 中的 CFX Tags 页,所有的已注册的用户

    tags 都列在那里。

  • 填入新的 CFX _xxx 名称,双击 Add 键,进入这个新的 Tag 页。

  • 如果在前一页没有填入名称,在 tag name 后填写 CFX_ xxx。

  • 在 Server library (DLL) 后填写引用的 DLL 和路径和名称。

  • 输入执行 tag 的程序名,这个程序必须和 DLL 中存在。

  • 选中 Keep library loaded ,防止以后要重新装入。

  • 在 Description 中填写这个 CFX Tags 的功能。

  • 双击 Add 来存储这个新的 tag.

对于 CF_打头的 Tag 使用起来十分简便,可以直接调用,但 CF_后面跟随的名字要和CFML 文件名称相同,例如: 使用 CF_MyTag 来定义 MyTag.cfm 这个文件。

也可以使用 CFMODULE 来调用用户自定义的 tag 。CFMODULE 可以处理可能发生的用户自定义的 tag 名称冲突、给自定义的 tag 传送参数。

它的语法如下:

<CFMODULE TEMPLATE="template" //描述 CFM 文件的相对路径NAME="tag_name" // tag 的名称

ATTRIBUTE="value" //传递的参数ATTRIBUTE="value"

...>

使用条件处理

Coldfusion 有两个 Tag 可以进行条件处理:CFSWITCH 和CFIF。

CFSWITCH 条件处理

和 CFSWITCH 紧密相连的还有 CFDEFAULTCASE 和 CFCASE。CFSWITCH 根据一个表达式的

值,判断它是否符合 CFCASE 规定的某一个值,然后匹配结果;CFDEFAULTCASE,处理 CFCASE 的值都不符合的情况。它们的语法:

<CFSWITCH EXPRESSION="expression">

<CFCASE VALUE="value" DELIMITERS="delimiters"> HTML and CFML tags</CFCASE> additional <CFCASE></CFCASE> tags

<CFDEFAULTCASE> HTML and CFML tags</CFDEFAULTCASE>

</CFSWITCH>

例子:有一个记录员工情况的数据库 cfsnippets,库中表格 Employees 存放有FirstName、LastName、Department 等员工所在哪个部门的情况,列出员工情况:

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

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

</CFQUERY>

<CFOUTPUT query="GetEmployees">

<CFSWITCH EXPRESSION=#Trim(Department)#>

<CFCASE VALUE="Sales">

#FirstName# #LastName# 在<B>销售部门</B><BR><BR></CFCASE>

<CFCASE VALUE="Accounting">

#FirstName# #LastName# 在<B>财务部门</B><BR><BR></CFCASE>

<CFCASE VALUE="Administration">

#FirstName# #LastName# 在<B>管理部门</B><BR><BR></CFCASE>

<CFDEFAULTCASE>#FirstName# #LastName#不在上述三个部门<BR>

</CFDEFAULTCASE>

</CFSWITCH>

</CFOUTPUT>

例如:有一个员工叫:zhangping 在管理部;有一个员工叫:chentao 不属于以上各个部门,输出的结果是:

zhangping 在管理部门

chentao 不在上述三个部门

CFIF 条件处理

和 CFIF 有关的 Tag 还有:CFELSE 和CFELSEIF。它们的语法是:

<CFIF condition1>

Display this text only if condition1 is true.

<CFELSEIF condition2>

Display this text only if condition1 is false and condition2 is true.

<CFELSEIF condition3>

Display this text only if condition1 and condition2 are false and condition3 is true.

<CFELSE>

Display this if condition1, condition2, and condition3 are false.

</CFIF>

条件中可以带有布尔表达式 AND、OR、NOT.

使用 CFIF 可以判断查询的情况:有一个数据库查询叫 CustomerSearch

<CFIF #CustomerSearch.RecordCount# IS 0>

<P>对不起,数据库中没有消费者的信息 </P>

<CFELSE>

<!--- 列出查询到的消费者名字 --->

<CFOUTPUT Query=" CustomerSearch "> #FirstName# #LastName# <BR>

</CFOUTPUT>

</CFIF>

文件重新定向

你可以使用 CFLOCATION 进行文件重新定向,文件的重新定向十分有用。你可以依据不同的条件使文件调用不同的“下一页”。

CFLOCATION 的语法十分简单:

<CFLOCATION URL="#Pagename#">

只要单纯地写下要调用的“下一页”的 URL。

例如,你可以使用 CFIF 去判断用户是否通过了用户验证,如果用户的密码或用户名不对,CFLOCATION 将文件定向到其他页去:

<CFIF #NewPassword# IS NOT `#PasswordConfirmation#'>

<CFLOCATION URL="invalidpassword.cfm">

</CFIF>

本节介绍了两个 Tag:CFLOCATION 和 CFINCLUDE,它们都可以调用一个 CFM 文件,但它们的功能和用途不一样。

CFINCLUDE 用于嵌入 CFM 文件 可用于模版重用
CFLOCATION

用于打开 ColdFusion 文件或是 HTML

文件

可用于文件重新定向

练习题:

自己定义一个 CFM 页,在另外一页中调用它。