Adobe ColdFusion

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:31, 24 января 2017.
Adobe ColdFusion
fraimed
Спроектировано Jeremy and JJ Allaire, Adobe Systems Incorporated
Язык физической реализации Java
OS кроссплатформенный
Лицензия Проприетарная
Портал: https://www.adobe.com/products/coldfusion

ColdFusion — (произносится [ əˈdəʊ.bi kəʊldˈfjuː.ʒən ] ) интерпретируемый скриптовый язык программирования, созданный для генерации HTML на веб-сервере и работы с базами данных. Язык был создан братьями Джереми и Джозефом Эллейрами, но на данный момент продуктом владеет Adobe. Начиная с версии 1.5, ColdFusion содержал совместимость с C++, позволяя пользователям разрабатывать дополнения к языку. Годами позже это послужило основой для создания ColdFusion Extension (CFX) Tags, нынешнего метода для дополнения языка. Разработка приложений с использованием Cold Fusion не требует программирования на таких языках как Perl, C/C++, Visual Basic или Delphi. Вместо этого вы создаете приложение, встраивая в обычный (стандартный) HTML файл специальные теги для работы с базами данных.

История

В 1995 году два брата Джереми и Джозеф Эллейр в США основали новую компанию «Allaire Corporation» для продвижения первого в мире сервера веб-приложений, который они назвали DBML (от англ. DataBase Markup Language — «язык разметки баз данных») и который позже был переименован в CFML (от англ. ColdFusion Markup Language — «язык разметки ColdFusion»). Одной из причин создания ColdFusion как раз и была сложность создания сайтов, управляемых данными с помощью CGI программ. Перед одним из братьев – Джереми – стояла задача периодического обновления электронной версии издававшегося в печатном виде журнала. Занятие это было крайне утомительным, и Джереми обратился к своему брату-программисту с просьбой написать для него какое-нибудь приложение, которое избавило бы его от излишней траты времени и сил, и позволило бы ему сосредоточиться на основной задаче – собственно, обновлению электронной версии журнала. Когда проект был завершен, оба брата осознали, что испекли горячий пирожок, который наверняка многим придется по вкусу. Братья основали новую компанию и, не мудрствуя лукаво, дали ей свою фамилию.

Вложив в свое детище 18 тысяч долларов личных сбережений, шестью годами позже, в 2001 году, братья Эллейр продали его корпорации Macromedia более чем за 360 миллионов долларов. После слияния была выпущена версия ColdFusion 5.0. В июне 2002 года Macromedia выпустила Macromedia ColdFusion MX, назвав версию по аналогии с линейкой своих остальных продуктов. ColdFusion MX была полностью переписана и основана на Java 2 Enterprise Edition (J2EE). В ColdFusion MX также была встроена хорошая поддержка Macromedia Flash (через Macromedia Flash Remoting MX). 18 апреля 2005 Macromedia начала приобретаться компанией Adobe Systems. 5 декабря 2005 сделка была завершена за 3,4 миллиарда долларов.

Описание

Adobe ColdFusion – это своего рода сервер приложений, который является посредником, преобразующим ваш код, написанный на языке высокого уровня, называемом CFML (ColdFusion Markup Language) в теги HTML-документа, который может отобразить веб-браузер, после чего отсылает результат клиентскому приложению. В свою очередь CFML – это язык программирования, который часто называют расширением HTML, так как он представляет ничто иное, как стандартный набор тегов, которые можно вставить в код веб страницы. Исходники языка – простые текстовые файлы, отличающиеся от HTML только расширением - *.cfm.

Основы языка

Обработка пользовательских запросов

  1. Веб-браузер направляет запрос к веб-серверу с требованием открыть файл ColdFusion. Эти файлы имеют расширение .cfm.
  2. Получив запрос, веб-сервер перенаправляет его серверу приложений ColdFusion.
  3. Сервер приложений анализирует шаблон и выполняет действия, предписанные встретившимися тегами и функциями CFML, взаимодействуя, если надо, с другими службами и приложениями, например источниками данных или почтовым сервером. В результате динамически создается часть результирующей HTML страницы.
  4. Далее сервер приложений собирает воедино только что созданную динамическую часть страницы со статической частью исходного шаблона и возвращает результирующую страницу веб-серверу.
  5. Веб-сервер отправляет полученную от сервера ColdFusion страницу на пославшую запрос клиентскую машину.

Типы данных

В ColdFusion существуют следующие основные типы данных:

  • Целочисленный — integer;
  • С плавающей точкой — Real;
  • Символьный — string;
  • Логический — Boolean;
  • Дата — Date;
  • Время — Time.

Кроме того, в ColdFusion доступны несколько более сложные типы:

  • Списки — List;
  • Структуры — Structure;
  • Массивы — Array;
  • Запросы — Query;
  • СОМ-объекты (Component Object Model) — сомobject.

Переменные

Переменные в ColdFusion имеют определенные области действия и назначение и по этим признакам относятся к определенной категории. Эти категории отражает префикс, который может быть добавлен к имени переменной:

  • Caller – Переменные источников вызова; предназначены для переменных из шаблонов при указании пользовательских тегов ColdFusion
  • Attributes – Переменные атрибутов пользовательских тегов
  • Client – Клиентские переменные
  • Session – Переменные сессий
  • Application – Переменные прикладных задач
  • Server – Серверные переменные

Определение переменных

В ColdFusion для определения переменных существуют такие теги, как <CFSET> и <CFPARAM>:

  • Тег <CFSET>Одним из вариантов определения переменной в ColdFusion является указание тега <CFSET>. Если переменная уже существует, она определяется повторно.Синтаксис:
    <CFSET имя_переменной = выражение>
    
    Например, для определения переменной FirstName со значением "Anjuta" необходимо включить в текущую Web-страницу следующий код:
    <CFSET FirstName="Anjuta">
    
  • Тег <CFPARAM>Еще одним вариантом определения переменной в ColdFusion является использование тега <CFPARAM>, который также обеспечивает возможность указания типа данных и значения по умолчанию, в том числе может применяться для проверки существования переменной.Синтаксис:
    <CFPARAM NAME = "variable_name" TYPE = "data_type" DEFAULT = "default_value">
    
    Имеются два способа использования тега <CFPARAM>, в зависимости от задачи:• Применение тега <CFPARAM> только с указанием атрибута имени (NAME), проверяет существование переменной; если переменная не существует, ColdFusion Server прекращает обрабатывать страницу;• Использование тега <CFPARAM> с атрибутами имени (NAME) и значения по умолчанию (DEFAULT) для проверки существования необязательной переменной; если переменная уже существует, обработка кода продолжается, и значение переменной не изменяется; если переменная не существует, создается переменная с именем, указанным атрибутом NAME и со значением, указанным атрибутом DEFAULT.Следующий пример показывает, как использовать тег <CFPARAM> для определения переменной, если она отсутствует:
    <CFPARAM NAME="Form.Gender" DEFAULT="male">
    
    Отметим также возможные варианты необязательного атрибута TYPE:• any — любое значение;• array — любой массив;• binary — бинарное значение;• boolean — логическое значение;• date — значение даты и времени;• numeric — числовое значение;• query — объект запроса;• string — символьное значение;• struct — структура;• UUID — универсальный уникальный идентификатор (Universally Unique Identifier) в формате "ХХХХХХХХ-ХХХХ-ХХХХ-ХХХХХХХХХХХХХХХ", где "X" - шестнадцатеричная цифра, принимающее значение 0—9 или или A—F;• имя — имя существующей переменной. Например, определим переменную Moneyness с типом boolean:
    <CFPARAM NAME="Moneyness" DEFAULT=True TYPE="boolean">
    

Клиентские, серверные, переменные сессии и прикладных задач

Кроме того различным образом объявляются клиентские, серверные, переменные сессии и прикладных задач:

  • Клиентские переменные могут использоваться в таких целях, как сохранение параметров, характеризующих шрифт, цвет, стиль и расположение страницы, а также хранение значения счетчика и последнего времени посещения страницы, контроль результатов опросов, тестов, закупок в электронных магазинах и т. д.В ColdFusion существует три возможных механизма хранения клиентских переменных:Registry (Реестр) — в этом случае переменные хранятся в реестре операционной системы (system registry). Этот механизм хранения переменных является значением по умолчанию.Cookie (Ячейка) — название говорит само за себя, подобный механизм подразумевает хранение переменных в cookies.Data Source (Источник данных) — в этом случае хранение клиентских переменных осуществляется в пользовательской базе данных через прописанный ODBC, OLE DB или собственный источник данных.За выбор механизма хранения клиентских переменных отвечает атрибут CLIENTSTORAGE тега <CFAPPLICATION>.В следующем примере с помощью тега <CFPARAM> создадим клиентскую переменную Client.NameCruise со значением по умолчанию "Liberty":
    <CFPARAM NAME="Client.NameCruise" DEFAULT="Liberty">
    
  • Переменные сессии служат для единовременного фиксирования посещения Web-страницы. Сессия определяется индивидуальным пользователем, в результате чего каждый пользователь имеет отдельную сессию и конкретный набор переменных сессии. Сессия начинается при первом вхождении на Web-участок и формально заканчивается при завершении работы браузера. Таким образом, один пользователь может работать сразу с несколькими сессиями, предварительно запустив браузер необходимое количество раз. Мы говорим о формальном завершении сессии, т. к. сессия имеет период времени, по окончании которого при бездействии пользователя сессия завершается, а, следовательно, и жизненный цикл переменных прекращается. То есть зарегистрировались вы на одном из Web-участков, некоторое время поработали и, не закрывая ваш любимый браузер, отлучились от компьютера, например, ушли на обед. А через определенный промежуток времени сессия завершается. Приходите с обеда, пытаетесь совершить какие-либо действия в окне открытого браузера, но ничего не получается. Все дело в том, что переменные сессии, часть из которых могли отвечать за доступ к Web-участку, прекратили свое существование.Переменные сессий могут использоваться в таких целях, как хранение параметров регистрации пользователя, хранение вычислений, основанных на информации из клиентских переменных, хранение временных результатов запросов к данным, в общем, контроль над всеми переменными, требующими сохранение только в течение единой сессии.Для примера объявим переменную сессии Login следующим образом:
    <CFSET Session.Login = "true">
    
  • Переменные прикладных задач связаны с единым приложением и доступны всем клиентам данного приложения. Прикладные переменные могут использоваться в таких целях, как хранение учета обращений к текущему приложению, хранение результатов запросов к данным, к которым могут обращаться все клиенты приложения, хранение наименований источников данных, а также хранение заголовка приложения и стандартных сообщений и т. д.Для использования прикладных переменных необходимо создать конфигурационный файл с именем Application.cfm и добавить туда определение имени приложения, используя атрибут NAME тега <CFAPPLICATION>. Указанные определения в конфигурационном файле приложения распространяются на все прилегающие к этому файлу страницы приложения. То есть, загружая ту или иную страницу ColdFusion, система ищет файл Application.cfm вплоть до корневого каталога приложения и при первой удачной попытке содержимое найденного файла помещается в начало загруженной ColdFusion-страницы:
    <CFAPPLICATION NAME="MyLineCruises" SESSIONMANAGEMENT="Yes">
    
    Для примера объявляем прикладную переменную textFieidsize следующим образом:
    <CFPARAM NAME="Application.textFieldSize" DEFAULT="25">
    
  • Серверные переменные не привязаны к какому-либо приложению или клиенту, а относятся непосредственно к ColdFusion Server, и по этой причине к ним можно обращаться всем клиентам или из разных приложений данного сервера. Эти переменные хранятся в оперативной памяти сервера до тех пор, пока тот не будет приостановлен.Например, объявим серверную переменную CountuserActive с использованием тега <CFSET>:
    <CFSET Server.CountuserActive = 0>
    
    Удаление и просмотр серверных переменных осуществляется по аналогии с переменными сессий и переменными прикладных задач. Скажем, удаление серверной переменной CountuserActive можно осуществить следующим способом:
    <CFLOCK TIMEOUT="30" SCOPE="Server" TYPE="Exclusive"><CFSET StructDelete(Server, "CountuserActive")> </CFLOCK>
    

Работа с данными

ColdFusion позволяет работать с данными через драйверы ODBC, OLE DB, а также использовать собственные драйверы для Oracle, Sybase, Informix, DB2. В ColdFusion существует тег <CFQUERY>, позволяющий передавать SQL-запросы в базу данных как для выполнения определенных действий, так и для извлечения результирующих данных. Это не единственный тег в ColdFusion, предназначенный для работы с базами данных, однако его можно определить как основной и требующий отдельного внимания. Синтаксис:

<CFQUERY 
	NAME = "query_name"					Имя запроса.
	DATASOURCE = "ds_riame"				Источник данных, к которому обращен запрос.
	DBTYPE = "type"						Тип драйвера базы данных. Необязательный атрибут.
	OBSERVER = "dbms"					Имя сервера БД. Необязательный атрибут.
	DBNAME = "database name"				Имя БД (только для Sybase System 11 и SQLOLEDB). Необязательный атрибут.
	CONNECTSTRING = "connection string"	Строка соединения для отправления к ODBC-серверу.
	USERNAME = "username"				Имя пользователя. Необязательный атрибут.
	PASSWORD = "password"				Пароль пользователя. Необязательный атрибут.
	MAXROWS = "number"					Определяет максимальное количество записей для возвращаемого результата. Необязательный атрибут.
	BLOCKFACTOR = "blocksize"			Максимальное количество записей для одновременной выборки (fetch) с сервера. Необязательный атрибут.
	TIMEOUT = "milliseconds"				Максимальное время ожидания выполнения запроса в миллисекундах. Необязательный атрибут.
	CACHEDAFTER = "date"					Значение даты. Необязательный атрибут. Позволяет использовать кэширование данных запроса, если дата запроса оригинала принимает более позднее значение даты, установленной с помощью CACHEDAFTER.
	CACHEDWITHIN = "timespan"			Промежуток, использующий функцию ColdFusion CreateTimeSpan. Необязательный атрибут. Позволяет применять кэширование данных запроса, если дата запроса оригинала попадает в промежуток времени, который определяется функцией CreateTimeSpan.
	PROVIDER = "COMProvider"				СОМ-поставщик. Необязательный атрибут. Только для OLEDB.
	PROVIDERDSN = "datasource"			Имя поставщика данных. Необязательный атрибут. Только для OLEDB.
	DEBUG = "Yes | No" >					Используется для отладки запроса. Необязательный атрибут.
	SQL-предложения						Обычная SQL команда.
</CFQUERY>

Массивы, структуры и списки

Массивы

Массивы (arrays) ColdFusion несколько отличаются от традиционных массивов, т. к. они являются динамическими, и если для обычных массивов их размер постоянен, то массивы ColdFusion могут менять размер в зависимости от добавления или удаления данных.Для использования массива необходимо предварительно его объявить:
<CFSET MyNewArray = ArrayNew(x)>
где х — число, отражающее размерность массива, которое может принимать значение от 1 до 3 (т. е. максимально трехмерный).

К примеру, создадим одномерный массив и запишем в уже существующий массив два элемента следующим образом:

<CFSET CruiseArray = ArrayNew(1)>
<CFSET CruiseArray[1] = "Museum of Jewish Horitage">
<CFSET CruiseArray[2] = "Ellis Island">

Проверка массива:

  • Функция ArrayisEmpty(array) проверяет, является ли массив пустым.
  • Функция ArrayLen(array) возвращает длину заданного массива.
  • Функция isArray(value [, number]) возвращает True, если значение является массивом. Здесь number — число, позволяющее уточнить проверку соответствия количества элементов массива.

Добавление элементов:

  • Функция ArrayAppend(array, value) добавляет элемент в конец заданного массива.
  • Функция Arrayprepend(array, value) добавляет элемент в начало заданного массива.
  • Функция ArraylnsertAt (array, position, value) вставляет элемент массива на указанную позицию.
  • Функция ArraySet(array, start_pos, end_pos, value) присваивает определенное значение ряду элементов одномерного массива в указанном диапазоне.

Структуры

Для использования структуры необходимо предварительно ее объявить:

<CFSET MyNewStruct = StructNew()>

К примеру, создадим структуру и присвоим значения двум ее элементам:

<CFSET TravelerStruct = StructNew()>
<CFSET TravelerStruct["RS1"] = "Nomar Garciaparra">
<CFSET TravelerStruct["RS2"] = "Pedro Martinez">

Списки

Списки (lists) — специальный символьный тип, составленный из элементов, отделенных разделителями. Вы можете самостоятельно определять разделитель для списка. Причем разделитель может состоять из нескольких символов. По умолчанию в качестве разделителя (delimiter) принимается запятая (,). Структура списков — плоская, т. е. списки не могут быть вложены друг в друга. Также, списки не могут содержать никакие "пустые" элементы. Однако список может быть пуст. При этом он эквивалентен пустому значению "". Создание списка:

<CFSET MyList = "Black,Magenta,Cyan,Orange,Darkgray,Pink,Gray,White,Lightgray,Yellow">

Поиск, сортировка, проверка и просмотр списков

  • Функция ListFind(list, value [, delimiters]) осуществляет поиск значений в списке с заданным разделителем.
  • Функция ListFindNoCase(list, value [, delimiters]) выполняет поиск значений в списке без учета регистра.
  • Функция ListContains(list, substring [, delimiters]) возвращает позицию в списке, начиная с которой встречается заданный фрагмент текста (подстрока).
  • Функция ListContainsNoCase(list, substring [, delimiters]) возвращает позицию в списке, начиная с которой встречается заданный фрагмент текста, без учета регистра.
  • Функция ListSort(list, sort_type [, sort_order] [, delimiter]) сортирует элементы списка с учетом разделителя.

Создание пользовательских тегов

Пользовательский тег представляет собой некий код с возможностью его многократного использования, и поведение которого может зависеть от передаваемых атрибутов. Применение пользовательских тегов позволяет ускорить процесс разработки Web-приложений и облегчить сопровождение будущего продукта. Пользовательские теги в ColdFusion могут быть двух видов:

  • Теги, имена которых содержат приставку CF_, — это теги, разработанные непосредственно с использованием языка CFML и представляющие из себя файлы с расширением cfm;
  • Теги, имена которых начинаются с приставки CFX_, разработанные на Java или C++.

Создание CF-тегов

Как уже было отмечено, CF-теги создаются на основе CFML-страниц и их имена записываются с приставкой CF_. Например, для вызова тега, размещенного на странице MyFirstTag.cfm, необходимо использовать следующую конструкцию:

<CF_MyFirstTag>

При вызове тега также можно передавать значения переменных в качестве атрибутов:

<CF_MyFirstTag Value="Number">

Примеры кода

Простейший пример кода

Рассмотрим пример создания страницы с использованием CFML:

<HTML>
<HEAD>
	<TITLE>Welcome</TITLE>
</HEAD> 
<BODY>
	<STRONG>Welcome!<STRONG>
	<!--- Установка переменной FirstName--->
	<CFSET FirstName="Anjuta">
	<!---Вывод на экран--->
	<CFOUTPUT>
		Dear #FirstName, thank you for your interest in CFML.
	</CFOUTPUT>
</BODY>
</HTML>

Здесь мы создаем переменную с именем FirstName и задаем значение, равное "Anjuta" и выводим на экран содержимое тега <CFOUTPUT>, в нашем случае текст "Dear ", затем помещаем значение переменной FirstName и далее фразу ", thank you for your interest in CFML."

Запрос к базе данных

Создадим запрос к базе данных который откроет сеанс по заказу билетов на существующие круизы. Предположим, что при регистрации электронный адрес в то же время является входным именем пользователя (Login ID). В этом случае требуется создать диалоговую форму для ввода электронного адреса и пароля потенциального путешественника для последующей проверки наличия регистрации данного покупателя. Тогда сам запрос будет выглядеть следующим образом:

<CFQUERY NAME="VerificatioriTra" DATASOURCE="Traveler.db">
	SELECT key_traveler, FirstName_traveler, LastName_traveler, EMail_traveler, Gender_traveler
	FROM Traveler WHERE EMail_traveler = '#Form.EMail#'
	AND Password_traveler = '#Form.Password#'
</CFQUERY>

где Form.EMail и Form.Password — переменные формы, предварительно заполненные пользователем.

Использование пользовательских тегов

Создадим пользовательский тег по преобразованию температуры воздуха из значений по шкале Цельсия (С) в градусы по Фаренгейту (F) и наоборот. Предварительно для данного примера определим синтаксис нового тега:

<CF_TemperatureTransform
    Value="Number" [CtoF="Boolean"]>

где Value — числовое значение, требуемое для преобразования; CtoF — логическое значение, указывающее направление преобразования. Причем атрибут Value является обязательным в отличие от атрибута CtoF. По умолчанию направление преобразования происходит из (С) в (F) впрочем, так же, как и при указании атрибута равным 1, Yes, True или просто при упоминании данного атрибута без указания значения. Теперь, когда задача определена и сформулированы все условия, можно написать страницу TemperatureTransform.cfm

<!--- Изменение температуры --->
<CFIF isDefined("Attributes.Value")>
    <CFIF isDefined("Attributes.CtoF")>
        <CFIF isNumeric(Attributes.Value) AND isBoolean(Attributes.CtoF)>
            <CFIF YesNoFormat(Attributes.CtoF) equal "Yes">
                <CFSET Caller.Temperature = Attributes.Value*1.8+32 &amp; " F">
            <CFELSE>
                <CFSET Caller.Temperature = (Attributes.Value-32)*5/9 &amp; " C">
            </CFIF>
        <CFELSE>
            <CFSET Caller.Temperature = "Error1">
        </CFIF>
    <CFELSE>
        <CFSET Caller.Temperature = Attributes.Value*1.8+32 &amp; " F">
    </CFIF>
<CFELSE>
    <CFSET Caller.Temperature = "Error2">
</CFIF>

После чего остается только использовать новый тег. Например, так:

<CF_TemperatureTransform Value = "21">
<CFOUTPUT>Temperature: iVariables.Temperaturel</CFOUTPUT>

В результате будет выведена следующая строка:

Temperature: 69.8 F

Если есть необходимость преобразования в обратную сторону, можно применить наш тег следующим образом:

<CF_TemperatureTransform Value = "69.8" CtoF="No">
<CFOUTPUT>Temperature: #Variables.Temperaturel</CFOUTPUT>

Что позволит получить следующий результат:

Temperature: 21 С

В приведенном выше примере были использованы переменные атрибутов пользовательских тегов Attributes, позволяющие анализировать передаваемые атрибуты в теле пользовательского тега, и также применялись переменные источников вызова Caller для передачи переменных из шаблонов пользовательских тегов ColdFusion.

Применение языка

Несмотря на свою функциональность и множество преимуществ, ColdFusion должного распространения до сих пор не получил. Он продолжает использоваться опытными разработчиками со стажем, новички стараются обходиться без него и им это безусловно удается. Откровенно говоря ColdFusion – технология разработки, которая пока все же не может противостоять своим конкурентам.

Полезные ссылки

Сайт проекта: http://www.adobe.com/ru/products/coldfusion-family.html Мануал по языку: https://helpx.adobe.com/support.html#/product/coldfusion