Здесь мы подведем итог всего, что было сказано в трех предыдущих главах: научимся создавать целые интерактивные сайты, построенные на основе серверных Web-страниц. Мы объединим все полученные нами ранее знания в единое целое — Web-сайт, чьи страницы генерируются серверными программами на основе базы данных. И на этом закончим изучение Dreamweaver.
Да-да, это все! Конец книги близок. Автор рассказал вам о Dreamweaver все, что хотел рассказать. Остальное зависит только от вас, от вашего трудолюбия и желания учиться большему.
Создание интерактивных Web-сайтов - высший пилотаж Web-дизайна. Чтобы сделать такой сайт, Web-дизайнер не только должен владеть языком HTML и обладать художественным чутьем, но и просто обязан знать "классическое" программирование и разбираться в базах данных. Конечно, современные программные продукты, наподобие Macromedia Dreamweaver, значительно облегчают труд Web-дизайнера, но отнюдь не берут всю его работу на себя. Уже говорилось, что Web-дизайн, как и "классическое" программирование — не наука, а искусство, иначе и программистов, и Web-дизайнеров давно бы уже заменили роботами. Или программами типа Dreamweaver.
Поэтому и программист, и Web-дизайнер, чтобы достичь вершин мастерства, должны работать. Программистами и Web-дизайнерами не рождаются -ими становятся. И данная книга — только первый шаг в овладении этими всегда перспективными профессиями.
В настоящее время профессии Web-дизайнера и Web-программиста слились в одну. Теперь любой Web-дизайнер просто обязан владеть навыками серверного программирования. А иначе и быть не может: интерактивные Web-сайты из разряда экзотики переходят в область ширпотреба. Сейчас можно сказать, что все сайты являются интерактивными. По крайней мере, большинство из них содержит хотя бы гостевую книгу, т. е. реализует начальный уровень взаимодействия с посетителями.
Об интернет-магазинах, расплодившихся, словно грибы после дождя, уже не стоит и говорить. Интернет-магазин — это большой интерактивный сайт, и создать его без серверного программирования невозможно. (Можно, конечно, но тогда у вас получится простейший сайт фирмы со списком товаров и сведениями о заказе.) Также без серверного программирования не удастся создать полноценный поисковый сайт, доску объявлений и даже полноценный архив программ.
А поэтому нам просто необходимо выяснить, как создаются такие вот интерактивные сайты. И начнем мы, как всегда, с теории.
Принципы создания интерактивных сайтов
Перечислим основные принципы разработки интерактивных Web-сайтов.
Все или почти все страницы сайта генерируются серверными программами. Статичные страницы хоть и присутствуют, но составляют весьма незначительный процент и содержат данные, не меняющиеся с течением времени, например сведения о владельце сайта или справочные данные о пользовании сайтом.
Данные для генерации страниц, как правило, берутся из баз данных, поскольку программирующее человечество пока что не придумало лучшего способа организованно хранить однотипные данные, чем помещение их в реляционные базы, которые вне конкуренции. Базы данных практически всегда работают под управлением сервера и очень часто — на отдельном серверном компьютере. Нередко также используется хранение данных в текстовых файлах, но это справедливо, в основном, для фрагментов Web-страниц (серверные включения).
Очень часто используется разграничение доступа к сайту. Разграничение доступа подразумевает, что разные посетители сайта имеют различные права на доступ к тем или иным данным, опубликованным на сайте. Так, обычные посетители могут только просматривать данные, в то время как "опытные" посетители имеют возможность также вносить в них некоторые изменения. Ну, а администраторы сайта, разумеется, могут творить с ними все, что захотят:
Если сайт использует разграничение доступа, то он обязательно должен предусматривать возможность входа (по-английски — logon). Чтобы войти на сайт, посетитель должен зайти на особую страницу входа и набрать свои имя и пароль. Если эти имя и пароль занесены в список посетителей сайта, серверная программа разрешает посетителю войти на сайт. В противном случае посетителю предлагается зарегистрироваться на сайте.
Сайт, использующий разграничение доступа, должен также предусматривать возможность регистрации посетителя. Если это общедоступный сайт, наподобие интернет-магазина, то посетитель регистрируется на нем, вводя данные о себе на особой странице регистрации, после чего они помещаются в список посетителей сайта. Если же это закрытый сайт, то для регистрации на нем надо будет обратиться к его администратору.
Сайт, использующий разграничение доступа, должен также предусматривать возможность выхода с сайта. При этом серверная программа "забывает", что данный посетитель вошел на сайт, очищая память, отведенную для хранения данных в нем, хотя соответствующая запись в списке посетителей, конечно же, сохраняется. Каждый посетитель, вошедший на сайт, обязательно должен с него выйти, чтобы освободить системные ресурсы серверного компьютера для других посетителей. Чтобы выйти с сайта, посетитель обычно должен щелкнуть специальную гиперссылку; реже используется особая страница выхода с сайта.
Разумеется, полностью общедоступные сайты типа поисковых машин не предусматривают разграничение доступа.
Осталось теперь ввести один термин. Давайте назовем процесс "общения" посетителя с Web-сайтом, начиная от входа на главную страницу и заканчивая "уходом" с него, сессией. В дальнейшем мы будем часто пользоваться этим термином, так что не забывайте его.
Вот теперь, кажется, все. Можно приступать к созданию нашего первого интерактивного Web-сайта. Пусть это будет библиотека различных афоризмов, умных, глупых или нейтральных. Причем доступна эта библиотека будет только после регистрации, т. е. она будет поддерживать разграничение доступа. Сами данные библиотеки будут храниться в базе данных Access, a доступ к ним будет производиться через особые серверные страницы. (Такой способ общения с базой данных называется Web-интерфейсом.)
Итак, приступим...
Административные страницы сайта
Первоначально создадим набор Web-страниц, служащих для администрирования нашего сайта. В самом деле, нашу базу данных нужно сначала наполнить содержимым — кому нужна пустая библиотека. А это работа администратора, которому необходимо предоставить соответствующие инструменты.
Как администрируются Web-сайты
Как вы знаете, администратором называется человек, осуществляющий поддержку Web-сайта или какой-либо серверной программы (Web-сервера, сервера базы данных и пр.). Администратор настраивает программное обеспечение, поддерживает в порядке серверный компьютер, а в случае интерактивного Web-сайта также еще и следит за его базами данных. Очень часто администратор сайта является и его разработчиком, хотя это и не правило.
Администратор может быть один или работать в составе группы администраторов, отвечающих за различные составные части этого сайта. В последнем случае один администратор может следить за Web-сервером, другой — за базами данных, а третий — за сервером баз данных. Как правило, большие корпоративные сайты так и администрируются — один человек просто не может за всем уследить. Кроме того, большие Web-сайты разрабатываются отдельной командой Web-дизайнеров, Web-художников и Web-программистов, работающих совместно с администраторами. Сами понимаете, корпоративный сайт большой компании, такой как Microsoft, один человек просто не "потянет".
Другое дело — маленький сайт, такой как наш. Разрабатывает и поддерживает их один человек — автор, Web-дизайнер, Web-художник и Web-программист в одном лице.
Теперь поговорим о том, как администрируются интерактивные Web-сайты. Собственно, для этого могут применяться два способа, которые мы сейчас рассмотрим. Оба этих способа имеют право на существование, и выбор любого из них — дело вашего вкуса.
Первый способ заключается в том, что для работы с базой данных сайта — просмотра или изменения хранящихся в ней данных — используются сторонние программы. "Сторонние" в данном случае значит — не относящиеся к Web-серверу, т. е. Web-сервер никак не участвует в администрировании вашего сайта. Административные программы работают отдельно от него и не обращаются к нему для выполнения своих функций.
В главе 17, когда мы создавали базу данных для нашей доски объявлений, то применяли как раз такой подход. Поскольку наш сайт использовал базу данных формата Microsoft Access, то мы использовали эту самую СУБД для работы с этой базой. Web-сервер в этом никак не участвовал.
Если же вы храните данные в серверной базе, то можете пользоваться любой современной программой СУБД, умеющей "общаться" с вашим сервером данных, в том числе той же самой Access. (Впрочем, получать данные от сервера сейчас могут практически все СУБД.) Самый же простой случай — хранение данных в текстовых файлах; в этом случае вы можете воспользоваться любым текстовым редактором, например Блокнотом.
Преимущество первого способа администрирования сайта — снижение нагрузки на Web-сервер. Это преимущество особенно ощутимо, когда сайт администрируется достаточно часто. Недостаток: необходимость наличия дополнительных программ на компьютере администратора.
Второй способ администрирования сайта заключается в том, что вместо сторонних программ применяется специальный набор серверных Web-страниц. Эти страницы доступны только для администратора сайта и позволяют работать с данными, хранящимися в базе, без использования других программ. Такие Web-страницы часто называют административными.
У этого способа администрирования сайтов есть два достоинства и два недостатка. Достоинства: отсутствие нужды в сторонних программах и возможность разграничения доступа для администраторов сайта, если таких несколько. Недостатки: повышенная нагрузка на Web-сервер и необходимость создания двух разных наборов Web-страниц — административных и общего доступа.
Как уже писалось, вы можете использовать любой из этих способов. Просто взвесьте все достоинства и недостатки, предлагаемые обоими этими способами, и сделайте выбор. В принципе, ни один из них не предлагает каких-то неоспоримых достоинств, так что выбор — за вами.
Давайте выберем для нашего сайта второй способ администрирования, т. е. с использованием административных Web-страниц. Так мы сможем лучше изучить принципы построения современных интерактивных сайтов и сможем попрактиковаться в создании разных типов серверных страниц. А что до трудоемкости, то сейчас для нас важна любая практика.
Страница списка высказываний
Итак, приступим!
Давайте сначала подумаем над структурой нашей базы данных. Ведь если мы этого не сделаем, то ее (структуру) придется придумывать по ходу дела. А так никто не делает — вспомните, ведь строители перед тем, как начать строить что-либо, всегда сверяются с планом.
Пусть все высказывания, хранящиеся в нашей библиотеке, делятся на три категории: умные, глупые и нейтральные, (Возможно, потом появятся другие категории, но сейчас нам вполне хватит этих трех.) Таким образом, мы позволим посетителю нашего будущего сайта сразу же при входе выбрать то, что ему нужно, т. е. когда посетитель зайдет на наш сайт, он сразу же получит возможность выбрать на особой странице одну из категорий, после чего перейдет на другую страницу, где будут перечислены высказывания выбранной им категории.
Сейчас же мы не будем делить высказывания на категории, а выведем их в одном списке вперемешку. Не стоит слишком усложнять наш первый сайт, иначе мы толком ничему не научимся.
Вы спросите, а как же разграничение доступа? Где страница входа на сайт? Это успеется. Сначала сделаем основные страницы, отображающие и изменяющие информацию, хранящуюся в нашей базе, а потом займемся безопасностью. На данном этапе ей можно пренебречь.
Откроем Access и создадим базу данных под названием Library.mdb. В ней создадим таблицу categories с полями ID (счетчик) и Name (текстовое, 30 знаков). Первое поле послужит нам ключевым, а во втором, как вы уже поняли, будут храниться имена категорий. После этого введем в эту таблицу три записи: "Умные", "Нейтральные" и "Глупые".
Далее создадим таблицу, где будут храниться наши высказывания. Эта таблица будет содержать следующие поля:
ID — счетчик;
Content — текст высказывания (Memo-поле);
category — категория высказывания (длинное целое, связанное с полем ID таблицы Categories).
Назовем эту таблицу sentences. Введем какую-нибудь запись для отладочных целей, не обязательно осмысленную. И закроем Access — больше он нам не понадобится.
Вы уже знаете, как создается источник данных ODBC. Если не знаете, обратитесь к главе 17, где это подробно описано. Наш новый источник данных будет называться Library и предоставлять доступ к базе данных Library.mdb.
После этого создадим новую папку Sample4. В ней будут находиться файлы нашего нового сайта Sample site 4. В папке Sample4 создадим вложенную папку Admin, в которой будут храниться административные страницы сайта. Зарегистрируем наш новый сайт в Dreamweaver, задав те же данные, что и для сайта Sample site 1 в главе 17. Зарегистрируем базу данных Library.mdb в Dreamweaver, воспользовавшись только что созданным источником Library. На этом подготовительные действия закончились.
Создав таблицу, приступим к созданию серверной страницы. Назовем ее так же, как таблицу, — Sentences.asp. Введем какой-нибудь пояснительный текст, если вдруг у нас появится такое желание. И сохраним ее в папке Admin, вложенной в корневую папку нашего сайта.
После этого создадим набор записей sentences, извлекающий данные из только что созданной таблицы. Причем этот набор будет сложным: он свяжет вместе таблицы sentences и Categories, "заимствуя" из первой таблицы поля ID и Content, а из второй — поле Name. Связь будет осуществляться по полю Category таблицы Sentences И ПОЛЮ ID табЛИЦЫ Categories. Создайте этот набор записей, а в случае затруднений справьтесь в главе 17. Не задавайте для этого набора ни фильтра, ни сортировки. Текст SQL-запроса должен быть таким:
SELECT Sentences.ID, Content, Name FROM Sentences, Categories WHERE Sentences.Category=Categories.ID
Запись вида "Sentences.ID" означает, что мы выбираем значения поля ID таблицы Sentences.
Поскольку мы будем отображать одновременно два значения, будет лучше создать для этого таблицу. Эта таблица должна содержать две строки и четыре столбца. В первой строке будет находиться "шапка", а во второй -собственно содержимое. (Как вы поняли, вторую строку придется поместить в повторяющуюся область.) В первом столбце таблицы будет отображаться содержание высказывания, а во втором — категория (в смысле, название категории), а последние два столбца мы пока оставим пустыми. Создайте такую таблицу и отформатируйте, как хотите.
Теперь поместите в первую ячейку второй строки этой таблицы динамический текст, привязанный к полю Content набора записей, а во вторую ячейку — динамический текст, привязанный к полю Name. Далее выделите всю вторую строку, щелкнув по соответствующей кнопке секции тегов, и создайте "вокруг" нее повторяющуюся область, связанную с набором данных sentences. Задайте количество одновременно отображаемых записей равным двадцати.
Поскольку мы создали повторяющуюся область, отображающую за раз фиксированное количество записей, нам нужно также создать навигатор и строку статуса. Сделайте это, сверяясь с главой 17, где создание навигатора и строки статуса было подробно описано, и поместите их под таблицей.
Теперь остается только создать "вокруг" таблицы, навигатора и строки статуса необязательную область, показываемую только тогда, когда в наборе sentences есть записи. И поместить на странице еще одну необязательную область, отображаемую при отсутствии записей в наборе и содержащую текст, говорящий об этом. Создайте эти области.
Вот и все. Наша страница готова. Можете проверить ее, переключив Dreamweaver в режим показа "живых" данных или загрузив страницу в Web-обозревателе.
К несчастью, в таблице Sentences находится только одна запись. Но мы сейчас это исправим.
Страница добавления записи
Давайте подумаем, что нам нужно сделать теперь, когда страница списка высказываний готова и работает?
Таблица sentences, как вы уже заметили, девственно-пуста. (Отладочная запись, введенная нами в Access, не считается.) Нужно заполнить ее данными. А для этого нам необходимо создать страницу добавления записи.
Создайте новую серверную страницу, введите в нее поясняющий текст и сохраните опять же в папке Admin под именем AddSentence.asp. Создайте в этой странице форму и назовите ее sentence. Внутри формы создайте область редактирования и назовите ее content, не забудьте также о кнопке отправки данных.
Что-то мы забыли... Ах, да! Нужно еще поместить в форму раскрывающийся список category и привязать его к набору записей categories. Но перед этим необходимо создать сам набор записей Categories, из которого будут взяты пункты списка Category. Задайте выборку всех записей таблицы categories. После этого задайте сортировку записей по полю Name, для чего выберите это поле в раскрывающемся списке Sort диалогового окна Recordset (см. рис. 17.15). А раскрывающийся список, расположенный правее, позволит вам задать порядок сортировки записей: по возрастанию (пункт Ascending) или по убыванию (пункт Descending). Задав параметры набора данных, нажмите кнопку ОК.
Теперь можно создать поведение insert Record. (Как это делается, было описано в главе 17.) Привяжите область редактирования content к полю
Content таблицы Sentences,а списокCategory — к полю Category. В качестве страницы, на которую будет осуществлен переход после добавления записи, задайте Sentences.asp.
Сохраните готовую страницу AddSentence.asp. После этого откройте страницу Sentences.asp и поместите в нее гиперссылку, указывающую на страницу AddSentence.asp. Вот и все.
Теперь можете проверить созданную нами страницу добавления записи. Опубликуйте сайт на Web-сервере, откройте страницу Sentences.asp в Web-обозревателе и щелкните по гиперссылке "Добавить". Внесите в таблицу sentences несколько записей. Они нам пригодятся для отладки.
Страница изменения записи
Наряду с добавлением новых записей часто приходится изменять уже существующие. Давайте создадим страницу, с помощью которой можно изменять уже существующие в наборе записи.
Создадим новую страницу, введем в нее поясняющий текст и сохраним под именем EditSentence.asp в папке Admin. Здесь мы впоследствии создадим форму с элементами управления, предназначенными для правки значений полей выбранной нами записи. А пока закроем эту страницу — нас ждут другие дела.
Сейчас мы добавим на страницу Sentences.asp гиперссылку, ведущую на страницу изменения записи. Откройте страницу, поместите текстовый курсор в третью ячейку второй строки таблицы (теперь вы поняли, зачем она нужна?) и наберите в ней слово "Изменить". Далее выделите это слово и наберите в поле ввода интернет-адреса редактора свойств такой текст:
EditSentence.asp?ID=
Далее переключитесь в режим отображения кода и перетащите из панели Bindings в место, находящееся точно после знака "=", поле ID набора записей. Интернет-адрес гиперссылки примет такой вид:
извлекает значение поля ID данной записи набора. Далее это значение помещается в гиперссылку, которая принимает вид:
EditSentence.аsр?ID=<значение поля ID">
и передается странице EditSentences.asp в качестве значения параметра гиперссылки ID. Поскольку значение поля ID уникально для каждой записи набора (поле ID — счетчик записей, как вы помните), страница EditSentences.asp может однозначно идентифицировать запись, которую вы хотите изменить, и заполнить значениями ее полей элементы управления формы, т. е. подготовить запись к правке.
Теперь сохраните страницу Sentences.asp и откройте только что созданную нами страницу EditSentence.asp. Пора заняться ей.
Для того чтобы отредактировать запись, нам понадобится форма. Создайте ее по аналогии со страницей AddSentence.asp. Никаких особенностей она иметь не будет, поэтому вы можете просто скопировать уже готовую форму со страницы добавления новой записи и вставить ее в страницу EditSentence.asp. Но перед этим создайте на этой странице набор данных categories, также по аналогии со страницей AddSentence.asp.
Следующий шаг — создание набора записей, из которого будет взята запись для заполнения элементов управления созданной нами формы. Этот набор должен содержать одну-единственную запись, поэтому нам придется задать фильтр, отбирающий нужную запись. Она будет выбрана по значению поля счетчика ID таблицы Sentences, которое должно равняться значению параметра гиперссылки ID, переданному от страницы Sentences.asp (см. выше).
Чтобы создать фильтр, выберите название поля ID в раскрывающемся списке Filter диалогового окна Recordset, а в раскрывающемся списке, расположенном правее, — пункт = (равенство значений поля и фильтра). Далее в списке, расположенном ниже, выберите пункт URL Parameter (параметр, переданный методом GET), а в поле ввода, расположенном ниже и правее, введите имя этого параметра — ID.
Далее нам нужно заполнить элементы управления формы соответствующими им значениями. Эти значения, как вы поняли, будут взяты из только что созданного нами набора записей. Для разных элементов управления действия будут различными, и мы их сейчас опишем.
Сначала выделите область редактирования и найдите в редакторе свойств кнопку с изображением молнии — она находится правее области редактирования Init Val. Щелкните по этой кнопке. На экране появится диалоговое окно Dynamic Data; выберите в иерархическом списке Field пункт Content, соответствующий одноименному полю, и нажмите кнопку ОК. Все, теперь область редактирования получит значение из поля Content набора записей.
С раскрывающимся списком все несколько сложнее. Выделите его и нажмите кнопку Dynamic. В появившемся на экране диалоговом окне Dynamic List/Menu щелкните кнопку с изображением молнии, расположенную правее поля ввода Select Value Equal To. После этого на экране опять же появится диалоговое окно Dynamic Data; выберите в иерархическом списке Field пункт Category, соответствующий одноименному полю, и нажмите кнопку ОК. Теперь остается только нажать кнопку ОК окна Dynamic List/Menu.
Можно сделать еще проще — перетащить нужное поле из панели Bindings на соответствующий ему элемент управления. Автор рекомендует вам так и поступать в дальнейшем.
Теперь нужно создать поведение update Record, которое, собственно, и реализует заполнение формы и обновление значений полей редактируемой записи. Выберите пункт Update Record меню серверных поведений панели Server Behaviors. На экране появится диалоговое окно Update Record.
Выберите в раскрывающемся списке Connection базу данных, в списке Table То Update — таблицу, запись которой будет обновляться, а в списке Select Record From — набор записей, из которого будет взята запись для заполнения формы. В нашем случае это будет соответственно Library, Sentences и Sentences (соответственно, одноименные таблица и набор записей).
В поле ввода Unique Key Column задается поле набора записей, по которому нужная нам запись будет однозначно идентифицироваться. В нашем случае — это ключевое поле ID. Если это числовое поле (а поле ID — числовое), включите флажок Numeric, в противном случае — отключите его.
В поле ввода After Updating, Go To вводится интернет-адрес страницы, на которую будет осуществлен переход после успешного изменения записи. Введите в него sentences. asp. Вы также можете щелкнуть кнопку Browse и выбрать нужную страницу в диалоговом окне Select File.
В раскрывающемся списке Get Values From выбирается форма, из которой будут взяты значения для обновления записи.
В списке From Elements перечислены все элементы управления, находящиеся в выбранной форме. Вы можете выбрать любой из них и задать для него поле таблицы, куда будут помещены содержащиеся в нем данные, и тип отправляемых данных (текст, число, дата и т. п.).
Поле таблицы выбирается в раскрывающемся списке Column. Пункт <ignore> данного списка позволяет проигнорировать значение этого элемента управления (т. е. оно не будет помещено в поле таблицы).
Тип данных указывается в раскрывающемся списке Submit As. В нем доступны следующие пункты:
Text — текстовые данные;
Numeric — числовые данные;
Date — значение даты;
Date MS Access — значение даты, предназначенное для Microsoft Access;
Checkbox Y,N — логическое значение, преобразуемое в символы "Y" ("да") или "N" ("нет");
Checkbox 1,0 — логическое значение, преобразуемое в числа 1 ("да") или 0 ("нет");
Checkbox -1,0 — логическое значение, преобразуемое в числа -1 ("да") или 0 ("нет");
Checkbox MS Access — логическое значение, предназначенное для Microsoft Access.
Задав все нужные данные, не забудьте нажать кнопку ОК.
Сохраните готовую страницу EditSentence.asp и проверьте ее в действии. Для этого опубликуйте сайт на Web-сервере, откройте страницу Sentences.asp в Web-обозревателе и попробуйте отредактировать какое-либо высказывание. Если страница изменения записи почему-то не работает, проверьте, все ли правильно вы сделали.
Средства удаления записи
Осталось создать средства удаления ненужных высказываний из таблицы Sentences. Что ж, и такое иногда приходится проделывать...
Чтобы удалить ненужную запись, нам также понадобится серверная страница. Мы поместим на этой странице содержимое удаляемой записи (это хороший тон Web-программирования) и кнопку, запускающую процесс удаления записи. А для перехода на эту страницу мы поместим на странице Sentences.asp еще одну гиперссылку.
Откройте страницу Sentences.asp. Поставьте текстовый курсор в четвертую ячейку второй строки таблицы и наберите текст "Удалить". Выделите только что введенное слово и наберите в поле ввода интернет-адреса редактора свойств такой текст:
DeleteSentence.asp?ID=
Далее переключитесь в режим отображения кода и перетащите из панели Bindings в место, находящееся точно после знака "=", поле ID набора записей. Интернет-адрес гиперссылки примет такой вид:
Теперь сохраните и закройте страницу Sentences.asp. Создайте новую серверную страницу, введите в нее поясняющий текст и сохраните под именем DeleteSentence.asp в папке Admin. Но не закрывайте только что созданную страницу — мы ей сейчас займемся.
Сначала нужно создать набор записей, из которого будет взята запись для отображения на этой странице. Этот набор также должен содержать одну-единственную запись, поэтому нам придется задать фильтр по значению поля счетчика ID таблицы sentences, которое должно равняться значению параметра гиперссылки ID, переданному от страницы Sentences.asp. Кроме того, этот набор записей должен быть сложным, аналогичным тому, что мы создали на странице Sentences.asp. Создайте его, а если у вас возникнут затруднения, обратитесь к спасительной главе 17. Текст SQL-запроса будет таков:
SELECT Sentences.ID, Content, Name FROM Sentences, Categories
WHERE Sentences.ID = MMColParam AND Sentences.Category=Categories.ID
Здесь MMCoiParam — имя параметра SQL-запроса, соответствующего параметру гиперссылки ID. Его значение, соответственно, будет
Request.QueryString("ID").
Теперь поместим на страницу динамический текст, привязанный к полю Content набора записей. В следующем абзаце наберем слово "Категория", поставим неразрывный пробел и поместим динамический текст, привязанный к полю Name.
В следующем абзаце создадим форму и назовем ее Delete. Эта форма нужна нам для того, чтобы поместить кнопку, запускающую процесс удаления записи. Поместим же эту кнопку в форму. И сохраним страницу.
Теперь нам нужно создать поведение Delete Record. Для этого выберем одноименный пункт в меню серверных поведений панели Server Behaviors. На экране появится диалоговое окно Delete Record.
Выберите в раскрывающемся списке Connection базу данных, в списке Delete From Table — таблицу, запись которой будет удалена, а в списке Select Record From — набор записей, из которого будет взята запись для отображения ее содержимого на странице. В нашем случае это будет соответственно Library, sentences и Sentences (таблица и набор записей у нас называются одинаково).
В поле ввода Unique Key Column задается поле набора записей, по которому нужная нам запись будет однозначно идентифицироваться. В нашем случае — это ключевое поле ID. Если это числовое поле (а поле ID — числовое), включите флажок Numeric, в противном случае — отключите его.
В раскрывающемся списке Delete By Submitting выбирается кнопка, после нажатия которой произойдет удаление записи.
В поле ввода After Deleting, Go To вводится интернет-адрес страницы, на которую будет осуществлен переход после успешного удаления записи. Введите в него sentences. asp. Вы также можете щелкнуть кнопку Browse и выбрать нужную страницу в диалоговом окне Select File.
После ввода всех данных не забудьте нажать кнопку ОК. Сохраните страницу DclcteSentence.asp и проверьте ее. Введите какую-нибудь запись и попробуйте ее удалить. Если она почему-то не удалится, проверьте, все ли вы сделали правильно.
Страница входа на сайт
Поскольку наш сайт будет поддерживать разграничение доступа, нам нужно обязательно сделать страницу входа на сайт. А, кроме того, нам необходимо создать в базе данных Library.asp таблицу, которая будет хранить список зарегистрированных посетителей.
Первым делом нужно, разумеется, создать таблицу, чтобы нам было с чего начинать создание страницы входа. Эта таблица будет содержать следующие поля:
Name — имя посетителя (текстовое, 20 символов, ключевое);
Grants — права посетителя (текстовое, 20 символов).
первыми двумя полями все ясно. Поговорим о третьем поле — Grants. Dreamweaver, точнее, его поведения, "отвечающие" за разграничение доступа, принимают текстовые значения, говорящие о правах посетителя. Таких значений может быть, как минимум, три:
"Administrator" — администратор сайта, полный доступ ко всем данным сайта;
"user" - посетитель, доступ к открытым данным сайта, предназначенным для "обычных" посетителей сайта;
"Guest" — "гость" сайта, минимальный доступ к данным сайта.
Основываясь на этих значениях, поведения Dreamweaver принимают решение, допускать ли посетителя до какой-либо страницы сайта. Конечно, вы можете задать свои значения, но эта троица присутствует практически во всех списках доступа.
Чтобы не усложнять чрезмерно наш сайт, давайте ограничимся двумя типами прав посетителей: администратором (значение "Administrator" поля Grants) и обычным посетителем (значение "user"). Администратор будет один и может править любые данные, сохраненные в базе Library.asp, a обычный посетитель сможет только их просматривать.
Итак, мы создали новую таблицу. Но подождите ее сохранять. Задайте для поля Grants значение по умолчанию "user", чтобы вновь зарегистрировавшиеся посетители сразу же получили соответствующие права доступа. Вот теперь можете закрывать и сохранять новую таблицу. Назовите ее Users.
После этого откройте только что созданную таблицу и введите в нее одну запись. Значения ее полей будут такими:
поле Name — "Admin";
поле Password — "Admin" (не будем заботиться о секретности пароля — все равно наш сайт учебный);
поле Grants — "Administrator".
Теперь можно приступать к созданию страницы входа на сайт. Введите в нее поясняющий текст и назовите Login.asp. Причем сохраните ее в корневой папке сайта, а не в папке Admin, — мы используем ее для входа на сайт и администраторов, и обычных посетителей.
Теперь нам нужно создать форму с двумя полями ввода — соответственно, для ввода имени и пароля. Ну и, конечно, понадобится кнопка отправки данных. Создайте форму и назовите ее Login. Поля ввода назовите соответственно Name и Password. He забудьте текстовые подписи, иначе посетитель вашего сайта не поймет, что куда нужно вводить. После этого сохраните страницу.
Теперь создадим поведение Log in user. Для этого выберите одноименный пункт в подменю User Authentication меню серверных поведений панели Server Behaviors. На экране появится диалоговое окно Log In User.
В раскрывающемся списке Get Input From Form выбирается форма, из которой будут взяты введенные посетителем имя и пароль. Поле ввода имени выбирается в раскрывающемся списке Username Field, а поле ввода пароля—в списке Password Field.
В раскрывающемся списке Validate Using Connection выбирается база данных, зарегистрированная в Dreamweaver. В списке Table выбирается таблица, содержащая список посетителей, в списке Username Column — поле, в котором хранятся имена посетителей, а в списке Password Column — поле, в котором хранятся пароли.
Очень часто на главной странице сайта делается гиперссылка на страницу входа (а иногда сама страница входа делается главной). В этом случае посетитель после успешного входа перенаправляется на страницу с "закрытыми" данными. В поле ввода If Login Succeeds, Go To как раз и вводится интернет-адрес страницы, на которую будет осуществлен переход, если посетитель успешно войдет на сайт. Введите в это поле имя страницы списка высказываний Admin/Sentences.asp. Вы также можете нажать кнопку Browse и выбрать нужную страницу в диалоговом окне Select File.
Иногда система разграничения доступа функционирует следующим образом. При попытке захода на не доступную "посторонним" страницу посетитель автоматически перенаправляется на страницу входа на сайт. После ввода имени и пароля, если этот посетитель занесен в список, он возвращается на страницу, на которую хотел войти изначально. Для такого случая предусмотрен флажок Go To Previous URL (if it exists). Включите его, если хотите, чтобы система разграничения доступа работала таким образом.
В поле ввода If Login Fails, Go To вводится интернет-адрес страницы, на которую будет осуществлен переход, если посетителю не удалось войти на сайт. (Такое может быть, например, из-за того, что посетитель не внесен в список или неправильно набрал имя или пароль.) Введите в это поле имя страницы входа Login.asp; таким образом, после неудачного входа посетитель окажется на той же странице. Вы также можете нажать кнопку Browse и выбрать нужную страницу в диалоговом окне Select File.
С помощью группы переключателей Restrict Access Based On вы можете задать, на основе чего производится разграничение доступа к Web-страницам. Если включен переключатель Username and Password, разграничение доступа производится на основе имени и пароля. Если же вы хотите "вовлечь" в этот процесс еще и права доступа посетителя, включите переключатель Username,Password, and Access Level. В этом случае становится доступным раскрывающийся список Get Level From, в котором вы сможете выбрать поле таблицы, выбранной в списке Table, откуда будут взяты права посетителя. В нашем случае — это поле Grants.
Введя все данные, нажмите кнопку ОК.
Вы, наверно, подумали, что сейчас мы будем проверять вновь созданную страницу в работе. Но делать это пока еще рано. Нам нужно защитить остальные страницы от несанкционированного доступа, т. е. попытки войти на них, миновав страницу входа на сайт. Без этого наши старания по защите сайта от "случайных людей" пойдут насмарку.
Защита страниц от несанкционированного доступа
В нашем случае стоит защитить только страницу Sentences.asp, т. к. лишь на ней отображаются какие-то данные. Остальные страницы (AddSentence.asp, EditSentence.asp и DeleteSentence.asp) выполняют вспомогательные функции и без страницы Sentences.asp работать не будут.
Итак, откроем страницу Sentences.asp. Чтобы защитить ее от непрошенных посетителей, создадим поведение Restrict Access TO Page. Выберем одноименный пункт в подменю User Authentication меню серверных поведений панели Server Behaviors. На экране появится диалоговое окно Restrict Access То Page.
С помощью группы переключателей Restrict Based On вы можете задать, на основе чего производится разграничение доступа к данной странице. Если включен переключатель Username and Password, разграничение доступа производится на основе только имени и пароля. Если же вы хотите "вовлечь" в этот процесс еще и права доступа посетителя, включите переключатель Username, Password, and Access Level. В этом случае становится доступным список Select Level(s), в котором вы сможете выбрать права для посетителей, которые смогут увидеть эту страницу.
Изначально список Select Level(s) пуст. Поэтому нам придется его заполнить. Щелкните кнопку Define, и на экране появится диалоговое окно Define Access Levels.
Большую часть этого окна занимает список уже созданных вами прав. Чтобы добавить в него новый пункт, введите его имя в поле ввода Name и нажмите кнопку со знаком "плюс". Чтобы изменить пункт, выберите соответствующее имя в списке, измените его в поле ввода Name и переключитесь на любой другой пункт списка. Если же вам требуется удалить ненужный пункт, выберите соответствующее имя и нажмите кнопку со знаком "минус". К сожалению, эту операцию вам придется выполнять почти всегда: Dreamweaver почему-то часто добавляет в список пустой пункт. Введя все права посетителей, нажмите кнопку ОК.
Введя в список Select Level(s) права посетителей, вы можете их выбрать, щелкнув мышью по нужному пункту. В нашем случае, выберите пункт Administrator. Если вам необходимо выбрать сразу несколько пунктов, щелкните по первому из них, а потом щелкайте по остальным, удерживая нажатой клавишу <Ctrl>.
В поле ввода If Access Denied, Go To вводится интернет-адрес страницы, на которую будет осуществлен переход, если посетителю запрещено входить на эту страницу или если посетитель не выполнил процедуру входа на сайт. Введите в это поле имя страницы входа Login.asp. Вы также можете нажать кнопку Browse и выбрать Нужную страницу в диалоговом окне Select File.
Введя все данные, нажмите кнопку ОК.
Вот теперь можете проверить созданную нами систему разграничения доступа. Опубликуйте сайт на Web-сервере и попробуйте открыть страницу Sentences.asp. Если она все же откроется, выполните ее перезагрузку в окне Web-обозревателя. После этого вы уж точно окажетесь на странице входа на сайте Login.asp.
Реализация выхода с сайта
Осталось реализовать выход с сайта — и работу над административными страницами можно считать законченной. Как вы помните, каждый посетитель, вошедший на сайт с разграничением доступа, должен по окончании работы с него выйти, чтобы освободить системные ресурсы серверного компьютера. Так что выход с сайта так же важен, как и вход на него.
Выход с сайта можно реализовать двумя способами. Во-первых, можно предусмотреть на каждой из страниц, отображающей "закрытые" данные, особую гиперссылку, запускающую процесс выхода. Во-вторых, для этого можно предусмотреть особую серверную Web-страницу, вход на которую автоматически вызовет выполнение действий по выходу с сайта. Вы можете использовать любой из этих способов, мы же выберем первый.
Откройте страницу Sentences.asp. Поместите где-либо на ней текст "Выход с сайта". Выделите его и выберите в подменю User Authentication меню серверных поведений панели Server Behaviors пункт Log Out User. На экране появится диалоговое окно Log Out User.
С помощью набора переключателей Log Out When выбирается момент времени, когда выполняется выход посетителя с сайта. Если вы хотите, чтобы выход выполнился при щелчке по гиперссылке (это как раз наш случай), включите переключатель Link Clicked. Если же вы хотите, чтобы выход выполнился при входе на данную Web-страницу, включите переключатель Page Loads.
В поле ввода When Done, Go To вводится интернет-адрес страницы, на которую будет осуществлен переход после выполнения процедуры выхода с сайта. Введите в это поле имя страницы входа Login.asp. Вы также можете нажать кнопку Browse и выбрать нужную страницу в диалоговом окне Select File. Введя все данные, нажмите кнопку ОК.
Проверьте готовую страницу в работе. Для этого опубликуйте сайт на Web-сервере, откройте в Web-обозревателе страницу Sentences.asp, войдите на сайт и тут же выйдите с него.
Все, на этом создание административных страниц можно считать законченным. Теперь приступим к созданию страниц общего доступа, предназначенных для обычных посетителей нашего сайта.
Страницы общего доступа
Страницы общего доступа предназначены для обычных посетителей сайта. Как правило, они создаются после административных страниц; в этом случае вы можете использовать последние как образцы для создания "обычных" страниц. В самом деле, "обычные" страницы часто в общих чертах повторяют административные, и вам остается только удалить некоторые возможности, не нужные обычным посетителям. Так мы и сделаем.
Страница списка категорий
Давайте сделаем так, чтобы при входе на сайт посетитель мог выбрать категорию высказываний (зря мы их, что ли, вводили!). А для этого нам понадобится создать страницу списка категорий, чем мы сейчас и займемся.
Создадим новую серверную страницу ASP и сохраним ее в файле Categories.asp в корневой папке сайта. И остановимся, чтобы немного подумать.
Что нам нужно? Правильно, вывести список категорий. А еще? Нам необходимо, чтобы название каждой категории в этом списке представляло собой гиперссылку. Щелкнув по ней, посетитель сайта попадет на другую страницу, на которой будут перечислены все высказывания этой категории.
Как это сделать? Очень просто: надо воспользоваться поведением GO TO Detail Page, выполняющим переход на связанную страницу.
Создадим новый набор записей под именем categories. Задайте выборку всех записей таблицы categories. После этого задайте сортировку записей по полю Name, для чего выберите это поле в раскрывающемся списке Sort диалогового окна Recordset (см. рис. 17.15). Раскрывающийся список, расположенный правее, позволит вам задать порядок сортировки записей: по возрастанию (пункт Ascending) или по убыванию (пункт Descending).
Напишите на странице Categories.asp какой-либо пояснительный текст, если хотите. После этого создайте текстовый абзац и поместите в него динамический текст, связанный с полем Name набора данных categories. Далее выделите этот текст и создайте "вокруг" 'него повторяющуюся область, привязав ее к созданному нами набору данных categories. Пусть она отображает сразу все записи набора — их не так много, чтобы городить огород с навигатором и строкой статуса.
Собственно, на этом создание страницы списка категорий почти закончено. Осталось только добавить поведение, реализующее переход на страницу со списком высказываний, относящихся к выбранной категории.
Чтобы нам самим было проще в дальнейшем, давайте введем еще пару терминов. Назовем страницу, отображающую список категорий, первичной, а страницу, отображающую список высказываний, относящихся к выбранной категории, — вторичной. В литературе встречаются другие названия таких страниц, но мы будем использовать эти.
Выделите содержимое повторяющейся области, а именно динамический текст. После этого выберите в меню серверных поведений панели Server Behaviors пункт Go To Detail Page. На экране появится диалоговое окно Go То Detail Page.
В поле ввода Detail Page введите интернет-адрес вторичной страницы, отображающей список высказываний. Вы также можете щелкнуть по кнопке Browse и выбрать нужную страницу в диалоговом окне Select File. Мы создадим эту страницу позднее и назовем ее так же, как уже созданную административную страницу списка высказываний, — Sentences.asp, только сохраним в корневой папке сайта.
В поле ввода Pass URL Parameter введите имя параметра, передаваемого из первичной страницы во вторичную. По умолчанию Dreamweaver подставляет в него имя первого поля ввода набора записей, и, если это то поле, которое вам нужно, менять его не стоит.
В раскрывающемся списке Recordset выбирается набор записей, чье поле используется для связи первичной и вторичной страниц. Само же это поле выбирается в раскрывающемся списке Column. В нашем случае это набор записей categories и его поле ID.
Теперь остается задать метод передачи параметра из первичной страницы во вторичную. Это делается с помощью группы флажков Pass Existing Parameters. Флажок URL Parameters задает использование метода GET, а флажок Form Parameters — метода POST. Нам лучше выбрать метод GET, т. к. объем передаваемых данных очень невелик, а хранить их в секрете необязательно.
Введя все данные, нажмите кнопку ОК. После этого Dreamweaver преобразует выделенный фрагмент страницы в гиперссылку, выполняющую переход на вторичную страницу. И, разумеется, создаст поведение GO TO Detail Page.
Теперь нужно ограничить доступ к этой странице. Для этого, как вы помните, нужно создать поведение Restrict Access TO Page. Задайте разграничение доступа по имени и паролю (переключатель Username and Password диалогового окна Restrict Access To Page). Таким образом, на эту страницу смогут попасть все зарегистрированные посетители вне зависимости от прав доступа.
На этом создание страницы списка категорий можно считать законченным. Наш следующий шаг — создание страницы списка высказываний.
Страница списка высказываний
В данном случае лучше всего создать страницу списка высказываний "с нуля". Если же мы решим создать ее на основе созданной ранее административной страницы Sentences.asp, нам придется вносить в нее слишком много изменений. Поэтому создадим новую серверную страницу, напишем на ней поясняющий текст и сохраним под именем Sentences.asp в корневой папке сайта.
После этого создадим набор записей Sentences, извлекающий данные из только что созданной таблицы. Зададим для него фильтр по полю category. Для этого выберите название этого поля в раскрывающемся списке Filter диалогового окна Recordset, а в раскрывающемся списке, расположенном правее, — пункт = (равенство значений поля и фильтра). Далее в списке, расположенном ниже, выберите пункт URL Parameter (параметр, переданный методом GET), а в поле ввода, расположенном ниже и правее, введите имя этого параметра — ID.
Кроме того, мы можем не извлекать из таблицы все поля, а ограничимся только полем Contents. Включим переключатель Selected в группе Column диалогового окна Recordset и выберем в расположенном ниже списке пункт Content, соответствующий одноименному полю таблицы. Поля ID и Category нам в данном случае не нужны, потому что их содержимое никак не отображается на странице. Это позволит нам уменьшить нагрузку на серверный компьютер, который и без того сильно загружен, ведь для хранения содержимого полей таблиц расходуется его оперативная память.
Теперь поместите в текстовом абзаце динамический текст, привязанный к полю content набора записей, выделите весь абзац, щелкнув по соответствующей кнопке секции тегов, и создайте "вокруг" него повторяющуюся область. Затем сделайте навигатор и строку статуса набора данных.
После этого поместите повторяющуюся область, навигатор и строку статуса внутрь необязательной области, отображающейся только при непустом наборе записей sentences. И создайте еще одну необязательную область, отображающуюся, наоборот, при пустом наборе записей и содержащую текст "Список высказываний пуст". Как видите, мы повторяем шаги, проделанные нами при создании административной страницы Sentences.asp.
Последний шаг (его мы тоже проделывали) — это защита страницы от несанкционированного доступа и предоставление возможности выхода с сайта. Создайте соответствующие поведения и гиперссылку для выхода. Когда будете создавать поведение Restrict Access TO Page, задайте разграничение доступа по имени и паролю (переключатель Username and Password диалогового окна Restrict Access To Page). После этого сохраните готовую страницу.
Теперь проверьте готовые страницы. Для этого опубликуйте сайт на Web-сервере, откройте в Web-обозревателе страницу Categories.asp, войдите на сайт (под именем "Admin" — других посетителей в списке нет), выберите категорию и просмотрите отобранные серверной программой высказывания. После этого выйдите с сайта. Если вы все сделали правильно, все должно работать.
Страница регистрации посетителя
Последняя из страниц общего доступа, которую нам нужно создать, — это страница регистрации нового посетителя нашего сайта. В самом деле, если посетитель не сможет зарегистрироваться на нашем сайте, занеся сведения о себе в список посетителей, как же он сможет добраться до содержимого этого сайта?
Создайте новую серверную страницу, поместите на ней поясняющий текст и сохраните под именем Register.asp в корневой папке нашего сайта. Поместите в нее форму и назовите User. В этой форме создайте поля ввода Name (имя посетителя) и Password (пароль) и кнопку отправки данных.
Для регистрации посетителя в списке используется хорошо вам знакомое поведение insert Record. В самом деле, если список посетителей представляет собой таблицу базы данных, а сведения о каждом посетителе — запись в этой таблице, то именно этим поведением и стоит пользоваться. Создайте же его. Пусть содержимое поля ввода Name заносится в поле Name таблицы Users, а содержимое поля Password — в поле Password. Поле Grants,
в котором записываются права посетителя, получит значение по умолчанию "user" (обычный посетитель). А в качестве страницы, на которую будет выполнен переход после успешного добавления новой записи, задайте
Categories.asp — в этом случае новоиспеченный посетитель сразу сможет зарегистрироваться и просмотреть плоды нашего ума.
Вроде бы все прекрасно. Посетитель заходит на эту страницу, вводит данные о себе и сразу же получает доступ к сайту. Однако это та самая простота, которая хуже воровства. Почему? Сейчас увидим.
Предположим, какой-то посетитель успешно зарегистрировался на нашем сайте, получил к нему доступ и успешно же вышел с него. После этого на сайте регистрируется второй посетитель. И вводит то же самое имя, под которым уже зарегистрировался первый посетитель!
Если вы не предусмотрите специальных средств для недопущения совпадения имен посетителей (например, не сделаете поле таблицы, где хранится имя, уникальным), это может породить конфликт. А такие конфликты ни к чему хорошему не ведут — они ведут только к плохому!
Именно для недопущения таких случаев Dreamweaver предусматривает особое поведение check New username. Это поведение проверяет таблицу списка посетителей на предмет совпадения введенного в форме регистрации имени с уже имеющимися в таблице. Если введенного новым посетителем имени нет в таблице, поведение check New username запускает поведение insert Record, успешно добавляющее в список нового посетителя.
Давайте создадим поведение check New username. Но сначала проверим, действительно ли мы создали поведение insert Record.
Выберите в подменю User Authentication меню серверных поведений панели Server Behaviors пункт Check New Username. На экране появится диалоговое окно Check New Username.
В раскрывающемся списке Username Field выберите поле ввода, в котором вводится имя посетителя.
В поле ввода If Already Exists, Go To вводится интернет-адрес страницы, на которую будет осуществлен переход, если в списке будет найден посетитель с таким именем. Введите в это поле имя страницы регистрации Register.asp. Вы также можете нажать кнопку Browse и выбрать нужную страницу в диалоговом окне Select File.
Завершив ввод данных, нажмите кнопку ОК. И сохраните готовую страницу.
Осталось сделать совсем немного. А именно — поместить на страницу входа на сайт Login.asp гиперссылку, указывающую на страницу регистрации. Это нужно для того, чтобы новый посетитель сайта смог сразу же после открытия его зарегистрироваться в списке. Сделайте это.
Теперь можете проверить готовую страницу в действии. Опубликуйте сайт на Web-сервере, откройте в Web-обозревателе страницу входа Login.asp, зарегистрируйтесь на сайте под другом именем, скажем, "User", и попробуйте войти на сайт.
Реализация поиска высказываний
Все сайты, публикующие информацию из баз данных, предусматривают возможность поиска записей на основе какого-либо критерия. Давайте и мы сделаем возможность поиска высказываний по введенному посетителем слову.
Чтобы посетитель смог ввести слово для поиска, нам нужно создать где-то форму. Давайте поместим ее на странице списка категорий Categories.asp под собственно списком категорий, в новом текстовом абзаце. Назовем форму Search, поле ввода слова для поиска — content и не забудем о кнопке отправки данных.
Теперь выделим форму и с помощью редактора свойств введем следующие параметры:
Action — имя страницы, отображающей результаты поиска, а именно -Result.asp;
Method — метод отправки данных, в нашем случае — GET;
Enctype — кодировка отправляемых данных, а именно — appiication/x-www-form-urlencoded.
Теперь, если посетитель введет слово и нажмет кнопку отправки данных, это слово будет отправлено странице Result.asp как параметр гиперссылки Content.
Далее нужно создать страницу отображения результатов поиска. Создадим ее на основе уже существующей страницы списка высказываний Sen-tences.asp. Для этого откроем ее и сохраним под именем Result.asp в корневой папке сайта. После этого откроем новую страницу.
В панели Bindings удалим параметр гиперссылки ID, если он там есть. После этого откроем диалоговое окно Recordset и изменим кое-какие параметры фильтра. В раскрывающемся списке Filter выберем пункт Content (имя поля, по которому мы будем осуществлять поиск) а в раскрывающемся списке, расположенном правее, — пункт contains (поле должно содержать введенное посетителем слово). Далее в списке, расположенном ниже, выберем пункт URL Parameter (параметр, переданный методом GET), а в поле ввода, расположенном ниже и правее, введем имя этого параметра — Content. И нажмем кнопку ОК.
Сохраним страницу Result.asp и опубликуем сайт на Web-сервере. Войдем на сайт, введем в форму поиска какое-либо слово и нажмем кнопку отправки данных. В результате мы получим страницу со списком найденных высказываний.
Все, наш сайт готов!
Вы можете расширить его. Например, сделать Web-интерфейс для работы со списками категорий и посетителей. Также вы можете добавить дизайнерские изыски — этим мы не занимались вообще. В общем, поработайте над сайтом, практика пойдет вам на пользу.