<cfinclude> как средство вставить код из внешнего файла
С самого начала мы знаем, что тег <cfinclude> предназначен для того, чтобы вставлять код из внешнего файла. Самым распространенным примером является использование верхней (header) и нижней (footer) частей сайта как подключаемых внешних файлов. Такие подключения мы делаем так: <cfinclude template="header.cfm">. Результатом будет то, что данный подключаемый файл header.cfm будет в начале каждой страницы. Если нам понадобиться изменить все верхние части сайта, то достаточно отредактировать всего лишь один файл header.cfm и изменения будут видны сразу на всех страницах.
Возможно, вы также знаете, что основной и подключаемый файлы имеют доступ к одним и тем же контейнерам переменных. Например, если мы в основном файле main.cfm определим переменную name: Затем, в подключаемом файле included.cfm переопределим ту же переменную: В результате основной файл выведет на экран имя Ольга.Большинство программистов знают об этом и используют как само собой разумеющееся. Это говорит о том, что код из подключаемого файла included.cfm сначала вставляется в основной файл main.cfm и только потом основной файл main.cfm обрабатывается. Поскольку по такому принципу построен механизм подключения файлов и в других языках, то будет логично предполагать, что точно так же это работает и в CFML.
Но подключение файлов в CFML отличается от других языков. Если бы код из подключаемого файла просто вставлялся бы в основной файл, то мы могли бы открыть тег в основном файле и закрыть его в подключаемом файле. Но это невозможно сделать. Кроме того, если сделать изменения в подключаемом файле, то, чтобы увидеть изменения будет перекомпилировать только подключаемый файл, а основной файл не будет затронут.Вы сами можете посмотреть, как и где CFMX создает откомпилированные Java классы. В Windows откройте папку cfusionmx\wwwroot\WEB-INF\cfclasses. По-умолчанию все компилируемые файлы хранятся здесь.
Еще одно доказательство необычности тега <cfinclude> заключается в том, что мы может устанавливать подключаемый файл динамически. Да, подключаемый фал может быть переменной!<cfinclude> как инструмент вывода обработанного кода
Как мы уже поняли, тег <cfinclude> не просто получает код из внешнего файла. Код сначала обрабатывается, а потом вставляется в основной файл. Но, что если нам нужно подключить не CFML файл? Можем ли мы подключить, например, XML файл? Конечно! Подключая файл, мы вставляем не код, а то, что возвращает подключаемый файл.
Некоторые подключаемые файлы могут неправильно отображаться, пока мы не укажет соответствующий им MIME тип. Вот пример: Если у вас возникают проблемы с отображением этого файла в Internet Explorer’e, то попробуйте запустить тот код под Netscape’ом. Дело в том, что IE пытается обработать подключаемый XML файл, используя свои встроенные стили. Если отображаемый результат не является чистым XML, то IE вообще не покажет страницу.<cfinclude> как инструмент передачи содержимого
Если мы может подключать XML файлы, то тег <cfinclude> предназначен для работы не только с кодом. Как насчет подключения PDF файлов? Конечно и это сработает, если сначала вы укажите правильный MIME тип:
Многие спросят: «Зачем в данном примере использовать тег <cfinclude>, если вызываемый файл можно указать прямо в атрибуте file тега <cfcontent>?». Между двумя этими способами подключения внешнего файла существует, по крайней мере, одно отличие:В атрибуте file тега <cfcontent> следует указывать абсолютный путь к файлу (имя диска/папка/файл), а в атрибуте template тега <cfinclude> следует указывать относительный путь (здесь также можно использовать маппинг). Кроме того, тег <cfcontent > позволяет указывать MIME тип прямо в теге и это останавливает дальнейшую обработку страницы. Безусловно, тег <cfcontent> имеет свои преимущества, но, если они вам не подходят, то тег <cfinclude> будет хорошей альтернативой.
<cfinclude> как альтернатива тегу <cffile>
А что, если мы используем тег <cfinclude> как способ считывания текстового файла, предварительно окружив его тегами <cfsavecontent>? Будет ли это означать то же самое, что и <cffile action=”read”>? Да. Вот пример:
Конечно, есть еще и другие способы считывать файл: тег <cfhttp> или Java классы. В этом не ничего особенного, но многих может удивить.Обрабатываем Application.cfm в подключаемых файлах
Когда вы вызываете подключаемый файл или пользовательский тег, то эти внешние файлы не обрабатывают относящиеся к ним файлы Application.cfm и OnRequestEnd.cfm. Но бывают случаи, когда хочется, чтобы они обрабатывали эти файлы.
В документации по CFMX можно найти функцию, которая позволяет подключать внешние JSP файлы в CFML файлы. Пример выглядит так: getpagecontext().include(“mypage.jsp”). Но таким способом можно подключать не только JSP, но и CFML файлы. Таким образом, если мы вызовем файл напрямую, то он подключиться как обычная CFML страница, предварительно обработав все относящиеся к нему файлы Application.cfm и OnRequestEnd.cfm.Заключение
В любом случае, используете ли вы CFMX, CF 4, CF 5 или BlueDragon, надеюсь, что вы узнали из этой статьи много интересного.
Мы узнали, что тег <cfinclude> не просто средство для включения кода из внешнего файла. Он открывает двери к интересным сходствам с тегами <cfcontent> и <cffile>. А также, мы узнали, что можно подключать внешние файлы напрямую, как обычные CFML страницы, которые предварительно обрабатывают относящиеся к ним файлы Application.cfm и OnRequestEnd.cfm.
© 2002-2005 г. Вадим Пушкарев