Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Включение в шаблон других шаблонов
По мере усложнения приложений, разрабатываемых с использованием Cold Fusion, появляется необходимость упростить используемые шаблоны. Одним из способов решения этой проблемы, предлагаемых в Cold Fusion, является выделение из шаблонов часто используемых блоков, таких как запросы и области вывода, и их многократное использование в других шаблонах. Для включения часто используемых шаблонов в другой шаблон, используется тэг DBINCLUDE. Тэг DBINCLUDE может быть расположен в любом месте шаблона, кроме как в тэгах DBQUERY, DBOUTPUT и DBTABLE. Тэг DBINCLUDE имеет атрибут TEMPLATE, который задает путь до файла с шаблоном. Этот шаблон будет обработан Cold Fusion как часть основного шаблона (то есть, в нем могут использоваться запросы, уже запущенные в основном шаблоне, а также ссылки на параметры формы, URL и CGI). Приведем пример включения в шаблон шаблона с именем test.dbm: < DBINCLUDE TEMPLATE=" test.dbm" > Определение типа данных MIME для содержимого документа Cold Fusion позволяет задавать тип MIME для данных, которые будут отправлены пользователю из текущего шаблона (по умолчанию используется text/html ). Для этого используется тэг DBCONTENT, имеющий единственный атрибут TYPE, который, собственно, и задает тип данных. Например, чтобы отправить клиенту VRML-документ может использоваться следующий шаблон: < DBCONTENT TYPE=" x-world/x-vrml" > < DBQUERY NAME=" GetCyberRoom" SQL=" SELECT VRML_Script FROM CyberRooms WHERE RoomNumber=#URL.RoomNumber#" > < DBOUTPUT QUERY=" GetCyberRoom" > #VRML_Script# < /DBOUTPUT> Заметим, что Cold Fusion не будет отправлять клиенту текст, расположенный до тэга DBOUTPUT. Расширенные возможности Динамическое определение SQL выражения В некоторых сложных приложениях может потребоваться, в зависимости от значений параметров, определять не только содержание запроса, но и его структуру. В Cold Fusion предусмотрен тэг DBSQL, который может употребляться внутри тэга DBQUERY, доопределяя SQL-выражение, в зависимости от значений параметров. Тэг DBSQL имеет единственный атрибут SQL, значение которого будет добавляться к основному SQL-выражению. Пример < DBQUERY NAME=" SiteSearch" DATASOURCE=" Sites Database" SQL=" SELECT * FROM SITES WHERE SiteType = #SiteType# " > < DBIF #Form.City# is not " " > < DBSQL SQL=" AND City = '#Form.City#' " > < /DBIF> < DBIF #Form.SortOrder# is not " " > < DBSQL SQL=" ORDER BY #Form.SortOrder# " > < /DBIF> < /DBQUERY> Поддержка транзакций Для объединения нескольких запросов в одну транзакцию может быть использован тэг DBTRANSACTION. Все запросы, содержащиеся внутри этого тэга, будут интерпретироваться как одна транзакция. То есть все изменения, сделанные в базе данных, либо будут одновременно сохранены, либо не будет сохранено ни одно из них. Приведем пример, в котором денежная сумма переводится с одного банковского счета на другой: < DBTRANSACTION> < DBQUERY NAME=" WithdrawCash" DATASOURCE=" Bank Accounts" SQL = " UPDATE Accounts SET Balance = Balance — #Amount# WHERE Account_ID = #AccountFrom# " > < DBQUERY NAME=" DepositCash" DATASOURCE=" Bank Accounts" SQL = " UPDATE Accounts SET Balance = Balance + #Amount# WHERE Account_ID = #AccountTo# " > < /DBTRANSACTION> Заметим, что не все драйверы ODBC поддерживают транзакции. Например, драйверы для Oracle, SQL Server и Access поддерживают транзакции, а драйверы для FoxPro, dBase и Paradox — нет. Вложенные области вывода и группирования Тэги DBOUTPUT могут вкладываться друг в друга, с целью сгруппировать области вывода. Группирование достигается с помощью использования атрибута GROUP в тэге DBOUTPUT, который содержит другой тэг DBOUTPUT. Этот атрибут определяет поле, по которому будет производится группирование. Внешний тэг DBOUTPUT обычно используется для вывода заголовка группы, а внутренний — для вывода записей, содержащихся в группе. Приведем пример вывода сотрудников организации, сгруппированных по отделам: < DBQUERY NAME=" ListEmployees" DataSource=" Employees" SQL=" SELECT * FROM Emp ORDER BY Department" > < DBOUTPUT QUERY=" ListEmployees" GROUP=" Department" > < P> < H2> #ListEmployees.Department#< /H2> < UL> < DBOUTPUT> < LI> #FullName# ## < /DBOUTPUT> < /UL> < /DBOUTPUT> Обратим внимание на то, что если поле используется для группирования, то результат запроса должен быть отсортирован по этому полю. Если используется многоуровневое группирование (ограничений на количество уровней вложенности тэгов DBOUTPUT нет), то соответственно в SQL-выражении должна быть задана многоуровневая сортировка (например, ORDER By Country, Region ). Использование списочных полей с множественным выбором Если HTML-форма содержит поле типа SELECT с множественным выбором, либо поля с одинаковыми именами (например, поля типа checkbox ), то данные будут переданы в шаблон в виде списка значений, разделенных запятыми. Такая форма представления наиболее удобна для использования в операторе IN языка SQL. Пример Предположим, что в форме содержится поле: < SELECT NAME=" SelectedPersons" MULTIPLE SIZE=" 3" > < OPTION VALUE=" 1" > Иванов И.И. < OPTION VALUE=" 2" > Петров П.П. < OPTION VALUE=" 3" SELECTED> Сидоров С.С. < /SELECT> Этот параметр, переданный в шаблон, может быть использован в следующем SQL-выражении: SQL=" SELECT * FROM Persons WHERE Person_ID IN ( #SelectedPersons# ) Следует обратить внимание на то, чтобы параметр, который используется в операторе IN, был не пуст. Для этого можно, пользуясь стандартными средствами Cold Fusion, описать поле как требуемое, либо использовать поле типа HIDDEN с тем же именем и с заведомо неверным значением. Например, предыдущий пример можно дополнить следующим полем: < INPUT TYPE=" HIDDEN" NAME=" SelectedPersons" VALUE=" -1" > Дополнительные команды SQL В тэге DBOUTPUT, кроме выражения SELECT языка SQL, допускается использование и любых других, допустимых для конкретного источника данных, SQL-команд, включая:
Использование непосредственно команд SQL вместо тэгов DBIN-SERT и DBUPDATE в некоторых случаях может обеспечить большую гибкость и эффективность. Например, при модификации или создании новой записи, появляется возможность использовать все параметры и переменные, доступные в шаблоне, в том числе и результаты определенных в шаблоне запросов. Глава 5. Использование пакета Web-Oracle-Web (WOW) Пакет WOW предназначен для использования под ОС Unix. Пакет предназначен для обработки запросов от WWW-сервера (Web) к SQL-серверу Oracle (Oracle) с генерацией динамических HTML-документов (Web). Разработчик приложений, использующий WOW оперирует только с родным языком Oracle — PL/SQL, являющимся процедурным расширением языка SQL. Это обуславливает высокую эффективность разработки приложений. Обработка созданных приложений непосредственно в сервере Oracle определяет высокую скорость исполнения приложений. Основная идея пакета WOW — преобразование запроса к WWW-серверу в вызов определенной процедуры PL/SQL. В качестве параметров процедуры, используются данные из запроса к WWW-серверу. Кроме этого, язык PL/SQL дополняется функциями вывода различных данных в формате HTML. Состав Структурно, WOW состоит из ряда исполняемых программ, соответствующих спецификации CGI и набора пакетов PL/SQL. Пакет htp содержит процедуры и функции, облегчающие формирование HTML-документа. Пакет htf содержит описание различных констант и функций, используемых при формировании HTML-доку-ментов. Установка ля корректной работы пакета необходимо правильно провести процедуру установки. Пакет WOW требует около 2Mb дискового пространства. На базовом сервере должны быть установлены:
Этап I В случае, когда пакет поставляется в виде исходных текстов, необходимо произвести компиляцию и сборку исполняемого модуля wowstub. При сборке wowstub необходимо использовать библиотеки установленного сервера Oracle или сетевого стека SQL*Net. Компиляция и сборка производится утилитой make на основании данных файла Makefile. Вам необходимо изменить ряд параметров Makefile для настройки на вашу конфигурацию Oracle и Unix:
Этап II Независимо от сборки wowstub, необходимо создать ряд структур данных в БД Oracle.
Исполнить эти файлы можно с использованием одной из следующих утилит:
Этап III Необходимо поместить модуль wowstub в каталог CGI программ вашего WWW-сервера. Необходимо переопределить ряд параметров файла wow, представляющего собой скрипт sh:
Отредактированный файл wow необходимо поместить в каталог для CGI-программ вашего WWW-сервера. Использование Рассмотрим простейший пример с использованием пакета WOW. При обращении к WWW-серверу www.cnit.nsu.ru по URL: http: //www.cnit.nsu.ru/cgi-bin/wow.win /example.test? answer=no происходит следующая цепочка действий:
Расширение программы wow —.koi8,.win,.iso,.alt определяет кодировку WWW-клиента:
Например: http: //www.cnit.nsu.ru/cgi-bin/wow.win Имя процедуры PL/SQL, к которой происходит обращение. Модули пакета используют схему и регистрационные данные пользователя www БД Oracle. Таким образом, вызываемая PL/SQL-процедура должна быть доступна пользователю www на исполнение. Если процедура (test) создана прямо в схеме www, необходимо просто указать ее имя: http: //www.cnit.nsu.ru/cgi-bin/wow.win/test Если процедура входит в состав пакета (example), созданного в схеме www, необходимо добавить имя пакета и имя процедуры: http: //www.cnit.nsu.ru/cgi-bin/wow.win/example.test Когда пакет создан в другой схеме Oracle, необходимо указывать и имя схемы. Например, для схемы fancy получим: http: //www.cnit.nsu.ru/cgi-bin/wow.win /fancy.example.test Пользователь www должен иметь права на исполнение этой процедуры, явно предоставленные оператором GRANT языка SQL. После имени процедуры, через разделитель?, начинают перечисляться параметры процедуры и их значения в виде пар: < название_параметра> = < значение_параметра> Между собой различные параметры разделяются амперсандом ( & ): < название_параметра1> =< значение_параметра1> & < название_параметра2> = < значение_параметра2> Название параметра должно совпадать с названием параметра вызываемой процедуры. Число параметров должно в точности соответствовать числу параметров процедуры. Если хотя бы одно из этих требований не соблюдено, вы получите сообщение об ошибке. Порядок указания параметров значения не имеет. Большие и маленькие буквы в названии параметров равнозначны. Число реально передаваемых параметров может и не совпадать с числом параметров, указанных в спецификации процедуры. В этом случае, все опускаемые параметры должны иметь значения по умолчанию. Пример: http: //www.cnit.nsu.ru/cgi-bin/wow.win /example.test? answer=no Исходя из описанного механизма работы пакета WOW можно сформулировать основные требования к PL/SQL-процедурам, обрабатывающим запросы от WWW-сервера. Все входные переменные, передающиеся через WOW в процедуру, всегда имеют тип varchar2. Если вы хотите использовать какой-либо другой тип данных, необходимо использовать функции преобразования из varchar2. В пакете htp отсутствуют функции вывода начала и конца HTML-документа. Поскольку многие современные браузеры интерпретируют текст без обрамляющих тэгов < HTML> ... < /HTML> как переформатированный, необходимо прямо задавать эти тэги в начале и в конце документа. Пример пакета example: Create or Replace package example is procedure test(answer in Varchar2); end; / Create or Replace package body example is procedure test(answer in Varchar2) is ответ varchar2(3); cursor c_man(ans in varchar2) is select Фамилия from Результаты_опроса where Ответ=ans order by Фамилия; begin -- Начало документа htp.p('< HTML> '); -- Вывод названия страницы и заголовка if answer = 'no' then ответ: ='НЕТ'; htp.htitle('Фамилии людей, ответивших отрицательно'); else ответ: ='ДА'; htp.htitle('Фамилии людей, ответивших положительно'); end if; htp.olistopen; -- Начало нумерованного списка for man in c_man(Ответ) loop -- Элемент списка htp.item(man.Фамилия); end loop; -- Конец нумерованного списка htp.olistclose; -- Конец документа htp.p('< /HTML> '); end; end; / При этом подразумевается что в схеме WWW Oracle находится таблица примерно следующей структуры: Create table Результаты_опроса(Фамилия varchar2(30), Имя varchar2(14), Отчество varchar2(20), Ответ varchar2(3)); Обращаться к пакету WOW можно и из форм HTML. Ниже приведен пример обращения к тому же пакету example из простейшей формы. < HTML> < HEAD> < TITLE> Тестовая форма< /TITLE> < /HEAD> < BODY> < H1> Тестовая форма< /H1> < FORM ACTION=" http: //www.cnit.nsu.ru/cgi-bin/wow.win/example.test" > Введите ответ: < INPUT NAME=" answer" > < INPUT VALUE=" Найти" TYPE=" SUBMIT" > < /FORM> < /BODY> < /HTML> Популярное:
|
Последнее изменение этой страницы: 2017-03-03; Просмотров: 554; Нарушение авторского права страницы