cfml 组件(cfc)示例源代码

首先,我学习这门语言才入门,相当于菜鸟级.写的文章可能欠妥,如有,请大家留言或发邮件给我.但示例代码绝对能成功运行且能达到文章预期效果.要示例代码的请联系我,我会发您的邮箱.

本人用的是coldfusion企业9、IIS、Dreamweaver8等工具.

ColdFusion 的 CFC 有点类似对象

了解CFC之前最重要的是关于对象的概念。

  首先必须知道—CFML 不是面向对象语言, 而且 CFC 并未提供所有面向对象程序语言应有的功能。这不是一件坏事, 因为面向对象语言牵涉到许多外来属性, 语法规则上也过于复杂。但对于使用 CFML 这类快速开发语言的开发人员来说, 没道理不能使用面向对象技术, 这就有了 CFC, 它的诞生可以说是为了简化一些程序设计上对 OOP 的需求。

  为了简单易用, 也为了避开纯粹面向对象程序中遇到的一些恼人的问题, CFC 中的对象只是简单的做到在程序中重复使用。就像黑匣子一样, 不管您如何设计它, 别人都不需要知道您是怎么设计它的, 但是可以为人所用。听起来有点像自定义标签, 的确CFC与自定义标签有许多类似之处, 但 CFC 的作用比自定义标签来的强大。例如说它们常常不仅包含标签与函数, 还可以包含任何数据, 允许完整地封装任何数据和程序。对象通常具有多个方法 (method), 它提供自动进行初始化的机制, 而且不需要入口 (例如 Java 里的 main()), 对象可以被转接及修改, 现有的程序代码都可以用继承的方式自动结合, 不必真正动手去更改源代码。

介绍 CFC

现在您应该知道什么是 CFC 了, 让我们一起来看看他们是怎么创建的。首先请确认 ColdFusion 的服务运行正常。建立 CFC 的步骤充分表现了 ColdFusion 的宗旨: 非常容易!只要两个步骤就可以完成:

  1. 创建一个以 .CFC 为扩展名的文件。(主要是为了区别 CFC 与一般的 .CFM 页面)
  2. 使用四个新的标签来创建新组件, 定义他们的方法和元素, 并返回变量。

    这四个新标签是:

    • <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

现在您应该熟悉 CFC 工作的方式了, 接着看 browserAll.cfc, 这是完整版的 browser.cfc。这个版本的 cfc 有些复杂, 其中的 <CFCOMPONENTS> 包含了四个方法:

  • IsIE: 验证 IE, 返回 ”yes” 或是 ”no”。
  • IsNetscape: 验证是否为网景浏览器, 返回 ”yes” 或是 ”no”。
  • IsDreamweaver: 验证是否为 Dreamweaver 内建浏览器, 返回 ”yes” 或是 ”no”。
  • Identify: 验证所有三项, 返回相关浏览器信息, 如果无法判别则传回空值。

您可以注意到我们在每个函数中添加了两个新属性。

您可以注意到我们在每个函数中添加了两个新属性。

  • RETURNTYPE: 指定返回数据的类型, 用来验证返回的数据(如果是错误的类型, 将提示错误)。
  • HINT: 当这个 CFC 自动产生说明文件的时候, 会用这个字符串来叙述这个函数的功能。(等一下会解释得更详细)

在简单版的 browser.cfc 中, 代码主要是去验证 CGI 变量 HTTP_ USER_ AGENT 以便判断是否为该浏览器, 但这并不是很好的做法, 因为这些函数应该要能验证任何传入的字符串, 而不是仅仅验证当时的浏览器。所以这些新的函数附带了对可选参数定义的标签 <CFARGUMENT>, 它有两种不同的设定方式:

  1. 当需要参数为必需参数, 可以设定 REQUIRED="yes" 如果指定参数不存在, 将提示错误。
    如果指定 TYPE, 则会对传入参数的内容进行检查, 让传入的参数必须符合指定的格式。
  2. 当需要参数为可选参数, 可以设定 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

 

 

 

你可能感兴趣的:(cfml 组件(cfc)示例源代码)