Welcome!

You will be redirected in 30 seconds or close now.

ColdFusion Authors: Yakov Fain, Jeremy Geelan, Maureen O'Gara, Nancy Y. Nee, Tad Anderson

Related Topics: ColdFusion

ColdFusion: Article

component.cfc: The Mother of All Components

component.cfc: The Mother of All Components

Yes, that's right, components have mommies and daddies. Well, not really, but that statement isn't too far from the truth. This article explains "component.cfc", a hidden gem in the ColdFusion Component architecture that is part of ColdFusion MX.

By now, everybody knows that the introduction of the component framework in ColdFusion MX was one of the most radical changes to CFML since its inception. Their introduction was significant for three primary reasons. First, they allow developers to expose functionality to the Flash Gateway and to any other Web service-enabled environment. Second, they offer a level of abstraction far superior to that of custom tags and user-defined functions. The third reason CFCs have made such an impact on CFML is that they offer ColdFusion developers the ability to implement object-oriented features.

These object-oriented features include new variable scopes with varying degrees of exposure outside the component; the "packaging" of functionality, introspection, and the generation of meta data; objectinstance- based programming; and inheritance. In traditional object-oriented programming languages, all objects inherit from a parent "Object" class. What many developers don't realize is that components, too, have a parent "class". Its name is "component.cfc" and it can be a very valuable tool when developing applications.

Where Can I Find component.cfc?
If you create a CFC that does not inherit from any other CFC and you view its meta data, you'll notice that the value for the "hierarchy" meta information defaults to "WEB-INF.cftags.component". You will find this file in the "CfusionMXWWWRootWEBINFcftags" directory if you're running the standalone version of ColdFusion, and in "JRun4servers{your_server_name}cfusion-earcfusion-warWEBINF cftags" if you're running the J2EE version (on top of JRun4). You can view the meta data for component.cfc on a server by browsing http://{server_domain}/CFIDE/componentutils/cfcexplorer.cfc?method=getcf cinhtml&name=WEB-INF.cftags.component, replacing "{server_domain}" with "localhost:8500" or whatever other URL you use to browse to that machine.

What Does component.cfc Do?
Well, nothing really. Not out of the box, anyway. The component.cfc file is empty by default in ColdFusion MX 6.1. In ColdFusion MX it had a tiny bit of encrypted data at the top of the file. As already discussed, all components inherit from component. cfc by default. Think of it as the Application.cfm of components - a place to put code that is implicitly included. The difference is that the code outside of any method in component.cfc is executed only when a ColdFusion Component is first initialized, and that its methods and meta data are inherited by other components. It gives you a single place to put code that must be common to all CFCs on your server.

Why Would I Want to Do That?
Having one place to put functionality and initialization code that will be available to all server components has two important uses. As already mentioned, you can think of it as similar to Application.cfm, which means that if you're running a server that's dedicated to hosting one application and the application is using CFCs for its business logic (as every application should be), it's a very good place to put functionality that all components need to have.

For example, if your server is hosting your company's public Web site, all of your components might need to have access to the current company catalog of products. Creating a method in component.cfc that retrieves the current catalog information from a database and returns it to the caller would ensure that all components have the ability to retrieve the catalog by calling that method. While this is a neat trick, it's not always terribly useful or desirable, especially when your application is running on a server that hosts other completely separate ColdFusion applications.

There's another use for component.cfc though - when wielded properly, it can be a powerful development tool. More than anything else, I like to put debugging methods in my component.cfc file so that they are available in any application I happen to be working on. Extending the component framework with development tools can make a developer's life a little bit easier, as we will soon see.

Coding with component.cfc
It's a little known fact that ColdFusion Components don't technically require a start and end <cfcomponent> tag… they will work without them. That said, without the <cfcomponent> tag, a CFC will not properly inherit from the base component. cfc file nor will it allow the use of <cfproperty> tags if you are defining meta information, so as a best practice, follow the standard recommended practices when creating components.

By default, component.cfc is an empty file. Because it does not inherit from any other component (after all, it is the mother of all components), you can code methods in the file without adding any <cfcomponent> tags. You can optionally add <cfcomponent> tags to component.cfc in order to generate meta data about the component or to enable the use of <cfproperty> tags before your methods. Like inheritence with other CFCs, any meta information, methods, and variables in the component are inherited by all other components on the server.

As you may have guessed, creating a method in one component with the same name as a method in component.cfc will override the method. The original method defined in component.cfc can be accessed with the "super" keyword as "super.methodName()", provided that the component you are in does not inherit from any other component. Let's examine one very practical use for this master component file.

Component.cfc Uses
If you're anything like me, you use <cfscript> a lot. As wonderful as <cfscript> is, it is not without limitations. In particular, the use of tags is strictly forbidden within a <cfscript> block. It is often necessary during the development process to view data in order to determine what's happening in your code. The <cfdump> tag is perfect for this, but wait - you cannot <cfdump> within a <cfscript> block. What to do?

Developers like me who use <cfscript> often, have made it a standard practice to create a function using <cffunction> that accepts a single argument of any data type, <cfdump> that variable, then <cfabort> the page. That function can then be called from <cfscript>, thus giving developers the ability to "see what's happening" within their <cfscript> code.

Here's the code I wrote inside of my component.cfc file so that I can dump a value from any ColdFusion Component <cfscript> block:

<cfcomponent displayname="Root" hint="Root CFC">
<!---:: function to dump then abort ::--->
<cffunction name="dumpIt" output="true" displayname="Dump It" hint="A
debugging tool" access="private" returntype="void">
<cfargument name="it" displayname="It" hint="The Thing To Dump"
required="true" type="any">
<cfdump var="#arguments.it#">
<cfabort>
</cffunction>
</cfcomponent>

You'll notice that the method is private because I do not need nor want to expose it to cfm pages that are instantiating my components. It also means that the method does not display along with the other methods of a component that's inherited it when that component's meta data is browsed.

The "dumpIt()" method is useful for developers who do not use <cfscript> as well. It is generally considered a best practice to encapsulate business logic with components. This means passing a value to a component method, operating on that value, and returning a value to the caller page or application. With this in mind, it's a safe assumption that the components in your application(s) aren't directly outputting anything to the HTTP output stream.

Pretty much every component I create not only uses <cfscript> heavily, but never outputs anything. To make sure nothing is output, I always set my <cffunction> tag "output" attributes to "false". This is definitely a best practice in most scenarios, but not being able to output directly from a component method also means you cannot <cfdump> the value of variables within the component when you're debugging your application. Once again, the "dumpIt()" method is a very handy tool, as from within a "silent" component, you can pass the suspicious variable to this method (which has the "output" attribute set to "true") in order to see what's going on in your code.

Where Do We Go from Here?
Component.cfc is a very practical debugging tool for developers and can also be a powerful part of your applications as well. We have looked at just one way that it can be used as an effective development tool. You could create variations of the "dumpIt()" function so that you have one method to dump and abort and another to dump and allow processing to continue. It wouldn't be difficult to add methods to your component.cfc that allow you to do other useful things such as time blocks of code using the getTickCount() function, for example.

Be forewarned that there are two major drawbacks to placing code, especially application rather than debugging/development code, in component.cfc. One is that from an architectural point of view, you are physically separating your code from the rest of your application business logic. The other is that you are making your code less portable - it's no longer a simple matter of copying a directory structure from one server to another in order to move your application when some of the logic is housed in component. cfc. Other than that, have fun and take advantage of it! The sky's the limit.

More Stories By Simon Horwith

Simon Horwith is the CIO at AboutWeb, LLC, a Washington, DC based company specializing in staff augmentation, consulting, and training. Simon is a Macromedia Certified Master Instructor and is a member of Team Macromedia. He has been using ColdFusion since version 1.5 and specializes in ColdFusion application architecture, including architecting applications that integrate with Java, Flash, Flex, and a myriad of other technologies. In addition to presenting at CFUGs and conferences around the world, he has also been a contributing author of several books and technical papers.

Comments (0)

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


@ThingsExpo Stories
There is growing need for data-driven applications and the need for digital platforms to build these apps. In his session at 19th Cloud Expo, Muddu Sudhakar, VP and GM of Security & IoT at Splunk, will cover different PaaS solutions and Big Data platforms that are available to build applications. In addition, AI and machine learning are creating new requirements that developers need in the building of next-gen apps. The next-generation digital platforms have some of the past platform needs a...
SYS-CON Events announced today Telecom Reseller has been named “Media Sponsor” of SYS-CON's 19th International Cloud Expo, which will take place on November 1–3, 2016, at the Santa Clara Convention Center in Santa Clara, CA. Telecom Reseller reports on Unified Communications, UCaaS, BPaaS for enterprise and SMBs. They report extensively on both customer premises based solutions such as IP-PBX as well as cloud based and hosted platforms.
I wanted to gather all of my Internet of Things (IOT) blogs into a single blog (that I could later use with my University of San Francisco (USF) Big Data “MBA” course). However as I started to pull these blogs together, I realized that my IOT discussion lacked a vision; it lacked an end point towards which an organization could drive their IOT envisioning, proof of value, app dev, data engineering and data science efforts. And I think that the IOT end point is really quite simple…
Internet of @ThingsExpo, taking place November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with 19th Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world. The Internet of Things (IoT) is the most profound change in personal and enterprise IT since the creation of the Worldwide Web more than 20 years ago. All major researchers estimate there will be tens of billions devices - comp...
The 19th International Cloud Expo has announced that its Call for Papers is open. Cloud Expo, to be held November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA, brings together Cloud Computing, Big Data, Internet of Things, DevOps, Digital Transformation, Microservices and WebRTC to one location. With cloud computing driving a higher percentage of enterprise IT budgets every year, it becomes increasingly important to plant your flag in this fast-expanding business opportuni...
DevOps at Cloud Expo, taking place Nov 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with 19th Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world. The widespread success of cloud computing is driving the DevOps revolution in enterprise IT. Now as never before, development teams must communicate and collaborate in a dynamic, 24/7/365 environment. There is no time to wait for long dev...
Data is the fuel that drives the machine learning algorithmic engines and ultimately provides the business value. In his session at Cloud Expo, Ed Featherston, a director and senior enterprise architect at Collaborative Consulting, will discuss the key considerations around quality, volume, timeliness, and pedigree that must be dealt with in order to properly fuel that engine.
Pulzze Systems was happy to participate in such a premier event and thankful to be receiving the winning investment and global network support from G-Startup Worldwide. It is an exciting time for Pulzze to showcase the effectiveness of innovative technologies and enable them to make the world smarter and better. The reputable contest is held to identify promising startups around the globe that are assured to change the world through their innovative products and disruptive technologies. There w...
Today we can collect lots and lots of performance data. We build beautiful dashboards and even have fancy query languages to access and transform the data. Still performance data is a secret language only a couple of people understand. The more business becomes digital the more stakeholders are interested in this data including how it relates to business. Some of these people have never used a monitoring tool before. They have a question on their mind like “How is my application doing” but no id...
Personalization has long been the holy grail of marketing. Simply stated, communicate the most relevant offer to the right person and you will increase sales. To achieve this, you must understand the individual. Consequently, digital marketers developed many ways to gather and leverage customer information to deliver targeted experiences. In his session at @ThingsExpo, Lou Casal, Founder and Principal Consultant at Practicala, discussed how the Internet of Things (IoT) has accelerated our abil...
With so much going on in this space you could be forgiven for thinking you were always working with yesterday’s technologies. So much change, so quickly. What do you do if you have to build a solution from the ground up that is expected to live in the field for at least 5-10 years? This is the challenge we faced when we looked to refresh our existing 10-year-old custom hardware stack to measure the fullness of trash cans and compactors.
The emerging Internet of Everything creates tremendous new opportunities for customer engagement and business model innovation. However, enterprises must overcome a number of critical challenges to bring these new solutions to market. In his session at @ThingsExpo, Michael Martin, CTO/CIO at nfrastructure, outlined these key challenges and recommended approaches for overcoming them to achieve speed and agility in the design, development and implementation of Internet of Everything solutions wi...
Cloud computing is being adopted in one form or another by 94% of enterprises today. Tens of billions of new devices are being connected to The Internet of Things. And Big Data is driving this bus. An exponential increase is expected in the amount of information being processed, managed, analyzed, and acted upon by enterprise IT. This amazing is not part of some distant future - it is happening today. One report shows a 650% increase in enterprise data by 2020. Other estimates are even higher....
SYS-CON Events announced today that 910Telecom will exhibit at the 19th International Cloud Expo, which will take place on November 1–3, 2016, at the Santa Clara Convention Center in Santa Clara, CA. Housed in the classic Denver Gas & Electric Building, 910 15th St., 910Telecom is a carrier-neutral telecom hotel located in the heart of Denver. Adjacent to CenturyLink, AT&T, and Denver Main, 910Telecom offers connectivity to all major carriers, Internet service providers, Internet backbones and ...
Smart Cities are here to stay, but for their promise to be delivered, the data they produce must not be put in new siloes. In his session at @ThingsExpo, Mathias Herberts, Co-founder and CTO of Cityzen Data, will deep dive into best practices that will ensure a successful smart city journey.
19th Cloud Expo, taking place November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA, will feature technical sessions from a rock star conference faculty and the leading industry players in the world. Cloud computing is now being embraced by a majority of enterprises of all sizes. Yesterday's debate about public vs. private has transformed into the reality of hybrid cloud: a recent survey shows that 74% of enterprises have a hybrid cloud strategy. Meanwhile, 94% of enterpri...
Identity is in everything and customers are looking to their providers to ensure the security of their identities, transactions and data. With the increased reliance on cloud-based services, service providers must build security and trust into their offerings, adding value to customers and improving the user experience. Making identity, security and privacy easy for customers provides a unique advantage over the competition.
Is the ongoing quest for agility in the data center forcing you to evaluate how to be a part of infrastructure automation efforts? As organizations evolve toward bimodal IT operations, they are embracing new service delivery models and leveraging virtualization to increase infrastructure agility. Therefore, the network must evolve in parallel to become equally agile. Read this essential piece of Gartner research for recommendations on achieving greater agility.
SYS-CON Events announced today that Venafi, the Immune System for the Internet™ and the leading provider of Next Generation Trust Protection, will exhibit at @DevOpsSummit at 19th International Cloud Expo, which will take place on November 1–3, 2016, at the Santa Clara Convention Center in Santa Clara, CA. Venafi is the Immune System for the Internet™ that protects the foundation of all cybersecurity – cryptographic keys and digital certificates – so they can’t be misused by bad guys in attacks...
For basic one-to-one voice or video calling solutions, WebRTC has proven to be a very powerful technology. Although WebRTC’s core functionality is to provide secure, real-time p2p media streaming, leveraging native platform features and server-side components brings up new communication capabilities for web and native mobile applications, allowing for advanced multi-user use cases such as video broadcasting, conferencing, and media recording.