Теория и практика построения баз данных (1088289), страница 127
Текст из файла (страница 127)
Мочейехт 1оорЖ> </ТВООУ> <ТГООТ></ТГООТ> </ТАВСЕ> </ВОВУ> <(НТМЕ> Первая часть серверного сценария имеет ту же самую функцию, что и в листинге 15.1. Единственное различие состоит в том, что обращение происходит к источнику данных Огас!е. Переменная чаг5т)! задается с помощью переменной чагтаЫейапте. Амперсанд (е ) — оператор, соединяющий две строки. Результатом этого выражения является следующая строка: 5ЕЕЕСТ * ГЙОМ С05ТОМЕЙ Примеры использования АОО 587 586 Глава 15. ООВС, ОСЕ ОВ, АОО и АВР Заметьте также, что имя таблицы включено в заголовок НТМ(.-таблицы с помощью кода САРТ10й «В %=чагТаЫейапге% /В ГСАРТ10й>. Код между символами % приведет к тому, что в заголовок НТМТ;таблицы будет вставлено значение переменной чагТаЫенапге.
Следующий фрагмент серверного сценария обрабатывает коллекцию аейз. Переменной чагг1цпгС011 присваивается значение свойства Сорос коллекции Р!е(бз, и затем элементы коллекции перебираются в цикле. Обратите внилгангге, каким образом НТМЕ разбросан в серверном коде (илп серверный код разбросан в НТМ(. — как вам больше нравится).
Ранее в переменную чагКеу1тапге бьио записано имя суррогатного ключа, н цикл проверяет, не совпадает ли имя текущего столбца с именем суррогатного ключа. Если нет, генерируется НТМ1.-код, создающий заголовок таблицы. Аналогичный цикл используется на следующей странице для заполнения таблицы значениями из набора записей. Преимущество этой страницы заключается в том, что она может обрабатывать любую таблицу, а не только какую-то конкретную. Фактически, если использовать введенную ранее терминологию, мы можем сказать, что страница в листинге 15.2 является абстракцией страницы из листинга 15.1. Результаты обработки этой страницы показаны на рпс, 15.10.
Столбец С05ТОМЕл10 не показан, как мы и ожидали. Рис. 1б.10. Результат обработки АЗР-страницы Сцз!огпегОгасГе.авр Пример 3 — чтение любой таблицы На рис. 15.11, а показана форма для ввода данных, куда клиент может ввести имя таблицы, которую следчет отобразить. (Более удачным было бы решение, нрп котором клиенту выдавался бы раскрывающийся список с возможными вариантамн выбора, но зто уводит нас от обсуждения АОО.) Пользователь ввел в форму имя агг1 зт.
Предположим теперь, что когда пользователь щелкает мышью на кнопке 5ггоиг ТаЫе (Показать таблицу), форма должна запустить сценарий на сервере, который отобразит содержимое таблицы АйТ15Т в том же сеансе браузера. Допус- тим также, что суррогатный ключ отображать не нужно. Желаемые результаты показаны на рнс. 15.11, б. 4 1Й: У *;Ф;: ~",'ф:ф; 0("',,фтттка гГВгйттсггтг)гг;ЬЗ1гаРЫнг У:...,г, ) *арте вп нгрчл ь ьм кири* рьгл 'кир г и. р !тра~',,:'!.)снег",'11 б Рис.
15.11. Отображение содержимого произвольной таблицы: в — форма для ввода имени таблицы; б — вид таблицы 888 Глава 15. 00ВС, ОСЕ 0В, А00 и АЯР Примеры использования А00 889 Для выполнения этой задачи требуются две АВР-страницьс. Первая, показанная в листинге 15.3, представляет собой НТМ[.-страницу, содержащую тег ГОРМ: <ГОРМ МЕТНОО="розЫ АСТ!ОИ-пВепега1таЫ е.азр"> Этот тег определяет на странице раздел формы; данный раздел будет содержать вводимые данные. В данной форме вводится только. один элемент данных— имя таблицы. Метод ровс — это НТМ[.-процесс, посредством которого данные из формы [в нашем случае имя таблицы агС(вс) передаются АВР-серверу и помещаются в объект под названием Гога). Альтернативным методом является Вес, при котором значения данных передаются в качестве параметров.
Это различие здесь для нас не слишком важно. Вторым параметром тета ЕОРМ является АСТ10М, значение которого — строка «белеса!ТаЫе.авр». Этот параметр предписывает ПЯ по получении отклика от формы передать файл Оепега!ТаЫе.азр на обработку АВР- процессору. Значения из формы будут помещены в объект Гопп. Листинг 15.3.
Код, выводящий содержимое произвольной таблицы 1/)еисГ))с)ОеТаЫез.аэр <НТМ[> <НЕАО> <метА нттР-е001ч="соптепс-туре" сОмтемт-"техт/ьса);сьагзеь-и1поонз-1252"> <Т!Т[Е>таЫе 01вр1ау Гога</Т1Т[Е> </НЕАО> <ВООУ> <ГОРМ МЕТНОО="резь" АСТ10Ис "Велега1ТаЫе. азр" > <Р><5ТКОИБ ГОНТ со1сг=рцгр)е Гасе-"" з)зе-5>впбзр: амбар; ТаЫе 01зр)ау 5е!ест(оп Еога</ЕОМТ /5ТРОИВ> <Р></Р> <Р>йпбзр;</Р> <Р><ГОНТ зту)е="ВАСКВРООИО-СОСОК: ()т/ГГГГ' ГОНТ со)ог-Гогезтсгееп Гасе-"" зту)е="ВАСКВКООИО-СОСОК: ()ТТТГГГ'>Еп1ег таЫейаае: /ЕОМт апьзр;апь р;апьвр,апьзр дпьзр, /ЕОИт /Р <Р></Р> <Р><ГОМт зьу) е-"ВАСКОРООИО-СОСОК ()ТТГГГТГГ'></ГОНТ>дпбзр; <1МРОТ 1с)=сехс1 паае=сех(1></Р> <Р><ГОИТ вту1е="ВАСКВРООИО-СОСОК: ))ттгт/Г'> <1ИРОТ 10-зцЫпзс) паае-зоба)т) суре=алба![ ча1це="5мон ьаЫе" >амбар;апбзрЯпбзр; <1ИРОт 1с)=гезет1 паае-гевес) суре=газет ча1це-="йезес ча1цез"></ГОмт></Р> </ГОКМ> </ВООУ> </НТМ[> Листинг 15.4.
Код, выводящий содержимое произвольной таблицы Оепега)ТаЫе,азр <НТМ<> <НЕАО> <МЕТА НТТР-ЕОО!с/-"Сопсепь-Туре" СОМТЕМТ-теехс/Ььа1.снагзес=и)пеона- 1252"> , <Т!Т[Е>таЫе 0)зР1ау Расе</Т1Т[Е> </НЕАО> <ВООТ> « --/)зпс)цс)е ч)гтца) = "1/1енйЕСОеЕхаар1е1/абочбв.1пс" <т 01а ЬЬОСолп. оЬ)йессг65еь, оЬОГ1е1с) 01а чагнцпСо)в. чаг!, чаг5ц! Оза чагтаЫ енаае.
чагйесого5е[Иаае. чагКеуМаае Оза чагтаЫенааеЕ)гвь, чагтаЫенааейезь чагТаЫепаае = Кесцезт. Гога ("сехт1") ' Формируем иня ключа как иия таблицы в нижнем регистре с заглавной первой буквой ь символы 10, чагтаЫ енааеЕ1гзь - ОСазе([етс(чагтаЫ ещаае, 1) ) чагтаыемааейевт = [сазе(К1длс(чагтаыеиаае, [ег(чагтаыеиаае)-1)) чагКеуМаае = чагтаЫеМааеЕзгвь 5 чагтаЫещааейезь $" 10" чагйесогс)5еСИаае = " гз " 5 чагтаЫ ейаае ' используем для сохранения указателя ' на набор записей 1( 1зОЬ)есС(5езз)сп(" сопл")) тлел 5еь сЬЗСспп = 5евз)сп(" сопл") Е1ве 5ет аЬ)Сопл = 5егчег.СгеатеОЬ)ест("АОООВ.соппесс(оп") оЬОСспп.1зс1аь1оп[ече1 = абХастйеас)Ссвопттеб ' избегаеи «грязногси чтения оьбсспп.преп "с/1еий)бйе55", "ва" 5ет 5езв1оп(" сопл") = оЬОСопп Епб 1Г 1Г !вОьбест(5езз)оп(чагйесогс5етиаае)) тлел 5еь оЬОйесогб5ет = 5езз)оп(чагйесого5етйаае) ' используен сохраненный набор ' записей, если зто возиожно оЬ)йесогб5ед.йесцегу Е1зе чаг5д) = "5ЕьЕСТ * ГРСМ " и "[" 5 чагТаЫеНаае 5 "!" ' Заключаем имя таблицы ' в скобки, если оно ' содержит пробелы и т.
и. 5ес оЬ)йесогс)5еь - 5егчег.СгеатеОЬ)ест("АОООВ.йесогсзеС") ' В спедующен операторе обратите внимание на использование типов курсора и блокировок Примеры использования А00 591 Епб !Г Ж> иагТаЫейаае = йециезт. Гога(ГЖехс!") <Ж оЬ)йесогб5ес.йочейехс 590 Глава 15. 00ВС, ОСЕ 0В, А00 и АВР Листинг 1 5.4 (продолжение) оЬОйесогб5еЫОРеп чаг5ц). оЬОСопп. абОрепвупаа1с, абЕосКОРЬ1а1эе(с ' разрешаен обновление 5ес 5езэцоп(чагйесогсэегНаае) = оЬОйесогб5е1 <6060>ТАВЕЕ ВОИОЕй=1 ВОСОСОй-(ГТГТТГТ СЕЕЕ5РАС!ИВ=О ГОНТ ГАСЕ-"Аг1а1" СОСОй УОООООО> <САРТ10М><В><ЖнОСазе (чагТаЫейаае) Ж> (1п 501 'егчег Оа1аЬазе)</В></САРТ!Ой></ГОНТ> <ТНЕАО> <Тй> <Ж чагйоаСо) з - оЬ)йесогб5ес, Е1е) бз.
Соопт Гог чаг! - О то чагйоаСо)з — 1 5еС оЬ)Е1е1С - оЬ)йесогб5ет.Е1е)бз (чаг!) И оЬОГ1е)б.йаае о чагКеуйаае ТПеп Ж> <ТН ВВСОСОй=(гсбсОсО ВОИОЕРСОСОИ=ФООООО ><ГОИТ 517Е 2 ЕАСЕ="Аг1а1" СОЕОИ=ФОООООО><Ж-оЬ) Г(е)б.йааеЖ></ЕОМТ></ТН> <Ж Епб !г йехЖЖ> </Тй> </ТНЕАО> <ТВООЧ> <Ж Оп Еггог йезле йехс оЬ)йесогбзег.йочеГ(гас Со НП1)е йос оЬОйесогб5ес.еоГ Ж> <Тй НАС!ОН=ТОР> <Ж чагйлСо) з - оЬОйесогб5ет. Е1е) бз. Соипс Гог чаг! = 0 1о чагйиаСо)з - 1 5е1 оЬОЕ(е)б = оЬ)йесогб5ет.Е1е)сэ(чаг!) 1Т оЬОГ1е)б.йаае <> чагКеуйаае ТПеп Ж> <ТО ВОИОЕИСОЕОй=(гсбсбсО ><ГОНТ 517Е-2 ЕАСЕ "Аг(а!" СОЕОй=(ЕОООООО><Ж=5егчег.НТМЕЕпсобе (оЬ)Г1е)б.ча1ие) Ж><Вй><!ГОНТ></ТО> <Ж Епб !Т МехЖЖ> </Тй> )оорЖ> <Вй Вй><А НИЕГ=ГУ1еий1бвеТаЫез.азр">ч)еи Апобйег ТаЫе</А> </ТВООТ> <ТГООТ></ТГООТ> </ТАВЕЕ> ,.</ВОВУ> ~ </НТМЕ> Остальная часть страницы представляет собой стандартный НТМ1..
Обратите внимание, что полю для ввода текста присвоено имя Жехн. В листинге 15.4 показана АВР-страница Оепега1ТаЫе.азр, которая вызывается, когда АЯР-процессору приходит отклик от страницы с формой, изображенной в листинге 15.3. Первый выполняемый сценарный оператор имеет следующий вид: йейоеаЖ.Еогв — это имя объекта, который содержит значения, посланные браузером. В этом случае 1ех11 будет содержать значение «айа1».