选择显示字体大小

macromediacoldfusionmx开发者(4)

那么另外的elseelsif是嵌套在完整的cfif中的,下面这段代码是一个完整的说明:

<cfif 表达式1>

代码段1

<cfelseif 表达式2>

代码段2

<cfelse>

代码段3

</cfif>

如果表达式一成立,则做代码段1,如果表达式1不成立,则判断表达式2是否成立,如果表达式2成立,则做代码段2,否则做代码段3。各位没有开发基础的朋友,可以试试这段小代码,之后运行一下就明白结果了。

<cfif 1 is 0>

<cfoutput>1</cfoutput>

<cfelseif 2 is 0>

<cfoutput>2</cfoutput>

<cfelse>

<cfoutput>3</cfoutput>

</cfif>

开发程序我们在控制流程的过程中,还用到了switch…case方法,在coldfusion的编程方式中同样支持。而对于switch…case方法,使用起来也是很简单的,这里进行一下简单的讲解。点击 这三个图标来完成cfswitch的操作,目的在于让开发者进行同一种表达式对于多种结果值的条件下进行流程的选择。点击了左边的图标之后,我们会看到下面的窗口:

语法操作如下:

<cfswitch expression= "#var#">

       <cfcase value= "x1">

              action1

       </cfcase>

       <cfcase value= "x2">

              action2

       </cfcase>

      

       <cfdefaultcase>

              default action

       </cfdefaultcase>

</cfswitch>

语法解释非常的简单,对于表达式expression,用cfcasevalue属性来反映表达式中#var#的值,然后针对不同的值,来响应不同的action,做不同的操作,如果没有值匹配,那么做cfdefaultcase标签中的默认action。来个macromedia官方标准的程序段看看:

<cfquery name = "getemployees" datasource = "cfsnippets">

select emp_id, firstname, lastname, email, phone, department

from employees

</cfquery>

<h3>cfswitch example</h3>

<p>each time the case is fulfilled, the specific information is printed;

if the case is not fulfilled, the default case is output </p>

<cfoutput query="getemployees">

<cfswitch expression="#trim(department)#">

<cfcase value="sales">

#firstname# #lastname# is in <b>sales</b><br><br>

</cfcase>

<cfcase value="accounting">

#firstname# #lastname# is in <b>accounting</b><br><br>

</cfcase> <cfcase value="administration">

#firstname# #lastname# is in <b>administration</b><br><br>

</cfcase>

<cfdefaultcase>

#firstname# #lastname# is not in sales, accounting, or

administration.<br><br>

</cfdefaultcase>

</cfswitch>

</cfoutput>

这段代码就是通过了cfswitch来显示cfmx默认数据源cfsnippetsemployees表中的人员,而方式用department(所在的部门)变量在cfswitchcfcase的不同value来区分显示开来。

我们来看cf flow面板中的另外3个图标集合: ,这3个图标从左到右,依次是cftrycfcatchcfthrow。这3tag在进行cf应用程序的编写调试过程中,起到了重要的作用。这3个标签实际上是进行了应用程序的错误和异常的处理。为什么要有错误和异常的处理?作者本人认为有两个大的方面的作用。第一,就是提醒开发人员应用程序出错或异常,同时使系统在交付给客户之后出现错误或异常后,能够使用不同方式的处理给客户一个可靠的感觉。第二,就是减少应用程序遭受攻击的可能。如果我们不使用错误和异常处理,那么我们经常可以看到,如果程序处理出错,会在web浏览器里暴露出不该出现的信息,比如数据库表名,字段名,甚至对数据库的操作等等。其实这些出错信息是不应该对外显示在web浏览器里的。

我们在编写coldfusion应用程序的时候,应该注意一下可能出现的错误类型,从而能使用cfmx administrator里的设定和cftrytag结合来处理这些错误。我们经常遇到的错误分为五类:语法错误、数据库操作错误、应用服务器application server)环境错误、逻辑错误和验证错误。按照这些错误的重要性来排序,第一位的就是应用服务器环境错误,这些错误由application server产生,它可能会导致整个coldfusion应用不能运行。所以排在最为重要的位置。其他的我们应该力图减少语法和逻辑错误,因为这种错误可以通过不断的debug来修正,而且这类错误的调试比较消耗精力。

我们先来看下图,这是我操作cfmx administrator->debugging settiongs的过程中的一个截图:

如果你选择了enable robust exception information这个选项,在cfm页面出现错误的时候,将通过浏览器可以看到application显示的应用错误信息,包括页面模板物理路径、页面的uri,错误行数(不一定准确)、操作的数据库语句、数据源名称、java堆栈的trace方式等等。这样其中一些信息显然是你在把项目提交给客户后不希望显示的,所以在production server上安装完coldfusionmx之后,要把这个选项的勾选去掉。

通过简单的介绍<cftry><cfcatch>之后,可能很多人都不会使用,那么我们用一个最最简单的数据库的操作来说明错误处理的作用。回忆先前的程序,我们先写下一段简单的数据库query程序段:

<cfquery name="demo" datasource="cfsnippets">

select      emp_id, lastname

from         employees

</cfquery>

如果我们把cfsnippets的名称改成xxx,那么我们看看会发生什么情况?请看下面的截图:

上面的这张截图是cf server自动给出的错误信息显示页面。这个页面上,看看我们提供了哪些重要的信息给来自外部的访问人员?数据源名称,文件的物理路径,sql查询的语句。这些信息完全给那些带有恶意的访问者以可乘之机。那么我们应该使用<cftry><cfcatch>来避免这些报错信息的显示。修改以后的代码如下:

<cftry>

<cfquery name="demo" datasource="xxx">

select      emp_id, lastname

from         employees

</cfquery>

<cfcatch type="database">

       对不起!我们不能连接到数据库服务器!非常抱歉!

       <cfabort>

</cfcatch>

</cftry>

之后我们看到的浏览器中的显示信息为:

“对不起!我们不能连接到数据库服务器!非常抱歉!”

这样,很多非常重要的,涉及到安全性的信息就被保护了起来,同样也就降低了服务器被恶意攻击的可能性。
第二部分 在原有的基础之上深入一下

很多开发人员在学习了五个部分的基本coldfusionmx的知识后,已经可以进行一些简单的应用程序编写了。那么我们就在原有的基础之上,深入一下。讲解coldfusionmx的最新的cfcomponent的基本知识。关于本教程的中的一些cfcomponent的资料来源于macromedia官方。

在开始讲解cfcomponent(以下简称cfc)之前,先来一段简单的概要,让各位开发人员在整体上对cfc进行一下介绍。很多开发人员可能对asp都比较熟悉,asp可以和com,com+结合起来应用而com就是基于微软的一种组件技术。说这种技术高深也好,易用也罢,从我这里认为,组件开发技术就是提供给应用程序一组高可用性的代码。什么是可用性?在英文里就是reuse。专业一点就是代码重用。cfc也不例外,通过简单的将许多不同功能的cfml代码段进行一定逻辑的组合,并赋予不同的访问方式,就构成了cfc。那么cfc相比对于以前的cf的自定义标签又有什么优势和不同?cfc最大的优点就是不包含表现性质的代码,也就是说,一个cfc具有某种纯粹的逻辑,然后通过不同的调用方式和附加性的修饰标签来呈现给外部不同的结果,是完全符合web技术开发的需求,那就是表现与逻辑分离。而,custom tag则不是这样,它是构造一个function,可以把表现与逻辑混在一起,通过其他cfm页面的操作来呈现结果。还有一个不同是cfc是一种对象,具有不同的访问方式,也具有了method的入口操作方式,也具有了参数控制方式。如果上面这部分解释理解比较吃力的话,那么我们用一个经常开发的模块来说明问题。我们经常在开发互动性网站的时候,经常会开发用户注册和验证模块,按照一般的开发方式,会有很多个页面,比如login.cfmcheckuser.cfm等等一堆的页面来进行用户的登录(注册)操作。我们的逻辑代码会写在所有的需要处理的后台文件中。那么会出现何种烦杂的现象?用<cfquery>组成不同的数据库操作代码段来进行用户名和密码的查找,返回查找结果,进行form表单输入值和数据库结果的验证,通过不同页面上的不同的嵌入性的逻辑代码来相应用户的不同操作。这样的开发方式不是不可以,但是我们建议cf开发人员采用一种更先进的开发方式cfc进行相应功能的开发。那么开发相同功能模块的cfc是一种什么样子的开发思路呢?我们可以把需要的代码段集合在一起,通过特有的构成cfctag把这些代码段变成特有的components,另外,赋予它们不同的method。还是针对用户注册和登录验证的功能模块,我们换成这种思路:

l         定义一个user object,把所有对于用户的通用操作封装在这个object

l         定义对于user object的操作方法,例如add(),delete(),update(),get()等等一些通用的操作方法,同样也可以再增加一些,例如verifypassword(),getemail()等等。

l         对于不同用户传递不同的参数给特定的方法来实现相应功能。

好了,不用我说了,大家已经可以分辨出使用cfc的优点:可用性强,开发效率高,扩展性强。

那么,我们用什么来构造一个cfc呢?很复杂?令人头疼?都不是,用基本的cfml语法知识,外加几个特定的构造cfctag就可以实现了。那么构造cfc的几个tag如下:

l         <cfcomponent>定义一个cfc

l         <cffunction>定义一个cfc中的操作方法(method

l         <cfargument>定义method接收的参数

l         <cfreturn>返回一个值,或者从method返回。

我们现在构造一个非常简单的cfc,看下面的代码:

<!--- browser id component --->
<cfcomponent>
    <!--- is the browser ie? --->
    <cffunction name="isie">
                               <!--- init variable --->
                               <cfset result="no">
                               <!--- look for ie identifier --->
                               <cfif findnocase("msie", cgi.http_user_agent)>
                                              <!--- yep, got it --->
                                              <cfset result="yes">
                               </cfif>
                               <!--- return result --->
               <cfreturn result>
               </cffunction>
</cfcomponent>

文件存储成为browser.cfc,我们大家可以看到,所有的cf代码在<cfcomponent></cfcomponent>标签之间。这个cfc有一个function叫做isie,目的是判断浏览器的类型。默认的结果是no,那么如果检测出有msie这个串(不分大小写),结果为true。这个function返回的值就是result。很简单是不是?

在构造好browser.cfc这个component之后,如何应用这个browser.cfc呢?在存放browser.cfc的目录下再生成一个test.cfm文件,这个文件中的代码使用下面的编写方式:

<!--- invoke browser cfc --->
<cfinvoke component="browser"
                     method="isie"
                     returnvariable="result_ie">

<!--- feedback --->
<cfoutput>
your browser is:<br>
ie: #yesnoformat(result_ie)#<br>
</cfoutput>

之后执行test.cfm这个文件,得到的结果是:

your browser is:
ie: yes

test.cfm这个文件使用了<cfinvoke>这个标签调用了browser这个cfc,并且调用了isie这个方法,返回的值是使用result_ie。上面的cfc只是一个判断ie浏览器的程序,下面来个全的:

<cfcomponent>

<!--- is the browser ie? --->

<cffunction name="isie"

       returntype="boolean"

       hint="is browser microsoft ie">

<!--- if no browser id passed, used current --->

<cfargument name="browser"

       required="no"

       default="#cgi.http_user_agent#"

       hint="browser id, defaults to cgi id">

<!--- init variable --->

<cfset result="no">

<!--- look for ie identifier --->

<cfif findnocase("msie", browser)>

  <!--- yep, got it --->

  <cfset result="yes">

</cfif>

<!--- return result --->

<cfreturn result>

</cffunction>

<!--- is the browser.netscape? --->

<cffunction name="i.netscape"

       returntype="boolean"

       hint="is browser.netscape">

<!--- if no browser id passed, used current --->

<cfargument name="browser"

       required="no"

       default="#cgi.http_user_agent#"

       hint="browser id, defaults to cgi id">

<!--- init variable --->

<cfset result="no">

<!--- look for.netscape identifier and no ie identifier --->

  <cfif findnocase("mozilla", browser) and not findnocase("msie", browser)>

  <!--- yep, got it --->

    <cfset result="yes">

  </cfif>

<!--- return result --->

<cfreturn result>

</cffunction>

<!--- is the browser dreamweaver? --->

<cffunction name="isdreamweaver"

       returntype="boolean"

       hint="is browser dreamweaver">

<!--- if no browser id passed, used current --->

<cfargument name="browser"

       required="no"

       default="#cgi.http_user_agent#"

       hint="browser id, defaults to cgi id">

<!--- init variable --->

<cfset result="no">

<!--- look for dw identifier --->

 <cfif findnocase("mmhttp", browser)>

   <!--- yep, got it --->

   <cfset result="yes">

 </cfif>

<!--- return result --->

<cfreturn result>

</cffunction>

<!--- identify a browser

       returns: ie - inte.net explorer

                            ns .netscape

                            dw ?dreamweaver

                            empty string is unknown

--->

<cffunction name="identify"

       returntype="string"

       hint="identify a browser">

<!--- if no browser id passed, used current --->

<cfargument name="browser"

       required="no"

       default="#cgi.http_user_agent#"

       hint="browser id, defaults to cgi id">

<!--- init variable --->

<cfset result="">

<cfif isie(browser)>

  <cfset result="ie">

<cfelseif i.netscape(browser)>

  <cfset result="ns">

<cfelseif isdreamweaver(browser)>

  <cfset result="dw">

</cfif>

<!--- return result --->

<cfreturn result>

</cffunction>

</cfcomponent>

上面的第2cfc复杂了一些,我们覆盖存储成为browser.cfc,这个cfc中包含了4functionmethod):

isie测试浏览器是否为ms的浏览器;isnescape测试是否是nescapemozilla)浏览器;isdreamweaver测试是否内嵌dreamweaveridentify返回所有的结果,如果以上3种都不是,返回空串。程序还为cffunction添加了两个新的属性:returntype是对返回值的一个类型确认(validate),如果不是returntype所描述的类型,将会显示一个错误。另外,我们的function中还添加了<cfargument>这个标签,来设定browserid这个值,而且设定required属性为no是保证有检测不出来的browserid的时候,提供一个默认的cgi id。如果required的属性设定为yes,那么特定的参数传递如果不符合要求,就会报错。我们可以通过下面的这个test.cfm程序来调用上面的这段复杂的browser.cfc

<!--- check for ie --->

<cfinvoke component="browser"

       method="isie"

       returnvariable="result_ie">

<!--- check for.netscape --->

<cfinvoke component="browser"

       method="i.netscape"

       returnvariable="result_ns">

<!--- check for dw --->

<cfinvoke component="browser"

       method="isdreamweaver"

       returnvariable="result_dw">

<!--- identify browser --->

<cfinvoke component="browser"

       method="identify"

       returnvariable="result_id">

<!--- feedback --->

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

显示的结果为:

your browser is:
ie: yes
ns: no
dw: no
id: ie

其实我们可以用两种方式从内部观察一个cfc,第一种就是通过直接的url访问。上面第2个最终的browser.cfc在我本机的url为:

http://localhost:8500/cfdev/browser.cfc

输入这个url后,会先看到cf administrator的界面,输入登录的密码后,系统会报告一个browser.cfc的详细信息给开发人员,截图如下:

上图详细的介绍了这个cfc的结构和详细信息,想要看到这个前提是必须有cf server administrator的密码权限哦!

第二种方法就是通过dwmximport这个cfc,从而可以看到dwmx会自动的识别出这个cfc了:

然后我们从组件这个面板里直接把所需要调用的cfc method直接drap & drop到右边的编程区域里去,就可以了。


第三部分 资源列表

相关于macromedia mx系列知识的了解请访问:

http://www.macromedia.com

http://www.macromediachina.com

http://www.flashempire.net

http://www.blueidea.com

关于macromedia 产品策略分析中文文章请访问:

http://61.156.17.126/efe_news/newsread.php?id=123

下载macromedia mx系列产品请访问:

http://www.macromedia.com/software/trial_download/

* macromedia coldfusion mxjrun4可以免费在官方网站得到开发者版本,同商业版本相比,只是限制了开发者版本的ip访问限制,服务器高级报表工具,服务器均衡负载功能等一些高级功能的使用。

注释:

jrun4coldfusion mxflash mxdreamweaver mxfireworks mx都是macromedia公司的注册产品。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons