ColdFusion Markup Language , más conocido como CFML , es un lenguaje de programación para el desarrollo web que se ejecuta en la máquina virtual Java (JVM), el marco .NET y Google App Engine . Existen varias implementaciones de software comerciales y gratuitas y de código abierto de motores CFML, incluidos Adobe ColdFusion , Lucee , New Atlanta BlueDragon ( versiones Java y .NET), Railo , Open BlueDragon y otros motores de servidor CFML .
En su forma más simple, como muchos otros lenguajes de programación web, CFML amplía los archivos HTML estándar con comandos de base de datos , operadores condicionales, funciones de formato de alto nivel y otros elementos para producir aplicaciones web . [1] [2] CFML también incluye muchas otras construcciones, incluidos los componentes ColdFusion (CFC), la versión de CFML de los objetos , que permiten separar la lógica empresarial de la presentación.
CFML se puede escribir utilizando etiquetas o CFScript , que se parece a JavaScript ( ECMAScript ).
Las páginas de una aplicación CFML incluyen las etiquetas y funciones CFML del lado del servidor además de las etiquetas HTML. Las aplicaciones CFML modernas también tienden a tener CFC a los que acceden las páginas CFML para ejecutar la lógica empresarial. Cuando un navegador web solicita una página en una aplicación ColdFusion, el servidor de aplicaciones ColdFusion la procesa automáticamente . [3]
CFML también se puede utilizar para generar otros lenguajes, además de HTML, como XML , JavaScript , CSS , etc.
A pesar del nombre, CFML no es un lenguaje de marcado. Tampoco es SGML , ya que ciertas características básicas de CFML le impiden cumplir con los requisitos.
El motor CFML está configurado de tal manera que ciertas extensiones de archivo en el servidor (.cfm, .cfc) se transfieren al motor CFML para su procesamiento. En el caso de los motores basados en Java, esto se logra a través de servlets de Java . El motor CFML solo procesa etiquetas y funciones CFML; devuelve texto fuera de las etiquetas y funciones CFML al servidor web sin cambios. [4]
El software, que en un principio se denominó Cold Fusion, fue creado en 1995 por Allaire Corporation , que originalmente tenía su sede en Minnesota . Más tarde se trasladó a Cambridge (Massachusetts) y, finalmente, a Newton (Massachusetts), antes de ser adquirido por Macromedia en 2001. Allaire Cold Fusion pasó a llamarse Macromedia Cold Fusion. Con el lanzamiento de la versión 4, se eliminó el espacio en el nombre para convertirse en ColdFusion. Adobe adquirió Macromedia en 2005. A fecha de 2023 [actualizar], sigue desarrollando activamente ColdFusion.
En 1998, Alan Williamson y su compañía escocesa, "n-ary", comenzaron a crear un motor de plantillas para Java para simplificar las tareas de programación más comunes. [5] Williamson usaba notación de llaves en lugar de etiquetas, pero cuando vio un ejemplo de CFML y cómo resolvía problemas similares (aunque no en Java) usando una sintaxis de etiquetas, comenzó a desarrollar lo que eventualmente se convertiría en BlueDragon, que fue la primera implementación en Java del lenguaje CFML. (ColdFusion se escribió en C y C++ hasta que se lanzó la versión 6.0, la primera versión basada en Java, en 2002). New Atlanta obtuvo la licencia de BlueDragon alrededor de 2001 y lo puso a disposición como un producto comercial, creando finalmente una implementación .NET de CFML. Open BlueDragon es una bifurcación del producto comercial BlueDragon y se lanzó por primera vez en 2008.
El motor CFML de Railo comenzó como un proyecto estudiantil en 2002 y se lanzó por primera vez como un proyecto comercial en 2005. [6] Railo anunció que estaban haciendo que el motor fuera de código abierto en 2008, y la primera versión de código abierto se lanzó en 2009.
El 18 de junio de 2009, Adobe anunció en la conferencia CFUnited que había formado un Comité Asesor CFML [7] que sería responsable de guiar y revisar los cambios en el lenguaje CFML. Este esfuerzo se disolvió en 2010. El Grupo Google CFML Conventional Wisdom se creó como un foro para debates públicos y abiertos sobre las características del lenguaje y del motor; su uso ha disminuido desde 2011. [ cita requerida ]
En 2012 se creó la Fundación OpenCFML, cuya función es promover aplicaciones y plataformas CFML de código abierto .
El ex desarrollador principal de Railo, Michael Offner, lanzó Lucee , una bifurcación de Railo , en Londres el 29 de enero de 2015. Con el respaldo de los partidarios de la comunidad y los miembros de la Asociación Lucee, el objetivo del proyecto es proporcionar la funcionalidad de CFML utilizando menos recursos, dando un mejor rendimiento y llevando a CFML más allá de sus raíces y convirtiéndolo en una plataforma de programación web moderna y dinámica.
Las etiquetas CFML tienen un formato similar a las etiquetas HTML. Se encuentran entre corchetes angulares (< y >) y generalmente tienen cero o más atributos con nombre , aunque algunas etiquetas (por ejemplo, cfset, cfif) contienen una expresión en lugar de atributos. Muchas etiquetas CFML tienen cuerpos; es decir, tienen etiquetas de inicio y fin con texto para procesar entre ellas. Por ejemplo:
<cfoutput> # valor # ¡Bob! </cfoutput>
Otras etiquetas, como cfset y cfftp, nunca tienen cuerpo; toda la información requerida va entre el carácter inicial (<) y el carácter final (>) en forma de atributos de etiqueta (pares nombre/valor), como en el ejemplo siguiente. Si es legal que las etiquetas no tengan cuerpo, es sintácticamente aceptable dejarlas sin cerrar como en el primer ejemplo, aunque muchos desarrolladores de CFML eligen cerrar automáticamente las etiquetas como en el segundo ejemplo para (posiblemente) hacer que el código sea más legible.
<cfset valor = "Hola" > <cfset valor = "Hola" / >
Aunque la etiqueta puede tener un cuerpo, incluir un cuerpo puede no ser necesario en algunos casos porque los atributos especifican toda la información requerida. En estos casos, como en el segundo ejemplo anterior, la etiqueta final (y, por lo tanto, el cuerpo de la etiqueta) se puede omitir y la etiqueta puede cerrarse automáticamente como en el siguiente ejemplo: [8]
< cfexecute nombre = "C:\\winNT\\System32\\netstat.exe" argumentos = "-e" archivo de salida = "C:\\Temp\\out.txt" tiempo de espera = "1" />
Varias etiquetas ofrecen la posibilidad de comprobar el tipo de los parámetros de entrada (por ejemplo, cffunction, cfparam, cfqueryparam) si el programador declara su tipo específicamente. Esta funcionalidad se utiliza con cfqueryparam para proteger las aplicaciones web y las bases de datos de piratas informáticos y solicitudes web maliciosas como la inyección SQL .
Casi 100 etiquetas y muchas más funciones conforman el núcleo del lenguaje CFML. A continuación se enumeran las etiquetas CFML por su función o propósito. [9]
CFML permite extensiones de lenguaje en forma de etiquetas personalizadas, que son etiquetas creadas por el desarrollador que no forman parte del lenguaje CFML en sí. Las etiquetas personalizadas son archivos CFML normales que están pensados para ser invocados como etiquetas, aunque es posible tratar una plantilla como una etiqueta personalizada y una plantilla normal. Las etiquetas personalizadas se escriben en CFML y normalmente se invocan anteponiendo el nombre de archivo de la etiqueta personalizada con cf_ , aunque existen otras formas de invocar etiquetas personalizadas.
Si se invoca una plantilla como una etiqueta personalizada, los atributos utilizados para invocar esa etiqueta están disponibles dentro de la etiqueta en un ámbito de atributos y las variables para la página que realiza la llamada son accesibles a través del ámbito del llamador .
Por ejemplo, si escribe una etiqueta personalizada para realizar una suma , tomando dos atributos y sumándolos, la etiqueta sería un archivo addition.cfm que podría verse así:
<cfset caller.addition = atributos.first + atributos.second / > < cfexit method = "exitTag" />
Suponiendo que la etiqueta está en el mismo directorio que el archivo (o en un directorio de etiquetas personalizadas predefinido), se puede invocar de esta manera:
< cf_addition primero = "1" segundo = "2" >
Las etiquetas CFX son etiquetas personalizadas que se desarrollan con Java o C++ y tienen el prefijo cfx_, al igual que cf_. Las etiquetas Java y C++ se agregan al entorno de ejecución CFML mediante el administrador del motor CFML o editando los archivos de configuración.
En algunos motores CFML, las etiquetas JSP también se pueden incluir en páginas CFML utilizando la etiqueta <cfimport>. [ cita requerida ]
El lenguaje de marcado ColdFusion incluye un conjunto de funciones que se utilizan para realizar operaciones lógicas y aritméticas y manipular datos.
Los CFC proporcionan algunas (no todas) de las características y funciones típicas que ofrecen los lenguajes orientados a objetos (OOP). Para crear un CFC:
Los CFC son CFML simples. Dentro de un CFC se puede utilizar cualquier etiqueta, función, etiqueta personalizada, otros componentes, etc. de CFML.
Los CFC se pueden utilizar de varias maneras. Si simplemente se necesita invocar un método contenido en un CFC, la etiqueta <cfinvoke> creará una instancia del CFC, invocará el método deseado y luego destruirá la instancia del CFC. <cfinvoke> toma el nombre del componente (menos la extensión .cfc) y el método a ejecutar. Para acceder a los datos devueltos, el atributo RETURNVARIABLE proporciona el nombre de una variable que contendrá lo que devuelva la función. Los CFC se crean utilizando cuatro etiquetas, se guardan como archivos .CFC y se invocan utilizando la etiqueta <cfinvoke>. [28]
En el siguiente ejemplo, el componente temperature.cfc tiene un método FtoC que convierte la temperatura de Fahrenheit a Celsius. La plantilla test.cfm invoca el método y convierte 212 grados Fahrenheit y genera el resultado.
<!--- temperatura.cfc ---> <cfcomponent> <cffunction nombre = "FtoC" acceso = "público" tipo de retorno = "numérico" > <cfargumento nombre = "fahrenheit" requerido = "sí" tipo = "numérico" / > <cfset respuesta = ( fahrenheit - 32 ) * 100 / 180 / > <cfreturn respuesta / > </cffunction> </cfcomponent> <!--- prueba.cfm ---> <cfset fGrados = 212 / > <cfinvoke componente = "temperatura" método = "FtoC" variable de retorno = "resultado" > < cfinvokeargumento nombre = "fahrenheit" valor = "#fGrados#" /> </cfinvoke> <cfoutput> # fGrados # ° F = # resultado # ° C </cfoutput> < br />
Los CFC también se pueden instanciar como objetos. Suponiendo que existe un archivo CFC llamado Person.cfc, una instancia de este CFC se instanciaría de la siguiente manera:
<cfset persona = CreateObject ( "componente" , "Persona" ) / >
Los CFC también forman la base de la capacidad de crear servicios web en CFML. Un CFC se crea de la forma habitual y el atributo access="remote" añadido a cualquier función dentro del CFC hará que esa función esté disponible para ser invocada como un servicio web basado en SOAP . El motor CFML genera automáticamente un WSDL y crea todos los stubs necesarios para que el servicio web funcione.