Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Включение в шаблон других шаблонов



По мере усложнения приложений, разрабатываемых с использованием 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-команд, включая:

  • INSERT — добавление записи в таблицу.
  • UPDATE — модификация записи в таблице.
  • DELETE — удаление записи из таблицы.

Использование непосредственно команд 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 дискового пространства. На базовом сервере должны быть установлены:

  • операционная система семейства Unix;
  • WWW-сервер;
  • сервер баз данных Oracle или сетевой стек Oracle SQL*Net с возможностью доступа к удаленному серверу баз данных Oracle.

Этап I

В случае, когда пакет поставляется в виде исходных текстов, необходимо произвести компиляцию и сборку исполняемого модуля wowstub. При сборке wowstub необходимо использовать библиотеки установленного сервера Oracle или сетевого стека SQL*Net. Компиляция и сборка производится утилитой make на основании данных файла Makefile. Вам необходимо изменить ряд параметров Makefile для настройки на вашу конфигурацию Oracle и Unix:

  • ORACLE_HOME — должен совпадать с каталогом, определенным переменной ORACLE_HOME сервера Oracle.
  • DEST_DIR — должен указывать на каталог, хранящий CGI-модули вашего WWW-сервера.
  • DOC_ROOT — должен указывать на каталог в котором будет размещена документация по WOW. Каталог должен быть доступен для WWW-сервера.

Этап II

Независимо от сборки wowstub, необходимо создать ряд структур данных в БД Oracle.

  1. Создать пользователя, через которого WOW будет осуществлять доступ к данным и исполнение рабочих процедур. Обычно используется имя WWW.
  2. Создать из под вышеупомянутого пользователя все необходимые структуры данных и примеры. Для этого необходимо исполнить следующие SQL файлы, идущие в дистрибутиве WOW:
  • wow.sql
  • ht.sql
  • math.sql
  • emp.sql
  • showemp.sql
  • hanoi.sql.

Исполнить эти файлы можно с использованием одной из следующих утилит:

  • SQL*Plus
  • SQL*DBA
  • Server Manager
  • Enterprize Manager.

Этап III

Необходимо поместить модуль wowstub в каталог CGI программ вашего WWW-сервера. Необходимо переопределить ряд параметров файла wow, представляющего собой скрипт sh:

  • ORACLE_HOME — в соответствии с параметром ORA-CLE_HOME вашего сервера Oracle или стека SQL*Net;
  • TWO_TASK — в соответствии с параметром TWO_TASK клиентской части вашего сервера Oracle;
  • WOW_UID — в соответствии с именем пользователя и его паролем, созданными на этапе II установки.

Отредактированный файл wow необходимо поместить в каталог для CGI-программ вашего WWW-сервера.

Использование

Рассмотрим простейший пример с использованием пакета WOW. При обращении к WWW-серверу www.cnit.nsu.ru по URL:

http: //www.cnit.nsu.ru/cgi-bin/wow.win /example.test? answer=no

происходит следующая цепочка действий:

  • WWW-сервер интерпретирует это обращение как запуск CGI-программы wow.win.
  • Программа wow.win интерпретирует параметры как вызов процедуры test пакета example с параметром answer, имеющим значение no, созданной в схеме WWW сервера Oracle.
  • Сервер Oracle исполняет эту процедуру и все процедуры и функции, вызываемые из нее. Выходные данные, представляющие динамически созданный HTML-документ, передаются программе wow.win.
  • Программа wow.win перекодирует выходной документ в кодировку Microsoft CodePage 1251, используемую в Windows-приложениях, и передает его WWW-серверу.
  • WWW-сервер возвращает созданный документ, как результат запроса, WWW-клиенту. URL, обращающийся к процедуре PL/SQL должен быть построен по определенным правилам и содержать ряд элементов:
  • Указатель на модуль пакета WOW, находящийся в каталоге CGI-программ.

Расширение программы wow .koi8,.win,.iso,.alt определяет кодировку WWW-клиента:

  • КОИ-8
  • Microsoft Code Page 1251
  • ISO 8859-5
  • Microsoft Code Page 866

Например:

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>


Поделиться:



Популярное:

  1. V. УЧАСТИЕ В СОРЕВНОВАНИЯХ И ДРУГИХ МЕРОПРИЯТИЯХ
  2. VI. Выберите подчинительный союз, с помощью которого стиль и смысл высказывания передается точнее других.
  3. А теперь предлагаю вам вернуться к главе 3 – к списку других видов посреднической деятельности. Думаю, вас посетит множество новых идей.
  4. А. Основные отличия вирусов от других живых организмов.
  5. Автоматическое включение генераторов на параллельную работу. Способы включения генераторов, уравнительные токи и моменты
  6. Анализ технико-организационного уровня и других условий производства
  7. АСТРАЛЬНЫЕ МЕХАНИЗМЫ ПЕРЕКЛАДЫВАНИЯ СВОЕЙ ВИНЫ НА ДРУГИХ
  8. В других организациях один раз в три года проводятся объектовые тренировки (ОТ) продолжительностью до восьми часов.
  9. В чем отличие способа шликерного формования от других?
  10. Вас или других можно подвести под какую-нибудь категорию
  11. Вид практики, место прохождения, оценка, отчет о практике, сканы благодарственных писем или других документов.
  12. Включение (выключение) строки состояния


Последнее изменение этой страницы: 2017-03-03; Просмотров: 554; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.055 с.)
Главная | Случайная страница | Обратная связь