首先,我学习这门语言才入门,相当于菜鸟级.写的文章可能欠妥,如有,请大家留言或发邮件给我.但示例代码绝对能成功运行且能达到文章预期效果.要示例代码的请联系我,我会发您的邮箱.
本人用的是coldfusion企业9、IIS、Dreamweaver8等工具.
了解CFC之前最重要的是关于对象的概念。
首先必须知道—CFML 不是面向对象语言, 而且 CFC 并未提供所有面向对象程序语言应有的功能。这不是一件坏事, 因为面向对象语言牵涉到许多外来属性, 语法规则上也过于复杂。但对于使用 CFML 这类快速开发语言的开发人员来说, 没道理不能使用面向对象技术, 这就有了 CFC, 它的诞生可以说是为了简化一些程序设计上对 OOP 的需求。
为了简单易用, 也为了避开纯粹面向对象程序中遇到的一些恼人的问题, CFC 中的对象只是简单的做到在程序中重复使用。就像黑匣子一样, 不管您如何设计它, 别人都不需要知道您是怎么设计它的, 但是可以为人所用。听起来有点像自定义标签, 的确CFC与自定义标签有许多类似之处, 但 CFC 的作用比自定义标签来的强大。例如说它们常常不仅包含标签与函数, 还可以包含任何数据, 允许完整地封装任何数据和程序。对象通常具有多个方法 (method), 它提供自动进行初始化的机制, 而且不需要入口 (例如 Java 里的 main()), 对象可以被转接及修改, 现有的程序代码都可以用继承的方式自动结合, 不必真正动手去更改源代码。
现在您应该知道什么是 CFC 了, 让我们一起来看看他们是怎么创建的。首先请确认 ColdFusion 的服务运行正常。建立 CFC 的步骤充分表现了 ColdFusion 的宗旨: 非常容易!只要两个步骤就可以完成:
这四个新标签是:
<CFCOMPONENT>
: 定义新组件 <CFFUNCTION>
: 在组件中定义方法 <CFARGUMENT>
: 定义传入方法的参数变量 <CFRETURN>
: 从方法中返回结果 尽管这些功能类似在 CFMX 中创建自定义标签与自定义函数, 但它不同于自定义标签与自定义函数, 在组件中您可以很自由地使用任何标签、方法、系统标签、组件…等。
创建 CFC
browser.cfc(看范例程序代码) 有一些简单的例子让大家更了解 CFC, 这是一个验证浏览器用的 CFC, 用于辨识使用者的浏览器种类。
这个文件的名字是 browser.cfc, 它就是一个 CFC。在 CFC 组件里, 所有代码都是被包含在 <CFCOMPONENT>
和 </CFCOMPONENT>
之中。这个组件自己本身有一个单独的函数isIE(), 是使用 <CFFUNCTION>
来命名和定义的。在这个函数中有一个变量被定义为result, 如果浏览器的标识包含了Microsoft Internet Explorer的标识符, 这个变量就会被设定为“YES”, 并通过 <CFRETURN>
返回 result 这个变量。
browser.cfc源代码如下:
<!--- 浏览器 id 组件 --->
<CFCOMPONENT>
<!--- 这个浏览器是 IE 吗? --->
<CFFUNCTION NAME="IsIE">
<!--- 初始化变数 --->
<CFSET result="No">
<!--- 寻找 IE 的特征 --->
<CFIF FindNoCase("MSIE", CGI.HTTP_USER_AGENT)>
<!--- 找到了 --->
<CFSET result="Yes">
</CFIF>
<!--- 回传结果 --->
<CFRETURN result>
</CFFUNCTION>
</CFCOMPONENT>
再创建一个testcfc.cfm文件,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<!--- 验证 IE
<CFINVOKE>
是 CFMX 的新标签, 它的作用就是用来执行 CFC 里面的方法 (method), 并取得传回的数据,请注意:COMPONENT="此名称性必须与browser.cfc中的browser一致,不然肯定找不到"。RETURNVARIABLE
代表得到回传的数据时, 要将它放到哪个变量里面。
--->
<CFINVOKE COMPONENT="browser"
METHOD="IsIE"
RETURNVARIABLE="result_ie">
<cfoutput>
Your browser is:<BR>
IE: #YesNoFormat(result_ie)#<BR>
</cfoutput>
</body>
</html>
本人是用IE运行效果如下:
Your browser is:
IE: Yes
您可以尝试执行这段程序代码, 当您在 IE 与其它浏览器中执行它的时候, 会得到不同的结果。
现在您应该熟悉 CFC 工作的方式了, 接着看 browserAll.cfc, 这是完整版的 browser.cfc。这个版本的 cfc 有些复杂, 其中的 <CFCOMPONENTS>
包含了四个方法:
您可以注意到我们在每个函数中添加了两个新属性。
您可以注意到我们在每个函数中添加了两个新属性。
RETURNTYPE
: 指定返回数据的类型, 用来验证返回的数据(如果是错误的类型, 将提示错误)。 HINT
: 当这个 CFC 自动产生说明文件的时候, 会用这个字符串来叙述这个函数的功能。(等一下会解释得更详细) 在简单版的 browser.cfc 中, 代码主要是去验证 CGI 变量 HTTP_ USER_ AGENT
以便判断是否为该浏览器, 但这并不是很好的做法, 因为这些函数应该要能验证任何传入的字符串, 而不是仅仅验证当时的浏览器。所以这些新的函数附带了对可选参数定义的标签 <CFARGUMENT>
, 它有两种不同的设定方式:
REQUIRED="yes"
如果指定参数不存在, 将提示错误。TYPE
, 则会对传入参数的内容进行检查, 让传入的参数必须符合指定的格式。 REQUIRED="no"
, 您可以对参数指定一个默认值。 在四个函数中, <CFARGUMENT>
都定义了 browser 参数, 允许传递任何数据类型, 如果参数没有提供默认值, 则使用默认的 CGI 变量。
前三个函数基本上都跟前面看到的相同, 但第四个函数跟前面比起来就有较大的不同。第四个函数不像前三个函数, 各自验证一种特定的浏览器, 而是改成一次验证三种浏览器。它的做法是将浏览器字符串作为参数传入前三个函数, 并将浏览器缩写回传给调用这个函数的程序代码。这比复制前三个函数的程序代码到这个函数里面好多了, 这个函数直接使用前三个函数, 且不是用 <CFINVOKE>
, 而是直接把它们当成函数调用就行了, 语法简单。
browserAll.cfc文件代码如下:
<CFCOMPONENT>
<!--- 浏览器是否为 IE? --->
<CFFUNCTION NAME="IsIE"
RETURNTYPE="boolean"
HINT="Is browser Microsoft IE">
<!--- 如果没有传入浏览器数据,就自动改用运行当时的浏览器数据 --->
<CFARGUMENT NAME="browser"
REQUIRED="no"
DEFAULT="#CGI.HTTP_USER_AGENT#"
HINT="Browser ID, defaults to CGI ID">
<!--- 初始化变量 --->
<CFSET result="No">
<!--- 寻找 IE 的特征 --->
<CFIF FindNoCase("MSIE", browser)>
<!--- Yep, got it --->
<CFSET result="Yes">
</CFIF>
<!--- 回传结果 --->
<CFRETURN result>
</CFFUNCTION>
<!--- 验证是否为 Netscape --->
<CFFUNCTION NAME="IsNetscape"
RETURNTYPE="boolean"
HINT="Is browser Netscape">
<!--- 如果没有传入浏览器数据,就自动改用运行当时的浏览器数据 --->
<CFARGUMENT NAME="browser"
REQUIRED="no"
DEFAULT="#CGI.HTTP_USER_AGENT#"
HINT="Browser ID, defaults to CGI ID">
<!--- 初始化变量 --->
<CFSET result="No">
<!--- 验证是否有 Netscape 的特征,且没有 IE 的特征 --->
<CFIF FindNoCase("mozilla", browser) AND NOT FindNoCase("MSIE", browser)>
<!--- 没错! --->
<CFSET result="Yes">
</CFIF>
<!--- 回传结果 --->
<CFRETURN result>
</CFFUNCTION>
<!--- 验证是否为 Dreamweaver --->
<CFFUNCTION NAME="IsDreamweaver"
RETURNTYPE="boolean"
HINT="Is browser Dreamweaver">
<!--- 如果没有传入浏览器数据,就自动改用运行当时的浏览器数据 --->
<CFARGUMENT NAME="browser"
REQUIRED="no"
DEFAULT="#CGI.HTTP_USER_AGENT#"
HINT="Browser ID, defaults to CGI ID">
<!--- 初始化参数 --->
<CFSET result="No">
<!--- 寻找 Dreamweaver 的特征 --->
<CFIF FindNoCase("mmhttp", browser)>
<!--- Yep, got it --->
<CFSET result="Yes">
</CFIF>
<!--- 回传结果 --->
<CFRETURN result>
</CFFUNCTION>
<!--- 辨识浏览器
回传: IE - Internet Explorer
NS - Netscape
DW - Dreamweaver
其它则传回空字符串
--->
<CFFUNCTION NAME="Identify"
RETURNTYPE="string"
HINT="Identify a browser">
<!--- 如果没有传入浏览器数据,就自动改用运行当时的浏览器数据 --->
<CFARGUMENT NAME="browser"
REQUIRED="no"
DEFAULT="#CGI.HTTP_USER_AGENT#"
HINT="Browser ID, defaults to CGI ID">
<!--- 初始化变量 --->
<CFSET result="">
<CFIF IsIE(browser)>
<CFSET result="IE">
<CFELSEIF IsNetscape(browser)>
<CFSET result="NS">
<CFELSEIF IsDreamweaver(browser)>
<CFSET result="DW">
</CFIF>
<!--- 回传结果 --->
<CFRETURN result>
</CFFUNCTION>
</CFCOMPONENT>
测试browserAll.cfc文件中所有方法页面名称:
testBrowserAll.cfm文件代码如下:
<!--- 验证 IE --->
<CFINVOKE COMPONENT="browserAll"
METHOD="IsIE"
RETURNVARIABLE="result_ie">
<!--- 验证 Netscape --->
<CFINVOKE COMPONENT="browserAll"
METHOD="IsNetscape"
RETURNVARIABLE="result_ns">
<!--- 验证 Dreamweaver --->
<CFINVOKE COMPONENT="browserAll"
METHOD="IsDreamweaver"
RETURNVARIABLE="result_dw">
<!--- 取得浏览器的种类 --->
<CFINVOKE COMPONENT="browserAll"
METHOD="Identify"
RETURNVARIABLE="result_id">
<!--- 显示 --->
<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>
本人用IE运行效果如下:
Your browser is:
IE: Yes
NS: No
DW: No
ID: IE