Теория и практика построения баз данных (1088289), страница 134
Текст из файла (страница 134)
Более того, страницы выполняются одним из потоков Тотсаг, а не независимым процессом. Это означает, что для выполнения ТЯР-страницы требуется гораздо меньше памяти и процессорного времени, чем для выполнения сравнимого по функциональности СС1-сценария. Примеры 48Р-страниц В этом разделе описываются две простые (ЯР-страницы. Первая страница пред- ставляет собой !ЯР-версию класса Вепега!ТаЬ!е, показанного в листинге 16.1. Вто- рая реализует логику работы метода 1пзегГОа!а (листинг 16.2) в классе дача Ьеап, который затем вызывается из другой )ЯР-страницы. Запрос чбР-страницы Отклик ЗВР-страницы Рио. 1б.2. Процесс компиляции ЗВР-страницы нродОля<книеи> Оегтега!ТаЫе4вр В листинге 16.3 изображена!ЯР-страггица, выводящая содержимое любой таблицы из базы данных Му5() Т.
под названием чг!. Эта страница по своему формату и логике работы очень напоминает страницу Ое пега!ТаЬ!е. азр в листинге рис. 1ЯА. Предполагается, что пользователь передает странице иия таблицы в качестве параметра. Листинг 1В.З. Страница Сепега!Таб!е.!зр <!ООСТТРЕ НТМС РОВС!с "-/!ИЗСГ!ОТО НТМС 4.0 Тгаяз1Г1опа1ОЕИ"> <!-- Ехагр1е оГ ОасаЬазе Ассезз Тгоп а 05Р Раде --> <$9 раде 1арогг="зача.зо1.*" Ж> <НТМС> <НЕАО> <Т1ТСЕ>ТаЬ)е Отзр1ау Оз1пд ГРОВС апо Му5ОС</Т1ТЕЕ> <МЕТА ИАИЕ="ацьпог" СОИТЕИТ="Оачгд КгоепИе"> <МЕТА МАМЕ="кеуиогбз" СОИТЕИТ="СЯР, ООВС, ОатаЬазе Ассезз"> Зача беп/ег Рацез 623 5тлС. с1озе() сопл. с1азе() // П Очистка гз.
с1азе() : 622 Глава 1б. З()ВС, Зача Яегчег Радев и ддуЯОС Листинг 18.3 (продолжение) <МЕТА ИЯМЕ=тйезсг!рстоп" СОИТЕНТ-Гдп ехавр1е ат а!яр)ау!пд а Саб)е из!ад З5Р."> <С!НК КЕС=5ТУЕЕ5НЕЕТ НЙЕГГ"05Р-5Су1ез.сзз" ТУРЕ="СехС/сзз"> </НЕАО> <ВООУ> <Н2>0аСаЬазе Лссезз Ехавяр1е /Н2> <Ж, 5СЫ пд чагТаЬ)еНа!ле= гециезС.деСрагал!еСег ("Таа)е") ; чагТаа)еИане = чагТаа)енаве.СоиррегСазе(); Ж> <НЗ>5лои!лд Оа(а Тгол Му50С ОаСаЬазе чг1</НЗ> <Ж Сгу ( П Загрузка драйверов ЗОВС Марка Мэтьюса С1азз.гагНатве ("агд.д)С,вп! в!узц1.0г!чег").пеи!пзсапсеО // Устанавливаем соединение с базой данных чг) как пользователь аК1 5сг!пд сапп5сг!пц = "заьс ивузц1://1оса)ьазс/" + "чг1" + "?изег=ак1"; Саппест!оп сопл - ОгтчегМападег деССаппесС!'оп(сопп5Сг!пд), П Получаем гз и гзМеСа для оператора 5ЕЕЕСТ 5Сател!епС зСл!С = сапп.сгеаСе5СаСенепС (); 5Сгтпд чагВОС = "5ЕЕЕСТ * ГНОМ " + чагтаЬ)еИа!ле: Йези1С5еС гз = зСл!С.ехеситеОиегу (чаг5ОС); Кези1С 5еСМеСаОата гзиеСа = гз.цеСМеСаОаса () , Ж> <ТДВСЕ ВОКОЕЙ=1 ВОСОСОК=!(ттттгт СЕСС5РДС!НО-5><ГОНТ ГАСЕ=ГДг!а)" СОСОК У000000 ><СЯРТ!ОИ><В <Ж=чагТаЬ)еНа!ле Ж></В></СДРПОИ></ГОНТ> <ТНЕЯО><Ж 5СЫ пд чагСо1Масез =""; тпС чагСа1СаипС = гзМеСа.деССо1ив(пСаипС (); Саг (тпС са1 =1; со1 <= чагСо1СаипСО: со1 -) Ж> ТН ВЯСОСОЙ=(!сцсОс0 ВОЙОЕКСОЕОЙ=()000000 ГОНТ 5!ЕЕ=2 ГАСЕ ="дг!а1" СОСОК=0000000 Ж-гзМеСа.деССо1ил!пда(ле(са1)Ж /ГОНТ>()пазр: </ТН> <Ж )Ж> </ТК> </ТНЕДО> <ТВООУ><Ж иКп )е Егз.лехе ()) ( Ж><ТЙ иДС1ОИ-.ТОР><Ж Таг (тлС со) - 1: са1 <= чагСо1СоипС: са1 .+) Ж><ТО ВОЙОЕКСОЕОК=УСОСОСО КРОИТ 512Е=2 ГАСЕ-Гйг!а1" СОСОК КО00000 ><Ж=гз.деС5Сг!пд(са1)Ж ВЙ /ГОНТ></ТО> <Ж сатсл (С1аззМоСГоипаЕхсерСтоп е) ( аиС.ргтпС1пГ'Ог!чег Ехсерстоп " + е) )Ж> </ТК> </ТВООУ> <ТГООТ</ТГООТ> </ТДВСЕ> </ВОВУ> </НТМС> На рис.
16.3 показаны результаты вызова этой страницы из браузера !псегпеС Ехр!огег на компьютере под управлением %)пт(атчз 2000. Сама страница обрабатывалась Тощса( на компьютере под управлением Е)пих. Обратите внимание на вызов порта 8080: в коммерческой системс То!ноас работал бы вместе с Арасйе иа заданном по умолчанию порте 80. и указывать номер порта не требовалось бы.
Рис. 16.3. Результат вызова страницы Оепега(таые В листинге 16.3 весь )ача-код выделен красным цветом. Первая строка вызывает каталог страниц, загружая библиотеку)ача.вц!. Затем с помощью метода деСРагалтетет НТТР-объекта гедиезС считывается параметр, содержащий имя таб- чача Зегчег Радев 625 51гтпд пеийвще - "цпйпаип": 51г1пд пеидгеаСаае = "": 5ьг)пд пеиСоса1йащЬег - ""; 5тщ пд пеийа11опа11ту = ""; рв ча1е ргт чате ргт ча1е ргтчате рць)тс 5тщпд деспеииаще[) ( гетцгп [пеийаще); Сптв,пеийаще = "цпцпоип"; рца)тс 5$в пд дегпеиЯгевСоае Г) ( ге1агп [пеидгеаСоае); ) рцЬ)тс с1авв Савтащег!пвегтдевп ( ородолжениеох 624 Глава 16. о[)ВС, дача Яегчег Радев и ЛдуЯС)С лицы.
Полученная строка преобразуется в строку верхнего регистра. Далее загружаются классы )Г) ВС, как зто делалось в листинге 16.1, и создается соединение с базой данных чг1 для пользователя бй1. Остальной код тот же, что и в листинге 16.2, — он просто разбросан среди операторов НТМГ., используемых для вывода результатов, Опять-таки, эта страница кажется обманчиво похожей на свою АБР-версию, бепега!ТаЬ[е.авр, приведенную в главе 15. Разница заключается не только в том, что вместо АГ)О и ОВВС используется )Г)ВС.
Более важно то, что эта страница будет скомпплирована в )ача-программу, а следовательно, станет переносимой и заработает быстрее. Сив1огпег!пвег10вдпдВеап.гавр Поскольку в ) 5Р-странпцах используется )ача, разработчик имеет в своем распоряжении всю мощь полноценного объектно-ориентированного языка программирования. Это означает, что)ЯР-страницы могут вызывать предварительно скомпилированные объекты. Это важно и полезно по множеству причин.
Во-первых, это отделяет друг от друга задачи написания программной логики и генерации НТМГ.-кода. Таким образом, в организации работа над этими двумя существенно различными задачами люжет быть поручена двум разным группам. Во-вторых, это позволяет реализовывать логику в независимых модулях с возможностью их повторного испол»зования, а также обеспечивает многие лругие преимущества, связанные с инкапсуляцией. Наконец, это уменьшает сложность поддержания сайта.
(Если вы не являетесь )ача-программистом, можете пропустить следующий абзац. Что касается классов дача Ьеап — просто вообразите себе)ача-класс с примерным поведением, который не стыдно показать мамочке.) Говоря простым языком, класс дача Ьеап — зто класс, обладающий тремя свойствами. Во-первых, у него нет открытых (рцЬГ[с) переменных.
Во-вторых, обрагцение ко всем постоянно хранимым значениям происходит с помощью методов с названиями вида дегххх и ве[ххх. Например, значение вууа[це считывается с помощью метода де1вуЧа[це() и задается с помощью метода ве1вууа[це(). В-третьих, класс Зача Ьеап должен либо не иметь конструктора вообще, либо иметь один явно определенный конструктор без аргументов.
В листинге 16.4 показан класс )ача Ьеап под названием Сцв[овег[пвет1[)в[пдВеап. Этот класс имеет метод, реализующий логику работы процедуры Сов[свет[олег[ базы данных галереи Ч[етч й[бде (да, зто опять она! Но в последний раз). Этот класс имеет четыре постоянно хранимых значения пеийаве, пег АгеаСобе, пеьчСоса[йцвЬет и печкйа1[опа[[гу. Для каждого из этих значений определены два метода доступа — детХХХ и ве1ХХХ. У класса нет ни открытых постоянно хранимых значений, ни конструктора.
Следовательно, класс Сцв1овет[пветь0в1пдВеап удовлетворяет определению класса )ача Ьеап. Листинг 16.4. Класс Сцв1огпег[пвег[Вевп тщрогт .)ача.1о.*; щрогт дача.вц1.*, !** класс дача ьеап для процедуры сцвтощег!пвегт базы данных чтеи к!аде. Доступ к постоянныи значениям осуществляется с поиощью иетодав дегххх и ветххх.
Процедура добавляет нового клиента, если ега еще нет в базе данных, а затеи ассоциирует его со всеии художникаии выбранной национальности. * вставляя соответствующие строки в таблицу пересечений. *) раа)1с чета ве1пеийаще [5ьг~пд пеийаще) ( 11 Гпеийаще != пц11) ( Сйтв.пеийаще = пеийаще; ) е1ве ( раа)тс кота ве1пеиАгеаСаае [51впд пеидгеаСоое) ( тт [пеиАгеаСоае !=па11) ( 1птв пеидгеаСоае = пеидгеаСоае; е1ве ( СЬ1в.пеийаще = "" риа)1с 5тгтпд деспеиСоса1йцщаег Г) гесцгп Гпеи[оса1йцщбег); раЬ1тс уота ветпеиСосв1йсщЬег [51г1пд пеиСоса1йцщаег) ( 11 ГпеиСоса1йцщЬег != пц11) ( татя.пеиСоса1йцщаег = пеиСоса1йцщаег; е1зе ( тптв.пеийаще = ""; 626 Глава 16. ЗЕВС, Зача Зетчег Радев и ВДУЯОЕ Зача 8ептег Радев 627 Листинг 16.4 (продолжение) риЫтс 5бгтпд деьпешМа(1опа1тфу () ге!игл (пешнатпопа11(у); риЫ тс чотб ветпешнатзопа1тту (5вг1пд пешдав1опа)тву) (.
(пеидаппопа11ту ! пи11) татя.пешдаттопа11ту = пешлаттопа1)ВУ, ° ( тлтз.пешМаве = риЫ тс 5тгт'пд !пзегтОа(а() вгу ( О Загрузка драйверов ЗОВЕ Марка Мэтьюса О вв,вузд1.ЗЬЬс-! 2с С1аэз,погшаве ("огд.д) .вв.вузо1.0гтчег") .пеш!пв(апсе () // Устанавливаен соединение с базой данных чг1 как пользователь бк), // без пароля 5тгтпд сопп5тгт'пд = "ЗДЬс вузц1://1оса1лозв/" . "чг1" ' "?изег-ЬК1"; Соппесттоп сопл - ОгтчегНападег,детСоппест1оп(сопп5шгтпд) ; // Соединение установлено. Далее идет проверка на дублирование данных.
5ватевеп! втвт = сопл.сгеа(е5татевепт ( ) ; 5тг1пд чаг50Е = "5ЕЕЕСТ Маше ", 5(гппд чагдпеге = 'ц ВОН СО5ТОНЕК КИЕВЕ Маше= '"; чагшлеге = чагшпеге ~ пешнаве + "' АМО АгеаСобе = '" ; чагилеге = чагМЛеге + пешАгеаСобе + "' АМО Рлопеципоег чагНПеге = чагЖеге + пеиСаса1МивЬег ~ "'": чагЩ = чаг50Е ~ чагылеге, Мези1т5ет гз = заев!.ехеси(еОиегу (чаг50Е) ; шЫ 1е (гз.пехь ()) ( // Икаются дублирующиеся данные. гв.с1ове() звало.с1озе() ; сопл.с1озе(): геьигп (" Данные дублируются - никаких действий не предпринято "); // Все в порядке, теперь ножно добавлять новые данные чаг50Е = "1МЗЕВТ !МТО СОВТОНЕМ (шаве, АгеаСобе, РлопеМивЬег) чаг50Е = чаг50Е + " ЧАЕОЕ5 ('" + пешцаве + "', чаг50Е = чаг50Е + пешдгеаСобе + "', чаг50( = чаг50Е + пеш~ оса1МивЬег + "')" ; тпв геви1! = зввт.ехеситедрбате (чаг50Ы .
тТ (гези1( == О) ( О Овибка при вставке гз.с1озе() зтвв.с1озе(): оопп.с1озе(): ге!игл (" Ошибка при вставке"); // Обновление прошло Успешно; теперь нужно добавить строки в таблицу пе ний // Для этота лолучаеи идентификатор нового клиента чаг50Е '5ЕЕЕСТ Сиз човег!О ' + чагКеге гз = зввь.ехесите0иегу (чаг50Е); 5(гтпд чагСтб шЫ 1е (гз.пехь () ) ( чагС1с = гз .де(5тгт од(1 ) : 1Т (чагСтб -= "О" ) ( П Не удалось получить идентификатор нового клиента гз.с1озе(); зтвт.с1озе(); сопл.с1озе(): ге(игп ("Не удается найти нового клиента после вставки"); // Теперь добавляеи строки в таблицу пересечений чаг50Е = "5ЕЕЕСТ Агттвт!О РКОН АМТ!5Т ННЕМЕ Маттопа11(у - '" - пешМаттопа1т(у +"'"; 5ьгтпд чаг!пзегт5пагт = "!М5ЕЙТ !МТО СО5ТОНЕМ Акт!5Т 1МТ (Сизтовег!О. Агттзт!О) ЧАЕОЕ5 †)(" + чагСтб - ".