Advanced Macromedia ColdFusion MX 7 Application Development
What Is <cfscript>?
ColdFusion scripting allows you to write portions of your templates with script-based syntax, which is often more concise and straightforward than ColdFusion's traditional tag-based syntax. While you can't do everything with <cfscript> that you currently do with tag-based syntax, as you will later see, you may find that writing substantial portions of your code using scripting syntax is more natural for you. Scripting syntax is very similar to JavaScript syntax with a few exceptions that we'll discuss soon. Listing 12.1 is an example of a tag-based conditional loop and its <cfscript> counterpart. Try running Listing 12.1 by alternately commenting-out the tag-based version and the <cfscript> version, and you'll see that each version does the same thing. Listing 12.1. ScriptingExample.cfmAn Example of ColdFusion Scripting
<!--- Author: Adam Phillip Churvis -- ProductivityEnhancement.com ---> <!--- Check up to 10 times for existence of the file "file.txt" ---> <!--- Tag-based conditional loop ---> <cfset success = FALSE> <cfset attempts = 0> <cfloop condition="success EQ FALSE AND attempts LT 10"> <cfif FileExists(ExpandPath("file.txt"))> <cfset success = TRUE> <cfelse> <cfset attempts = attempts + 1> </cfif> </cfloop> <cfscript> // Script-based conditional loop success = FALSE; attempts = 0; while(success EQ FALSE AND attempts LT 10) { if(FileExists(ExpandPath("file.txt"))) { success = TRUE; } else { attempts = attempts + 1; } } </cfscript> <cfoutput>#attempts#</cfoutput> For many, the scripted loop is more readable and intuitive than the tag-based loop. As you'll learn while you read this chapter, ColdFusion scripting has some advantages and disadvantages compared to tag-based CFML. ColdFusion scripting also enables you to create user-defined functions (UDFs), which encapsulate custom logic that can be called just like built-in ColdFusion functions, and which can be reused throughout an application. We'll cover UDFs at the end of this chapter. What You Can and Cannot Do with <cfscript>
<cfscript> is a useful alternative to tag-based CFML, but you can't just replace all your tag-based CFML with scripting because there are things you can do with tags that you can't do with scripting. For example, scripting can only contain variable assignments, flow-control logic, exception handling, and function calls. You can't directly query a database, read a file from disk, or perform any other task that requires the use of CFML tags. The following section explains the differences between <cfscript> and tag-based syntax. In each section, the <cfscript> example is shown first, followed by the tag-based version. Assignment
myVariable = "Value"; <cfset myVariable = "Value">
If-Elseif-Else
if(condition1) { [logic]; } else if(condition2) { [logic]; } else { [logic]; } <cfif condition1> [logic] <cfelseif condition2> [logic] <cfelse> [logic] </cfif> Switch-Case
switch(expression) { case "value1": [logic]; break; case "value2": [logic]; break; default: [logic]; } <cfswitch expression=""> <cfcase value="value1"> [logic] </cfcase> <cfcase value="value2"> [logic] </cfcase> <cfdefaultcase> [logic] </cfdefaultcase> </cfswitch> For Loops
for(i=1; i LTE 10; i=i+1) { [logic]; } <cfloop index="i" from="1" to="10"> [logic] </cfloop> While Loops
while(expression) { [logic]; } <cfloop condition="#expression#"> [logic]; </cfloop>
Do-While Loops
do { [logic]; } while(expression); (No tag-based equivalent)
For-In Loops
for(key in structure) { [logic]; } <cfloop collection="#structure#" item="key"> [logic] </cfloop>
List Loops
(no script-based equivalent) <cfloop list="#listOfValues#" index="currentListItem"> [logic] </cfloop>
Query Loops
(no script-based equivalent) <cfloop query="queryName"> [logic] </cfloop>
Break
break; <cfbreak>
Continue
continue; (No tag-based equivalent)
Exception Handling
try { [logic]; } catch(Expression exception) { [logic]; } catch(Any exception) { [logic]; } <cftry> [logic] <cfcatch type="Expression"> [logic]; </cfcatch> <cfcatch type="Any"> [logic]; </cfcatch> </cftry>
Throwing a Custom Exception
(no script-based equivalent) <cfthrow type="BusinessRule.Customer" errorCode="66020" message="Non-wholesale customer" detail="Only registered wholesale customers may place bulk orders."> Rethrowing a Caught Exception
(no script-based equivalent) <cfrethrow> Functions
function myFunction(arg1, arg2) { var value = 0; [logic]; return value; } <cffunction name="myFunction" returntype="numeric"> <cfargument name="arg1" type="numeric"> <cfargument name="arg2" type="numeric"> <cfset var value = 0> [logic] <cfreturn value> </cffunction> By now you probably already know that ColdFusion compiles .cfm and .cfc files into Java classes that are then executed by the Java JVM, and that CFML tags specify the instructions to be carried out by those classes. Think of <cfscript> as just another way to specify a portion of those instructions. Differences between <cfscript> and JavaScript
You'll notice that <cfscript> looks a lot like JavaScript and other familiar scripting languages, but there are some important differences. First, no angle brackets of any kind (< or >) are allowed within a <cfscript> tag pair, which means you can't use the operators you're accustomed to in JavaScript. You'll have to use ColdFusion operators instead. Second, ColdFusion is absolutely fanatical about terminating all statements with a semicolon. Table 12.2 shows you the major differences between ColdFusion scripting and JavaScript.
Another major difference is that ColdFusion scripting is executed entirely on the server side, as opposed to JavaScript, which is executed entirely in the user's browser. This is the reason why ColdFusion scripting only looks like JavaScript but lacks most of its familiar statements. There is no Document Object Model (DOM) for ColdFusion scripting to access or manipulate, because ColdFusion has no sense of a "document." Why Use <cfscript>?
Sure, ColdFusion scripting does offer a few things that tag-based CFML lacks, such as do-while loops and the ability to skip loop iterations using continue. On the other hand, there are just as many if not more things offered by tag-based CFML that ColdFusion scripting lacks. So why use <cfscript> for anything other than its few unique capabilities?
|