Мы будем писать серверные программы! Долго, очень долго мы шли к этому счастливому моменту. Изучали язык HTML, принципы Web-дизайна, таблицы стилей, формы и основы серверного программирования. Но все это в прошлом. Теперь мы готовы к будущему.
Мы полны сил. Нами движут лучшие помыслы. Наш Dreamweaver рвется в бой. Наш Web-сервер установлен и правильно настроен. (О том, как настраивать Microsoft Personal Web Server и Internet Information Server, читайте в поставляемой с ними документации.) Наш "статичный" Web-сайт давно работает и пользуется огромной популярностью. Наш кофе давно сварен и медленно остывает в чашке. Все готово к тому, чтобы сделать первый шаг в серверное программирование.
Ух, что мы сейчас сделаем! Какие мечты воплотим в жизнь! Мечтать — так мечтать, как говорил один из героев Александра Грина.
Ну, что ж, начнем, пожалуй. Только сначала подготовим почву для экспериментов. Давайте создадим гостевую книгу для нашего первого сайта Sample site 1. Сделаем так, чтобы посетители его смогли оставлять на особой страничке свои замечания и пожелания. Соответственно, для этого нам понадобится создать еще две Web-страницы: страницу, где выполняется ввод пожеланий и замечаний, и страницу, где уже введенные пожелания и замечания будут отображаться. Разумеется, это будут активные серверные страницы.
Подготовкак созданию серверных приложений
Давайте еще раз вспомним, что нам нужно для создания серверных приложений (точнее, активных серверных страниц) в среде Dreamweaver.
Полностью настроенный Web-сервер. Учтите, что, возможно, вам придется включить в его настройках поддержку серверных страниц. Хотя, если вы пользуетесь одним из Web-серверов фирмы Microsoft, вам не нужно это делать — в их настройках это включено по умолчанию.
База данных, если ваше приложение будет работать с данными. Возможно, вам придется заполнить ее какими-то данными, хотя бы для отладки создаваемых вами серверных приложений.
Правильно занесенные в Dreamweaver сведения о Web-сайте. Итак, что мы уже имеем?
Как говорилось ранее, мы имеем настроенный Web-сервер. (Не будем описывать его установку и настройку. Учитесь читать инструкции — хороший системный администратор просто обязан это уметь.) Он нормально работает со статичными Web-страницами, а большего от него в данный момент и не требуется.
Вообще-то Web-сервер для разработки серверных страниц не очень-то и нужен. Чтобы просто "рисовать" страницы, вам будет достаточно только Dreamweaver. Web-сервер понадобится, когда вы начнете тестировать работу ваших страниц, или если вы захотите воспользоваться режимом просмотра "живых" данных Dreamweaver (об этом режиме мы поговорим позже). Так что пока можете особо не торопиться с Web-сервером (хотя и мешкать с его установкой тоже не стоит).
Теперь о базах данных. Ими мы займемся потом, чуть позже. Предположим, что вы умеете пользоваться какой-либо СУБД (системой управления базами данных), например Microsoft Access. Именно Access мы и будем пользоваться для создания баз данных, благо это лучшая на сегодняшний момент клиентская СУБД. Впрочем, если вы предпочитаете другую программу, можете пользоваться ей.
И, напоследок, о регистрации Web-сайта в Dreamweaver.
Когда вы регистрируете сайт, Dreamweaver предполагает, что он не будет содержать активные серверные страницы. Это правильно — в конце концов, не все сайты используют серверные программы в том или ином виде. Поэтому изначально стоит скрыть возможности по их созданию, если Web-дизайнер специально не "попросит".
Давайте же "попросим" Dreamweaver разрешить нам использовать в нашем сайте серверные страницы. Точнее, потребуем. Да так, чтобы он не смог отказаться.
"Просьба" наша будет заключаться в том, чтобы задать некоторые дополнительные настройки нашего сайта Sample site 1. Выберем его в списке панели Site и вызовем диалоговое окно Site Definition. Как это сделать,' подробно описано в главе 6.
Далее переключимся на вкладку Testing Server. To, что мы увидим, показано на рис. 17.1.
Рис. 17.1. Диалоговое окно Site Definition (вкладка Testing Server)
С помощью раскрывающегося списка Server Model задается используемая нами технология серверных страниц. Здесь доступны следующие пункты:
None — технология серверных страниц не используется (значение по умолчанию);
ASP JavaScript — используется Microsoft ASP и язык программирования JavaScript;
ASP VBScript — используется Microsoft ASP и язык программирования VBScript;
ASP.NET C# — используется Microsoft AS P.NET и язык программирования С#;
ASP.NET VB — используется Microsoft ASP.NET и язык программирования VBScript;
ColdFusion — используется Macromedia ColdFusion;
JSP — используется Netscape JSP;
PHP MySQL — используется PHP совместно с сервером баз данных MySQL.
Выберите в этом списке пункт ASP JavaScript.
Раскрывающийся список This site contains доступен только в случае, если в списке Server Model выбран пункт ColdFusion. Мы не будем его здесь рассматривать.
В раскрывающемся списке Access выбирается способ отправки серверных страниц Web-серверу. В нем доступны три пункта:
None — серверные страницы не отправляются Web-серверу;
FTP — отправка страниц по протоколу FTP;
Local/Network — отправка страниц по локальной сети. Также выбирается, если Web-сервер работает на клиентском компьютере, как в нашем случае.
Выберите пункт Local/Network.
Остальные элементы управления были описаны в главе 6. Поэтому мы не будем на них останавливаться.
Задав нужные параметры, нажмите кнопку ОК. Все, теперь Dreamweaver готов к работе с серверными страницами.
Установление соединения с базой данных
Следующее, что нам нужно сделать, — это установить соединение с базой данных. Это надо для того, чтобы Dreamweaver смог создать необходимые для работы с данными сценарии. (Имейте в виду, что в данном случае речь идет о серверных сценариях.) Процесс соединения с базой данных мы рассмотрим пошагово.
Но сначала нам нужно подготовить саму базу данных, где будут храниться записи нашей гостевой книги. Создайте ее в Microsoft Access. Поместите в нее единственную таблицу Guestbook, содержащую единственное текстовое поле content. Сам файл базы данных назовите так же, как таблицу — Guestbook.mdb. Поместите ее в какую-либо папку, но не в папку, где хранятся файлы локальной копии вашего сайта, иначе Dreamweaver опубликует ее на Web-сервере "за компанию" с Web-страницами и прочими файлами.
Внимание!
Никогда не публикуйте файлы базы данных на Web-сервере, особенно если она содержит секретные данные! Если вы все же это сделаете, любой достаточно грамотный пользователь Интернета сможет загрузить ее на свой компьютер и прочитать все, что в ней хранится. База данных не должна быть доступна извне!
Внимание!
Пользователям операционных систем Windows NT, 2000 и ХР. При установке Web-сервер Internet Information Server создает пользователя под именем IUSR_сетевое имя вашего компьютерах Проверьте, имеет ли этот пользователь полные права для доступа к папке, где хранится файл вашей базы данных, иначе при попытке доступа к ней из серверной страницы вы получите сообщение об ошибке. (Учтите — ко всей папке, а не к самому файлу базы данных!) Как дать пользователю права доступа к папке, описано в документации Windows.
Создание источника данных ODBC
Для доступа к базам данных Web-серверы фирмы Microsoft, да и многие другие программы, используют механизм ODBC (Open DataBase Connectivity — открытое соединение с базой данных). ODBC-- универсальный механизм доступа к базам данных любого формата, встроенный в операционные системы Windows. А раз он встроен, то грех им не воспользоваться, тем более что он предоставляет достаточно мощные средства для извлечения данных и управления ими.
Чтобы получить доступ к данным с помощью ODBC, сначала нужно создать так называемый источник данных ODBC — своего рода "пропуск" к базе данных, которым будут пользоваться использующие ее программы. Источник данных ODBC содержит сведения о том, где находится файл или файлы базы данных, и в каком формате она (база данных) хранится. Кроме того, там же содержатся имя и пароль пользователя, используемые для подключения к серверу данных, и некоторые другие необязательные параметры.
Сейчас давайте рассмотрим, как создается источник данных ODBC.
Само собой, здесь приводится только краткое описание и уж тем более не показаны все параметры, хранящиеся в источнике. Если вы хотите узнать больше о ODBC, поищите соответствующую документацию на сайте http://msdn.microsoft.com. А здесь ограничимся только кратким описанием, без которого в данном случае нам не обойтись, и опустим все "излишества".
Итак, первым делом нужно вызвать апплет Панели управления Windows под названием Источники данных (ODBC). (В других операционных системах он может называться по-другому, например, ODBC; в любом случае, эта аббревиатура должна присутствовать в его названии.) Просто вызовите окно Панели управления и щелкните по значку с соответствующей надписью.
После этого на экране появится окно Администратор источников данных ODBC. Сразу же переключитесь на вкладку Системный DSN (рис. 17.2).
Рис. 17.2. Диалоговое окно Администратор источников данных ODBC (вкладка Системный DSN)
Чтобы добавить новый источник данных, нажмите кнопку Добавить. После этого на экране появится диалоговое окно Создание нового источника данных, показанное на рис. 17.3.
В списке, занимающем все это окно, выберите драйвер, соответствующий формату вашей базы данных. (Драйвер — это небольшая программа, непосредственно работающая с базой данных. Для каждого формата баз данных существует свой драйвер ODBC, в то время как остальные компоненты ODBC едины для всех форматов.) В нашем случае — это пункт Microsoft Access Driver (*.mdb). Выбрав его, нажмите кнопку Готово.
Рис. 17.3. Диалоговое окно Создание нового источника данных
Диалоговые окна сыплются на нас, как осенние листья. Следующее — это окно Установка драйвера ODBC для Microsoft Access, показанное на рис. 17.4. В нем задаются собственно параметры вашей базы данных.
Рис. 17.4. Диалоговое окно Установка драйвера ODBC для Microsoft Access
В поле ввода Имя источника данных задается уникальное имя источника данных. Оно необходимо для того, чтобы программы, использующие эту базу данных, получили доступ к ее источнику. Введите в него что-нибудь наподобие Guestbook.
В поле ввода Описание вы можете ввести развернутое описание создаваемого источника данных. Вообще-то, это необязательно.
Осталось только задать путь к файлу базы данных. Нажмите кнопку Выбрать, выберите нужный файл в появившемся на экране диалоговом окне открытия файла Windows и нажмите кнопку открытия.
Задав все данные, нажмите кнопку ОК. После этого созданный вами источник данных появится в списке Системные источники данных, занимающем почти всю вкладку Системные DSN (см. рис. 17.2). Теперь можно закрыть окно Администратор источников данных ODBC, нажав кнопку ОК.
Если вы случайно ввели не те данные, выберите в списке Системные источники данных нужный пункт и нажмите кнопку Настройка. Также вы можете просто дважды щелкнуть по нужному пункту этого списка. На экране появится диалоговое окно Установка драйвера ODBC для Microsoft Access; исправьте данные и нажмите кнопку ОК. Чтобы удалить ненужный источник данных, выберите необходимый пункт в списке и нажмите кнопку Удалить. Далее на экране появится небольшое окно-предупреждение; нажмите кнопку Да.
На этом создание источника данных ODBC можно считать законченным.
Регистрация базы данных в Dreamweaver
Наш следующий шаг — регистрация базы данных в среде Dreamweaver. Это нужно для того, чтобы Dreamweaver выяснил структуру базы данных, с которой мы будем работать, и смог создать необходимые серверные сценарии.
Но сначала давайте создадим нашу первую серверную страницу. Это будет страница AddRecord.asp, служащая для добавления записи в гостевую книгу. Чтобы создать ее, выберите пункт New в меню File, выберите в списке Category диалогового окна New Document пункт Dynamic Page, а в правом списке - пункт ASP JavaScript. После этого нажмите кнопку Create -и активная серверная страница будет создана.
Для того чтобы зарегистрировать базу данных в Dreamweaver, вам понадобится панель Databases. Если ее нет на экране, включите пункт-выключатель Databases меню Window или нажмите комбинацию клавиш <Ctrl>+<Shift>+<F10>. Сама эта панель показана на рис. 17.5.
Большую часть этой панели (как и многих других панелей Dreamweaver) занимает список уже зарегистрированных баз данных. Вы можете выбрать любой пункт этого списка и произвести над соответствующей ему базой данных различные манипуляции...
Нет, постойте! Ведь мы еще не зарегистрировали ни одной базы данных! Панель Databases показывает нам текст, описывающий шаги, необходимые для регистрации базы данных в Dreamweaver. Но, поскольку мы эти шаги уже выполнили, перейдем сразу к процессу регистрации.
Рис. 17.5. Панель Databases
Нажмите кнопку со знаком "плюс", расположенную над списком, и выберите в появившемся на экране меню пункт Data Source Name (DSN). На экране появится диалоговое окно Data Source Name (DSN) (рис. 17.6).
Рис. 17.6. Диалоговое окно Data Source Name (DSN)
В поле ввода Connection Name вводится уникальное имя зарегистрированной в Dreamweaver базы данных. Чтобы не ломать голову, введите здесь то же имя, что и у источника данных ODBC.
Сам источник данных выбирается в раскрывающемся списке Data Source Name (DSN). Нажав кнопку Define, вы можете вызвать окно Администратор источников данных ODBC и создать его, если не сделали этого ранее.
В поля ввода User Name и Password вводятся соответственно имя пользователя и пароль для подключения к серверу баз данных. В нашем случае они не нужны — оставьте эти поля пустыми.
Чтобы проверить правильность ввода данных, нажмите кнопку Test. После этого Dreamweaver попытается подключиться к вашей базе данных и выведет соответствующее окно-предупреждение. Если попытка подключения оказалась неудачной, исправьте введенные данные и повторите ее. Возможно, вам придется вызвать окно Администратор источников данных ODBC и
исправить параметры самого источника данных ODBC.
Введя все данные и проверив их на правильность, нажмите кнопку ОК. Если же вы передумали регистрировать базу данных, нажмите кнопку Cancel.
После этого зарегистрированная вами база данных появится в списке панели Databases в виде ветви иерархического списка (см. рис. 17.5). Вы можете развернуть ее и просмотреть ее содержимое. Все созданные вами таблицы находятся в подветви Tables. Также вы можете просмотреть, какие поля содержит та или иная таблица, ведь таблица тоже представляет собой ветвь списка.
Чтобы изменить параметры регистрации базы данных, выделите нужную ветвь списка и выберите пункт Edit Connection контекстного меню. На экране появится диалоговое окно Data Source Name (DSN), в котором вы сможете изменить эти параметры.
Чтобы удалить ненужную базу данных (в смысле, регистрацию), выделите необходимую ветвь списка и нажмите кнопку со знаком "минус" или выберите пункт Delete Connection контекстного меню. На экране появится окно-предупреждение; нажмите кнопку Да (Yes).
Если вы хотите зарегистрировать еще одну базу данных, сведения о которой не сильно отличаются от уже зарегистрированной, выделите уже зарегистрированную базу данных и выберите пункт Duplicate Connection контекстного меню. На экране появится диалоговое окно Data Source Name (DSN), в котором вы сможете задать параметры новой базы данных.
Пункт Test Connection позволит вам протестировать подключение к базе данных, аналогично кнопке Test диалогового окна Data Source Name (DSN).
Чтобы просмотреть данные, содержащиеся в какой-либо таблице зарегистрированной базы данных, выделите ветвь списка, соответствующую этой таблице, и выберите пункт View Data контекстного меню. На экране появится диалоговое окно View Data (рис. 17.7), в котором вы и увидите все содержимое этой таблицы. Сами данные отображаются в списке, занимающем почти все это окно. Нажимая кнопки Previous 25 и Next 25, вы можете просмотреть соответственно предыдущие или последующие 25 записей таблицы. Чтобы закрыть это окно, нажмите кнопку ОК.
Примечание
Dreamweaver создает в папке Connections корневой папки сайта активные серверные страницы, соответствующие каждой зарегистрированной вами базе данных. Эти страницы содержат только серверные сценарии и хранятся в файлах, чьи имена совпадают с именами, данными вам базам данных при регистрации. Не удаляйте их, иначе все зарегистрированные вами базы данных пропадут.
Рис. 17.7. Диалоговое окно View Data
Вот, собственно, и все. Мы подключились к базе данных и теперь можем приступить к созданию самой серверной страницы.
Созданиесерверных страниц в Dreamweaver
Сохраните готовую Web-страницу в файле AddRecord.asp и поместите ее в каталог HTMLs нашего сайта. Вы можете задать для нее те же свойства, что и для других страниц этого же сайта, и поместить в нее какой-либо поясняющий текст. Нет смысла описывать, как это делается — уж что-что, а делать обычные Web-страницы вы уже научились.
Создание простейших серверных страниц
Итак, мы хотим создать страницу, с помощью которой посетитель сайта может добавить новую запись в гостевую книгу. Для этого нам понадобится форма, состоящая из одного поля ввода, и серверный сценарий, точнее, серверное поведение, добавляющее введенный посетителем текст в поле
content таблицы Guestbook. Максимальная длина этого текста составит 50 символов (или какую там длину текстового поля content вы задали).
Давайте создадим форму, содержащую одно поле ввода и одну кнопку отправки данных. Назовем поле ввода content, а саму форму — AddRecord. Так мы не запутаемся в многочисленных названиях. Остальные параметры формы мы задавать не будем — это сделает за нас Dreamweaver.
Итак, создайте эту форму. Она будет очень проста — см. рис. 17.8.
Рис. 17.8. Форма добавления новой записи в гостевую книгу
Следующий шаг — создание серверного поведения, выполняющего добавление записи в таблицу.
Для работы с поведениями нам понадобится панель Server Behaviors (рис. 17.9). Чтобы вызвать ее на экран, включите пункт-выключатель Server Behaviors в меню Window или нажмите комбинацию клавиш <Ctrl>+<F9>.
Рис. 17.9. Панель Server Behaviors
Как обычно, большую часть этой панели занимает список уже созданных поведений. Также эта панель имеет кнопки со знаками "плюс" и "минус", соответственно, добавляющую и удаляющую поведения.
Чтобы создать новое серверное поведение, нужно щелкнуть кнопку со знаком "плюс" и выбрать необходимый пункт в появившемся на экране меню серверных поведений. Поведение, добавляющее запись в таблицу, создается выбором пункта Insert Record. После выбора этого пункта на экране появляется диалоговое окно Insert Record.
В раскрывающемся списке Connection выбирается нужная база данных, а в раскрывающемся списке Insert Into Table — таблица, куда будет добавлена запись.
В поле ввода After Inserting, Go To вводится интернет-адрес Web-страницы, на которую будет выполнен переход после успешного добавления записи в таблицу. Вы также можете нажать кнопку Browse и выбрать нужный файл в диалоговом окне Select File.
В раскрывающемся списке Get Values From выбирается форма, из которой берутся значения для новой записи.
В списке From Elements перечислены все элементы управления, находящиеся в выбранной форме. Вы можете выбрать любой из них и задать для него поле таблицы, куда будут помещены содержащиеся в нем данные, и тип отправляемых данных (текст, число, дата и т. п.).
Поле таблицы выбирается в раскрывающемся списке Column. Пункт <ignore> этого списка позволяет проигнорировать значение этого элемента управления (т. е. оно не будет1 помещено в поле таблицы).
Тип отправляемых данных указывается в раскрывающемся списке 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 MSAccess - логическое значение, предназначенное для Microsoft Access.
Задав все нужные данные, не забудьте нажать кнопку ОК. После этого в списке панели Server Behaviors появится новое поведение. А готовая форма добавления записи в гостевую книгу будет подобно рис. 17.10. Как видите, Dreamweaver поместил в него скрытое поле, специально для своих нужд.
Рис. 17.10. Готовая форма добавления записи в гостевую книгу
Теперь вы можете проверить созданную Web-страницу в действии. Сохраните ее, запустите Web-сервер, если он еще не запущен, и откройте страницу в Web-обозревателе.
Попробуйте ввести в поле ввода какой-нибудь текст и нажать кнопку Добавить. После этого откройте базу данных Guestbook.mdb в Access и посмотрите, что получилось. В таблице Guestbook должна появиться новая запись, введенная вами.
Если хотите, можете просмотреть исходный код созданной нами серверной страницы. Видите, сколько сценариев JavaScript добавил в нее умница Dreamweaver, чтобы мы смогли добавить запись в таблицу! Пользуясь им и документацией по языку JavaScript и технологии ASP, вы сможете изучить принципы написания серверных сценариев вручную.
Но все это потом. Теперь нам пора сделать следующий шаг к вершинам серверного программирования.
Более сложные серверные страницы
Какой толк в гостевой книге, если посетители сайта не могут просмотреть все записи, добавленные в нее ранее! (Если, конечно, это не "закрытая" книга, только для "своих".) Поэтому давайте сделаем страницу для просмотра этих записей. Создадим новую серверную страницу ASP и сохраним ее под именем Guestbook.asp. И приступим...
Создание набора данных
Но прежде чем приступим собственно к дизайну, нам нужно выполнить одно подготовительное действие — создать набор данных. Набор данных — это условие выборки данных с указанием таблиц и полей, из которых будут извлекаться данные. При этом также возможно задание фильтра — условия отбора данных из записей. После создания набора данных уже можно приступать к серверной странице, отображающей данные.
Для работы с наборами данных нам понадобится еще одна панель, не рассмотренная ранее, - Bindings. Чтобы вызвать эту панель на экран, включите пункт-выключатель Bindings меню Window или нажмите комбинацию клавиш <Ctrl>+<F10>.
Эта панель также состоит, в основном, из списка уже созданных к данному времени наборов данных. Изначально она, однако, содержит только нравоучительный текст, перечисляющий нерадивым Web-программистам шаги, которые они должны пройти перед тем, как смогут создать свой первый набор данных. Но мы-то их уже прошли! Поэтому сразу же перейдем к созданию нашего первого набора данных.
Нажмите неизменную кнопку со знаком "плюс", находящуюся в этой панели, и выберите в появившемся на экране меню пункт Recordset (Query). Также вы можете нажать кнопку Recordset вкладки Application панели объектов или выбрать пункт Recordset подменю Application Objects меню Insert. На экране появится диалоговое окно Recordset
Рис. 17.11. Кнопка Recordset панели объектов
Рис. 17.12. Диалоговое окно Recordset
В поле ввода Name вводится уникальное имя создаваемого набора данных. Введите в него, например, AddRecord. Так будет сразу понятно, зачем нужен этот набор данных.
В раскрывающемся списке Connection выберите зарегистрированную базу данных. Вы также можете нажать кнопку Define; на экране появится диалоговое окно Data Source Name (DSN), с помощью которого вы сможете зарегистрировать базу данных, если не сделали это ранее.
В раскрывающемся списке Table выберите нужную таблицу зарегистрированной базы данных. Впрочем, она у нас всего одна — Guestbook.
Группа переключателей Columns позволит вам извлечь данные из всех полей выбранной таблицы или только из некоторых. Если вы включите переключатель All (вообще-то он включен по умолчанию), данные будут извлечены из всех полей таблицы. Чтобы извлечь данные только из некоторых полей, включите переключатель Selected и выберите нужные поля в списке, расположенном ниже. Чтобы выбрать сразу несколько пунктов, щелкайте по ним, удерживая нажатой клавишу <Ctrl>.
Чтобы проверить, правильно ли введены параметры, нажмите кнопку Test. После этого на экране должно появиться диалоговое окно Test SQL Statement, похожее на уже знакомое вам окно View Data. Если параметры набора данных введены неправильно, Dreamweaver выдаст вам соответствующее окно-предупреждение.
Элементы управления, расположенные в нижней части окна Recordset и предназначенные для задания фильтров, мы рассмотрим позднее. Сейчас же просто нажмите кнопку ОК.
После того как вы создадите новый набор данных, он появится в панели Bindings в виде ветви иерархического списка. Эта ветвь будет содержать все поля созданного набора данных, а также некоторые дополнительные поля, которые не берутся из таблицы, а вычисляются самим процессором баз данных. Такие поля называются системными. Давайте их перечислим.
[first record index] — номер первой записи набора, показываемой на текущей странице.
[last record index] — номер последней записи набора, показываемой на текущей странице.
[total records] — количество записей в наборе.
Вы можете использовать системные поля на своих страницах наряду с обычными полями таблицы.
Если вы хотите исправить параметры какого-либо набора данных, дважды щелкните по нужной строке списка. Учтите, что щелкать надо по начальному пункту ветви. После этого на экране появится диалоговое окно Recordset, в котором вы сможете изменить необходимые параметры.
Чтобы удалить ненужный набор данных, выделите соответствующий пункт и нажмите кнопку со знаком "минус".
А теперь поговорим о свойствах набора данных. Чтобы увидеть их, вам сначала нужно выделить соответствующий пункт списка панели Bindings. Но обычно этого мало — редактор свойств так же будет отображать параметры страницы, открытой в окне документа. Поэтому дважды щелкните по нужному набору данных в списке, чтобы вызвать диалоговое окно Recordset. и тут же закройте его, щелкнув кнопку Cancel. Только после этого редактор свойств наконец-то покажет параметры набора данных.
В поле ввода Recordset вводится имя набора данных.
Текстовое поле Connection отображает имя зарегистрированной базы данных, из которой будут извлекаться записи данного набора. Вы можете нажать кнопку Edit; на экране появится диалоговое окно Recordset, в котором вы сможете изменить параметры набора данных.
В поле ввода SQL отображается текст запроса на языке SQL, сформированный Dreamweaver. В данный момент там находится следующий текст:
SELECT * FROM Guestbook
Разберем его пословно:
SELECT — ключевое слово, задающее набор полей;
* (звездочка) обозначает все поля таблицы;
FROM — ключевое слово, задающее таблицу;
Guestbook — таблица.
Как видите, запросы на языке SQL напоминают фразы английского языка. И, в общем-то, они довольно понятны, "прозрачны", как говорят.
Раскрывающийся список Cursor Type служит для задания типа набора данных. В нем доступны четыре пункта:
Static — статический набор данных, содержащий только те записи таблицы, которые присутствовали в ней на момент выборки. Доступен только для чтения;
Forward Only — однонаправленный статический набор данных, по которому можно перемещаться только по направлению от первой записи к последней, но не обратно. Обеспечивает более высокое быстродействие, чем простой статический набор данных. Этот пункт выбран по умолчанию;
Dynamic — динамический набор данных, содержащий все записи таблицы и отражающий все изменения, добавления и удаления, сделанные другими пользователями базы данных. Доступен как для чтения, так и для записи;
Keyset — ограниченный динамический набор данных, не отражающий добавления и удаления, сделанные другими пользователями базы данных.
Раскрывающийся список Cursor Location задает местонахождение набора данных, в смысле, где он обрабатывается: на стороне клиента (пункт Client) или на стороне сервера (пункт Server). По умолчанию выбран пункт Server, и это правильно — ведь мы создаем серверное приложение.
Раскрывающийся список Lock Type задает тип блокировки. Блокировка используется для того, чтобы ограничить доступ к записи, изменяемой каким-либо пользователем базы данных, другим пользователям. Если блокировку не использовать, может произойти конфликт изменения данных, когда одновременно несколько пользователей будут пытаться сохранить изменения, сделанные в одной и той же записи. Здесь доступны четыре пункта:
Read Only — записи набора доступны только для чтения;
Pessimistic — пессимистическая блокировка, когда запись блокируется, как только пользователь начинает изменять значения ее полей. Как только пользователь сохранит изменения, блокировка снимается;
Optimistic — оптимистическая блокировка, когда запись блокируется только на момент записи в нее новых значений;
Batch Optimistic — разновидность оптимистической блокировки, используемой при операциях изменения сразу нескольких записей.
Задайте для нашего набора данных динамический тип (пункт Dynamic раскрывающегося списка Cursor Type) и оптимистическую блокировку (пункт Optimistic раскрывающегося списка Lock Type), т. к. мы будем создавать страницу, добавляющую в таблицу новую запись. Остальные элементы управления пока не трогайте.
Страница, отображающая данные
Серверную страницу, отображающую данные, создать проще простого. После того как мы создали набор данных, нам остается только перетаскивать в страницу нужные поля из панели Bindings — a Dreamweaver сделает все остальное.
Итак, откройте страницу Guestbook.asp, если вы ее еще не открыли. И поместите в нее динамический текст, отображающий содержимое поля таблицы Guestbook. Можете считать, что динамический текст — своего рода изменяемая область шаблона, содержимое которой будет взято из заданного вами поля таблицы.
Как это сделать? Как уже было сказано, просто перетащив нужное поле (в нашем случае — Content) из панели Bindings на Web-страницу. Если вы уже закрыли эту панель, то можете щелкнуть кнопку Dynamic Text (рис. 17.13) вкладки Application панели объектов или выбрать пункт Dynamic Text подменю Application Objects меню Insert. После этого на экране появится диалоговое окно Dynamic Text. Выберите нужный пункт в иерархическом списке Field и нажмите кнопку ОК.
Рис. 17.13. Кнопка Dynamic Text панели объектов
Созданный нами динамический текст выглядит не очень вдохновляюще . Просто какой-то текст, заключенный в фигурные скобки и выделенный голубым цветом. Чтобы познать его скрытую силу, нам нужно наполнить его реальными данными. А для этого необходимо загрузить страницу в Web-обозревателе...
Рис. 17.14. Динамический текст, отображающий содержимое поля Content таблицы Guestbook
Но не хочется нам открывать этот Web-обозреватель! Не хочется, и все тут. Ведь Dreamweaver имеет встроенные средства просмотра серверных Web-страниц в том виде, в каком они будут отображены в Web-обозревателе, вместе со всеми данными. Это так называемый режим показа "живых" данных. И сейчас мы выясним, как в него переключиться.
А сделать это проще простого. Нажмите кнопку-выключатель Live Data View в инструментарии документа. Если вы убрали этот инструментарий с экрана, включите пункт-выключатель Live Data в меню View или нажмите комбинацию клавиш <Ctrl>+<Shift>+<R>. После этого Dreamweaver запросит данные из базы и выведет открытую в окне документа страницу в своем "настоящем" виде (рис. 17.5).
Рис. 17.5. Страница Guestbook.asp, отображаемая при включенном режиме показа "живых" данных
Тарабарщина, которую вы видите на этом рисунке, — содержимое поля content первой записи таблицы Guestbook. Это отладочные данные, введенные автором, чтобы проверить, как работает серверная страница.
Да, но где остальные записи?
Дело в том, что динамический текст показывает только cодержимое одной — текущей — записи набора данных. Чтобы увидеть все остальные записи, вам нужно будет переместиться на них. Как это сделать? Сейчас мы узнаем.
Создание навигатора
Для перемещения по записям набора данных нужен особый элемент Web-страницы, называемый навигатором. Он состоит из набора гиперссылок или кнопок, выполняющих перемещение на первую, предыдущую, последующую и последнюю записи набора. Если вы много работаете в Microsoft Access, вы должны помнить нечто подобное, расположенное в самом низу окна таблицы, а именно — набор из четырех вышеупомянутых кнопок и поля ввода номера записи.
Dreamweaver предлагает нам встроенные средства создания навигатора, состоящего из гиперссылок. Давайте воспользуемся ими. Но сначала поставим текстовый курсор в конец созданного нами ранее динамического текста и нажмем клавишу <Enter>.
Чтобы создать гиперссылку и серверное поведение, выполняющие переход на первую запись набора, выберите пункт Move To First Record в подменю Recordset Paging меню серверных поведений панели Server Behaviors. На экране появится диалоговое окно Move To First Record.
В раскрывающемся списке Recordset выберите нужный набор данных и нажмите кнопку ОК. Dreamweaver создаст в месте, где находится текстовый курсор, гиперссылку с текстом "First". Замените ее текст на что-нибудь русскоязычное (например, "Первая") или более понятное ("<<"). Все, на этом создание гиперссылки, выполняющей переход на первую запись набора, закончено.
Поставьте после гиперссылки "<<" два-три неразрывных пробела, нажав нужное количество раз комбинацию клавиш <Сtrl>+<Shift>+<пробел>. Так мы отделим одну гиперссылку навигатора от другой.
Чтобы создать поведение, выполняющее переход на предыдущую запись набора, выберите пункт Move To Previous Record в подменю Recordset Paging меню серверных поведений. На экране появится диалоговое окно Move To Previous Record, аналогичное окну Move To First Record. Точно так же выберите в раскрывающемся списке Recordset нужный набор данных, нажмите кнопку ОК и замените текст созданной гиперссылки на "<". Поставьте после второй гиперссылки два-три неразрывных пробела. И продолжим.
Поведения, выполняющие переход на последующую и последнюю записи набора, создаются путем выбора пунктов Move To NextRecord и Move To Last Record соответственно. Одноименные диалоговые окна полностью схожи с окном Move To First Record. Так что никаких неожиданностей не должно возникнуть.
Результат наших трудов показан на рис. 17.6. Проверьте, все ли у вас получилось.
Поведения для навигатора можно создавать и по-другому. Напишите текст, который станет одной из гиперссылок навигатора, выделите его и выберите в меню серверных поведений нужный пункт. После этого введите необходимые параметры в появившееся на экране диалоговое окно и нажмите кнопку ОК. Так даже проще — вам не придется исправлять в конце текст гиперссылки.
Рис. 17.6. Готовая страница Guestbook.asp с навигатором
Сохраните готовую серверную страницу. К сожалению, проверить ее в режиме просмотра "живых" данных у нас не получится: хоть Dreamweaver и заменит динамический текст реальными данными, гиперссылки навигатора работать не будут. Поэтому придется все-таки открыть ее в окне Web-обозревателя. Попробуйте пощелкать по ссылкам и посмотрите, как меняется содержимое динамического текста.
Создание строки статуса набора данных
Вспомните окно таблицы Microsoft Access. Возле навигатора там отображается небольшое текстовое поле с номером текущей записи и общим количеством записей в таблице. Давайте сделаем такое же поле и на нашей серверной страничке, т. е. создадим строку статуса набора данных.
А для этого нам понадобятся системные поля этого самого набора данных. Напомним, что это такое. Системным полем набора данных называется поле, не взятое из таблицы, на основе которой создан этот набор, а созданное самим процессором баз данных и отображающее какую-либо служебную информацию. Таких системных полей Dreamweaver предлагает три: [firs-record index] (номер первой записи набора, показываемой на текущей странице), [last record index] (номер последней записи, показываемой на текущей странице) и [total records] (общее количество записей в наборе). И все они отображаются в панели Bindings в виде одноименных пунктов (см. рис. 17.13).
Итак, поставьте текстовый курсор после самой последней гиперссылки навигатора и нажмите клавишу <Enter>. В новом текстовом абзаце наберите текст "Запись" и поставьте после него неразрывный пробел. Именно здесь мы и создадим новый динамический текст, связанный с системным полем [first record index]. Как это сделать, вы знаете. Впрочем, если вы хотите, можете привязать этот динамический текст к полю [last record index] — все равно на нашей странице отображается только одна запись.
Теперь поставьте обычный пробел, введите текст "из", поставьте неразрывный пробел и создайте второй динамический текст, привязанный к системному ПОЛЮ [total records]. Вот И все.
Рис. 17.7. Готовая страница Guestbook.asp с навигатором и строкой статуса набора данных
Готовая страница Guestbook.asp с навигатором и строкой статуса показана на рис. 17.7. Сохраните ее и откройте в Web-обозревателе, чтобы проверить работу строки статуса.
Страница для одновременного просмотра нескольких записей
Ох и хорошая у нас получилась серверная страничка! (Не смотрите, что выглядит она весьма коряво, ведь сейчас наша задача — научиться писать серверные страницы. Впрочем, Web-дизайн мы уже "прошли", так что можете по ходу дела заняться украшательством.) Одно плохо — показывает она только одну запись набора. Конечно, мы создали навигатор и строку статуса набора данных, но толку от них не очень много. Вот как бы нам "запихать" на одну страничку сразу несколько записей!..
Что, вы хотите несколько записей на одной странице? Запросто!
Создайте новую серверную страницу и сохраните ее в файле Guestbook_table.asp. Именно ее мы и превратим в чудо современного программистского искусства, показывающего несколько записей одновременно.
Первым делом создадим набор данных с такими же, как и у страницы Guestbook.asp, параметрами. Назовем его так же — Guestbook. После этого поместим на страницу динамический текст, привязанный к полю content набора данных. И напоследок поставим текстовый курсор в конце этого динамического текста и нажмем клавишу <Enter>. Все это вам уже знакомо.
А теперь остановимся. И поговорим.
Что мы видим в окне документа? Ничего странного — просто серверная Web-страница, похожая на созданную нами ранее Guestbook.asp. Набор данных, динамический текст -- и все. Если теперь открыть ее в Web-обозревателе, она отобразит нам одну-единственную запись. Мы уже это наблюдали.
Да, но нам нужны несколько записей на одной странице!
Для этого нам поможет уже знакомая вам возможность, предлагаемая Dreamweaver специально для таких случаев, — повторяющаяся область.
Да-да, нашу серверную страничку можно уподобить шаблону! В самом деле, в Dreamweaver мы создали своего рода образец Web-страницы, который в дальнейшем будет наполняться полезным содержимым. Только делать это будет не Web-дизайнер, а серверный сценарий. И данные он будет брать не из своей головы (или головы Web-писателя), а из базы данных.
Чтобы создать повторяющуюся область, сначала выделите фрагмент страницы, который станет ее содержимым. В нашем случае — это динамический текст, привязанный к полю Content набора данных. Затем выберите пункт Repeat Region меню серверных поведений панели Server Behaviors. После этого на экране появится диалоговое окно Repeat Region.
В раскрывающемся списке Recordset выберите набор данных, из которого будут извлекаться записи.
Если вы хотите, чтобы на странице отображались все записи набора данных, включите переключатель All Records группы Show. Это стоит делать тогда, когда вы уверены, что записей в вашем наборе не очень много, или если содержимое их невелико по размеру. В противном случае лучше всего показывать содержимое набора данных по частям; для этого включите верхний переключатель группы Show и введите количество одновременно отображаемых записей в поле ввода Records at a Time.
Давайте сделаем нашу страничку как можно меньше. Для этого зададим количество одновременно отображаемых записей, равное трем. Это позволит нам не вводить слишком много отладочных записей в таблицу Guestbook базы данных Guestbook.mdb.
Введя все данные, нажмите кнопку ОК. Если вы передумали создавать повторяющуюся область, нажмите кнопку Cancel.
Если теперь включить режим показа "живых" данных Dreamweaver, мы увидим следующее — см. рис. 17.8. Как видите, она "выдала" нам содержимое всех трех записей, что есть в таблице Guestbook.
Рис. 17.8. Повторяющаяся область серверной страницы при включенном режиме показа "живых" данных
Теперь осталось добавить к нашей странице навигатор. Конечно, это будет не такой навигатор, который мы создали ранее. В данном случае нам нужно перемещаться не от записи к записи, а от страницы к странице. Но вам не нужно об этом беспокоиться — все хлопоты по отсчету необходимого количества записей возьмет на себя Dreamweaver. Поэтому просто создайте навигатор, как мы делали это раньше.
Если хотите, вы можете создать также строку статуса для набора данных. Здесь вам понадобятся оба системных поля, отображающих количество показываемых на странице записей: [first record index] И [last record index]. Как вы помните, первое из них показывает номер первой записи, присутствующей на странице, а вторая — номер последней из показываемых записей.
Осталось сказать о параметрах повторяющейся области. Чтобы задать их, выделите нужную повторяющуюся область и посмотрите на редактор свойств.
Единственный элемент управления, который стоит здесь рассмотреть, — это поле ввода Repeat Region. В нем задается имя повторяющейся области. Остальные элементы управления знакомы вам по диалоговому окну Repeat Region.
Привязка элементов управления к данным
А сейчас мы рассмотрим еще одну очень интересную возможность — привязку элементов управления к данным. Это значит, что вы можете, скажем, заполнять списки значениями, взятыми из записей набора данных, или заимствовать оттуда же начальные значения для полей ввода. Первое, во всяком случае, очень часто бывает нужно.
Давайте добавим в нашу гостевую книгу второе поле — тип записи. Тип записи будет показывать, что хотел сказать посетитель сайта: похвалить его разработчика, поругать или сделать нейтральное замечание. Соответственно, это поле может принимать три значения: положительное, нейтральное или отрицательное замечание.
Откроем базу данных Guestbook.mdb в Access и добавим в таблицу Guestbook еще одно поле sign. Зададим для него числовой тип. После этого создадим еще одну таблицу под названием signs, содержащую два поля: счетчик ID и текстовое Desc. В поле ID будет помещаться уникальный номер каждой записи, а в поле Desc — описание соответствующей оценки. Сделаем поле ID ключевым. После этого привяжем поле sign таблицы Guestbook к полю ID таблицы Signs.
Далее откроем таблицу signs и создадим в ней три записи: "Положительно", "Нейтрально" и "Отрицательно". Access автоматически проставит в полях ID уникальные номера этих записей. Теперь осталось открыть таблицу Guestbook и проставить в поле sign для всех записей какое-либо значение, неважно, какое. На этом подготовительные действия можно считать законченными. Закройте Access и вернитесь в Dreamweaver.
Откройте страницу AddRecord.asp. Поместите в форму новый элемент управления — раскрывающийся список sign. Вставьте его между полем ввода content и кнопкой отправки данных. И сохраните страницу.
Откуда будут браться значения для заполнения нашего списка? Правильно, из набора данных. Страница AddRecord.asp не содержит никаких наборов данных, поэтому нам нужно его создать.
Выберите в меню кнопки со знаком "плюс" панели Bindings пункт Recordset (Query). В диалоговом окне Recordset, которое появится на экране после этого, задайте имя создаваемого набора данных signs, выберите базу данных Guestbook и таблицу signs. После нажатия кнопки ОК набор данных будет создан.
Теперь выделите только что созданный нами раскрывающийся список signs и нажмите кнопку Dynamic, которая появится в редакторе свойств (рис. 17.9). На экране появится диалоговое окно Dynamic List/Menu, показанное на рис. 17.10.
Рис. 17.9. Кнопка Dynamic редактора свойств
Рис. 17.10. Диалоговое окно Dynamic List/Menu
В раскрывающемся списке Menu выбирается нужный список. Но, поскольку мы его уже выделили на форме, этот список недоступен.
В раскрывающемся списке Options From Recordset выбирается набор данных, из которого будут браться значения для заполнения выделенного списка. Пункт None позволит вам "отвязать" список от наборов данных, т. е. создать обычный список с фиксированным набором пунктов. Поле набора данных, из которого будут браться значения для создания пунктов, выбирается в раскрывающемся списке Labels, а поле, из которого будут браться значения этих пунктов, — в списке Values.
Выберите в списке Options From Recordset набор данных signs, в списке Labels — поле Desc, а в списке Values — поле ID. И продолжим разговор об окне Dynamic List/Menu.
Если вы хотите, чтобы при открытии страницы какой-то пункт списка отображался изначально выбранным, воспользуйтесь полем ввода Select Value Equal To. В него вводится значение пункта, который должен быть изначально выбранным. В нашем случае это число 1 — значение поля ID первой записи таблицы signs.
Если вы хотите поместить в список свои собственные пункты, не взятые из набора данных (статические), воспользуйтесь списком Static Options. Этот список состоит из двух колонок: Value (значение пункта) и Label (название пункта). Чтобы ввести в этот список новый пункт, нажмите кнопку со знаком "плюс", и пункт будет добавлен. Поочередно щелкните по значениям, находящимся в обеих колонках, введите нужный текст и не забудьте нажать клавишу <Enter>. Точно так же вы можете изменить необходимое значение в колонке любого уже созданного пункта.
Если вы хотите удалить ненужный пункт из этого списка, выберите его и нажмите кнопку со знаком "минус". А кнопки вверх и вниз, позволят вам переместить выбранный пункт соответственно выше или ниже на одну позицию.
Введя все данные, нажмите кнопку ОК. Вот и все.
Точнее, не все. Нам еще нужно изменить параметры поведения insert Record так, чтобы значение выбранного в списке sign пункта помещалось в поле sign таблицы Guestbook. Для этого откройте панель Server Behaviors и дважды щелкните по пункту Insert Record (from "AddRecord"), после чего на экране появится уже знакомое вам диалоговое окно Insert Record. Выберите в описке Form Elements пункт Sign <ignore>, после чего выберите в раскрывающемся списке Column пункт Sign, а в раскрывающемся списке Submit As — пункт Numeric (впрочем, сам Dreamweaver автоматически выберет этот пункт). И, конечно, нажмите кнопку ОК.
Вот теперь действительно все. Можете проверить страницу в действии.
Создание сложных наборов данных
Осталось изменить страницу Guestbook_table.asp так, чтобы она отображала не только содержимое поля content, но и содержимое поля sign. Давайте сделаем это и попутно изучим построение сложных SQL-запросов и создание сложных наборов данных.
На первый взгляд, задача, стоящая перед нами, очень проста. В самом деле, мы уже знаем, как создать динамический текст и привязать его к полю набора данных. Мы уже, собственно, выполнили это, когда делали страницы Guestbook.asp и Guestbook_table.asp. Теперь же нам ничего не стоит добавить в повторяющуюся область последней страницы новый динамический текст, привязанный к полю Sign.
Давайте так и сделаем. И что получится в результате? А вот что.
Когда мы откроем доработанную страницу Guestbook_table.asp в Web-обозревателе, то увидим, что вместо слов "Положительно", "Отрицательно" или "Нейтрально" стоят цифры от 1 до 3. Почему? Да потому, что созданное нами поле sign имеет числовой тип, и именно число, находящееся в нем, отображается на странице. Но мы-то хотим увидеть слова, а не цифры! Что делать?
Создать сложный набор данных, извлекающий данные не из одной, а из нескольких таблиц. А для этого нам придется построить сложный SQL-запрос, и сделать это нужно вручную.
Откройте страницу Guestbook_table.asp и переключитесь на панель Bindings. Дважды щелкните по пункту Recordset (Guestbook), представляющему созданный нами ранее простой набор данных. (Простым набором данных называется тот, который извлекает данные из одной таблицы.) На экране появится диалоговое окно Recordset. Щелкните по кнопке Advanced — и это окно изменит свой вид (рис. 17.11).
В этом диалоговом окне нам понадобятся поле ввода SQL, список Database Items и кнопки SELECT, WHERE и ORDER BY. Многоколоночный список Variables и все относящиеся к нему кнопки мы пока трогать не будем.
В поле ввода SQL, как вы поняли, вводится текст SQL-запроса. В настоящее время он таков:
SELECT * FROM Guestbook
Выше мы уже рассмотрели этот запрос по частям, поэтому не будем здесь повторяться. Напомним только, что этот запрос извлекает все поля всех записей из таблицы Guestbook.
Поскольку мы хотим создать новый запрос SQL, то давайте сначала удалим все содержимое поля ввода SQL. И начнем, что называется, с чистого листа.
Прежде всего поочередно откроем ветви Tables и Guestbook и выберем пункт Content в списке Database Items. Далее нажмем кнопку SELECT, чтобы поместить в поле ввода SQL ключевое слово SELECT с выбранным нами полем content. В поле ввода SQL появится такой код:
SELECT Content FROM Guestbook
Затем поместим текстовый курсор после слов "SELECT Content", откроем ветви Tables и Signs и выберем пункт Desc. Опять нажмем кнопку SELECT. Код примет следующий вид:
SELECT Content, Desc FROM Guestbook, Signs
Как видите, мы извлекаем данные уже из двух таблиц: поле Content из таблицы Guestbook И ПОЛ6 Desc ИЗ Таблицы Signs.
Осталось только добавить условие, связывающее запись таблицы Guestbook с записью таблицы signs. Для этого добавим условие выборки записей. Выберем пункт Sign в подветви Guestbook ветви Tables и нажмем кнопку WHERE. Код'в поле ввода SQL опять изменится:
SELECT Content, Desc FROM Guestbook, Signs WHERE Sign
Поставим текстовый курсор после текста "WHERE Sign", введем знак "=", выберем пункт ID ветви Signs в ветви Tables и опять нажмем кнопку WHERE. Код в поле ввода SQL примет свой окончательный вид:
SELECT Content, Desc FROM Guestbook, Signs WHERE Sign=ID
Здесь ключевое слово WHERE обозначает условие отбора записей. А код sign=io показывает, что в набор попадут только те записи таблицы Guestbook, значения поля sign которых равно значению поля ID соответствующей записи таблицы signs.
Чтобы проверить созданный SQL-запрос, нажмите кнопку Test. Если он правилен, на экране появится диалоговое окно Text SQL Statement, содержащее записи созданного набора данных.
Нажмите кнопки ОК обоих диалоговых окон. И на всякий случай сохраните страницу. Сложный набор данных, извлекающий записи из двух таблиц, нами создан. Этот набор содержит два поля: content (содержимое записи гостевой книги), взятое из таблицы Guestbook, и Desc (оценка сайта посетителем), взятое из таблицы signs.
Что теперь? Может, создать новый динамический текст и привязать его к полю Desc? Можно, конечно. Но мы поступим по-другому. Как? Сейчас увидите.
Работа с динамическими атрибутами
Когда мы говорили о шаблонах (см. главу 9), то выяснили, что атрибуты тегов можно сделать изменяемыми. В Web-страницах, созданных на основе шаблона, мы можем задавать значения для этих атрибутов и, таким образом, менять их внешний вид в более широких пределах. Но атрибуты тегов можно сделать и динамическими, т. е. брать их значения из полей набора данных. Здесь мы рассмотрим, как работать с такими атрибутами.
Давайте сделаем так, чтобы содержимое разных записей набора данных Guestbook отображалось различным цветом в зависимости от значения, содержащегося в поле sign. Пусть, например, содержимое поля Content отображается темно-синим цветом, если в поле sign содержится единица ("Положительно"), темно-красным — если содержится тройка ("Отрицательно"), черным — в остальных случаях (двойка, "Нейтрально"). Соответствующие коды цветов в этом случае:
темно-синий — #000099;
темно-красный — #990000;
черный — #000000.
Откроем базу данных Guestbook.mdb в Access и создадим новое поле в таблице signs. Дадим этому полю имя Color, текстовый тип и установим его длину в 7 символов — этого хватит, чтобы хранить коды цветов. После чего откроем таблицу signs и введем коды цветов в соответствующие записи таблицы. После этого закроем Access.
Далее переключимся в Dreamweaver, вызовем диалоговое окно Recordset для набора данных Guestbook и добавим в него вновь созданное поле. Попробуйте сделать это самостоятельно. Если же вы хотите сразу перейти к работе с динамическими атрибутами, просто введите в поле ввода SQL такой код:
SELECT Content, Desc, Color FROM Guestbook, Signs WHERE Sign=ID
Теперь выделим содержимое повторяющейся области страницы, щелкнув по тексту "{Guestbook.Content}", и зададим для него черный цвет. Для этого воспользуемся хорошо знакомым селектором цвета в редакторе свойств. В результате Dreamweaver поместит содержимое повторяющейся области в тег <FONT> с атрибутом COLOR — как вы помните, именно с их помощью задается цвет текста.
Теперь выделите содержимое тега <FONT>, щелкнув по соответствующей кнопке секции тегов. И переключитесь в режим отображения кода. Хотя в интерактивном руководстве и описано, как привязать атрибут к полю набора данных в режиме отображения страницы, но почему-то в данном случае Dreamweaver ведет себя очень странно. В частности, раскрывающийся список Bind To, с помощью которого и выполняется привязка поля набора данных к атрибуту тега, остается недоступным. Поэтому мы поступим иначе.
Выделите значение атрибута COLOR тега <FONT>. А теперь просто перетащите на него пункт Color панели Bindings. Значение атрибута COLOR примет такой вид (выделено полужирным шрифтом):
Код, который Dreamweaver подставил в качестве значения атрибута COLOR, извлекает из поля Color набора данных значение цвета и присваивает его атрибуту COLOR. Как видите, все достаточно просто и, опять же, "прозрачно".
Точно таким же образом вы можете создавать другие динамические атрибуты. Главное - "попасть" мышью в нужный фрагмент исходного кода. Но, вероятно, вы с этим справитесь и сами.
Вот и все. Теперь можете открыть вашу страницу в Web-обозревателе и посмотреть на получившийся результат.
Получение данных от другой Web-страницы
Мы выяснили, как передать данные, введенные в форму, в таблицу, создав, таким образом, новую запись. Но не всегда данные, переданные с другой страницы, нужно сохранять в базе. Иногда их необходимо обработать на другой странице, нигде не сохраняя.
Давайте сделаем следующее. Создадим небольшую статичную Web-страничку с тремя гиперссылками, направляющими посетителя па страницу Guestbook_table.asp и заставляющими последнюю показать только записи, удовлетворяющие определенному условию. Пусть первая из них будет показывать записи, значения поля sign которых равно 1, вторая — записи с полем sign, равным 2, третья — 3. Назовем эту страницу Selector.htm.
Интернет-адрес первой гиперссылки страницы Selector.htm будет таков:
Guestbook_table.asp?sign=1
Здесь мы передаем методом GET странице Guestbook_table.asp параметр sign, равный 1. (Вспомните главу 15, где описывались оба метода передачи данных.) Соответственно, адреса других гиперссылок будут отличаться от этого только значением параметра sign.
А для того чтобы отобрать нужные записи из набора данных Guestbook страницы Guestbook_table.asp, мы используем фильтр, сравнивающий значение поля sign со значением параметра sign, переданного нам от страницы Selector.htm. Как видите, все очень просто и довольно наглядно.
Нет смысла подробно описывать, как создается страница Selector.htm — это вы уже знаете. Вместо этого сосредоточимся на странице Guestbook_table.asp и фильтре, отбирающем записи из таблиц в набор. Откройте данную страницу, если вы ее уже закрыли. И переключитесь в панель Bindings.
Для того чтобы получить данные от другой Web-страницы, нам нужно создать параметр гиперссылки. Этот параметр впоследствии примет значение, переданное от другой страницы методом GET. А уж принятое им значение мы сможем использовать где угодно.
Чтобы создать параметр гиперссылки, выберите в меню кнопки "плюс" панели Bindings пункт Request Variable. После этого на экране появится диалоговое окно Request Variable.
В раскрывающемся списке Туре выберите пункт Request.QueryString, а в
поле ввода Name введите имя создаваемого параметра (в нашем случае -sign). Затем нажмите кнопку ОК. После этого в списке панели Bindings появится новая ветвь Request с единственным пунктом QueryString.sign.
Внимание!
Вы не сможете изменить созданный вами параметр гиперссылки, так что вводите данные внимательно. Если вы все же ошиблись, удалите неверно заданный параметр и создайте его заново.
Если же вы передаете данные методом POST, вам будет нужно создать параметр формы. Для этого выберите в меню кнопки "плюс" все тот же пункт Request Variable, но в раскрывающемся списке Туре диалогового окна Request Variable выберите пункт Request.Form.
Создание фильтров
А теперь можно приступить к созданию фильтра, отбирающего записи из таблицы в набор.
Помните, как мы создали сложный набор данных? Если не помните, рассмотрим код SQL-запроса, созданного нами:
SELECT Content, Desc, Color FROM Guestbook, Signs WHERE Sign=ID
Ключевое слово WHERE языка SQL задает условие, согласно которому из таблицы будут извлекаться записи. В приведенном выше примере мы уже фактически создали условие, отбирающее только те записи таблицы Guestbook, для которых в таблице signs имеется "пара". Причем "пары" мы отбирали по значениям поля sign таблицы Guestbook и поля ID таблицы signs. Такие условия называются условиями связи таблиц.
Фильтром же называется условие отбора записей. Это условие используется не для связи таблиц, а для отбора записей из таблицы. Например, в приведенном ниже SQL-запросе используется именно условие отбора записей, иначе говоря, фильтр:
SELECT Content FROM Guestbook WHERE Sign=2
Этот запрос создаст набор данных, включающий только те записи таблицы Guestbook, поля sign которых содержат значение 2 ("Нейтрально").
Чтобы создать фильтр, нам придется добавить условие отбора записей к уже существующему условию связи таблиц. Это совсем просто. Вызовите диалоговое окно Recordset для нашего набора данных Guestbook. Если оно отобразилось в обычном виде, щелкните кнопку Advanced, чтобы переключить его в расширенный вид. И посмотрите на содержимое поля ввода SQL.
Итак, нам нужно добавить в SQL-запрос Новое условие. Мы будем сравнивать значение поля sign и...
Но с чем мы его будем сравнивать?
Ах, да, с параметром sign, переданным страницей Selector.htm. Но как его сюда ввести?
Очень просто. Для этого нам понадобится создать переменную SQL-запроса, представляющую некий параметр, полученный от другой Web-страницы или в результате каких-то вычислений. И в этом нам поможет список Variables диалогового окна Recordset и относящиеся к нему элементы управления.
Нажмите кнопку со знаком "плюс". В списке появится новая строка. Щелкните по этой строке в районе колонки Name (имя создаваемой переменной) и введите это имя, в нашем случае — sign. После этого щелкните в районе колонки Default Value (значение переменной по умолчанию, присваиваемое ей изначально) и введите, скажем, 2 (т. е. по умолчанию будут выводиться только "нейтральные" записи). Теперь останется лишь ввести в колонку Run-time Value выражение, задающее истинное значение этой переменной. В нашем случае это будет следующий код:
Request.QueryString("sign")
Он извлекает из строки запроса, переданной методом GET, параметр sign. Если же вы передаете параметры методом POST, код будет несколько иным:
Request.Form("sign")
Вот и все. Мы создали переменную SQL-запроса и теперь можем ее использовать.
Откройте в списке Database Items ветви Tablesи Guestbook и выберите пункт Sign. Поставьте текстовый курсор в поле ввода SQL после текста
"WHERE Sign=ID" и нажмите кнопку WHERE. Содержимое поля ввода SQL станет таким:
SELECT Content, Desc, Color FROM Guestbook, Signs WHERE Sign= ID AND Sign
Поставьте текстовый курсор после текста "AND Sign" и введите вручную текст =sign. Таким образом, окончательный SQL-запрос будет выглядеть так:
SELECT Content, Desc, Color FROM Guestbook, Signs WHERE Sign=ID AND Sign=sign
Все, наш новый запрос создан. Можете нажать кнопку ОК. Перед этим, однако, лучше нажать кнопку Test, чтобы проверить правильность задания запроса. Так, на всякий случай.
Теперь сохраните страницу Guestbook_table.asp и опубликуйте ее на Web-сервере вместе со страницей Selector.htm. После этого откройте в Web-обозревателе страницу Selector.htm, набрав в строке адреса следующее:
Пощелкайте по ссылкам и посмотрите, что из этого получится. Если же серверная страница упорно выдает вам список всех записей гостевой книги, то просто нажмите кнопку обновления вашего Web-обозревателя.
Необязательные области серверной страницы
Кроме повторяющихся областей, Dreamweaver поддерживает создание также областей необязательных. Вы, конечно, помните, что говорилось о необязательных областях в главе 9, но на всякий случай давайте повторим это. Необязательная область создается на серверной странице и может присутствовать или не присутствовать в зависимости от выполнения или невыполнения какого-либо условия. Все же вам стоит прочитать еще раз главу 9, где о необязательных областях говорилось более подробно.
Чтобы создать необязательную область, сначала выделите элементы ртрани-цы, которые должны стать ее содержимым. После этого выберите в подменю Show Region меню кнопки "плюс" панели Server Behaviors один из пунктов. Всего этих пунктов шесть:
Show Region If Recordset Is Empty - создает необязательную область, отображаемую, если набор данных не содержит ни одной записи (пуст);
Show Region If Recordset Is Not Empty — создает необязательную область, отображаемую, если набор данных содержит хотя бы одну запись (не пуст);
Show Region If First Record — создает необязательную область, отображаемую, если текущей является первая запись набора;
Show Region If Not First Record - создает необязательную область, отображаемую, если текущей является не первая запись набора;
Show Region If Last Record — создает необязательную область, отображаемую, если текущей является последняя запись набора;
Show Region If Not Last Record — создает необязательную область, отображаемую, если текущей является не последняя запись набора.
Давайте поместим повторяющуюся область, навигатор и строку статуса набора данных, т. е. все содержимое страницы, в необязательную область, отображаемую, если набор данных содержит записи. Для этого выделим все, что находится на странице, и выберем пункт Show Region If Recordset Is Not Empty. После этого на экране появится диалоговое окно Show Region If Recordset Is Not Empty.
Единственное, что вам нужно сделать, — это выбрать в раскрывающемся списке Recordset нужный набор данных. И нажать кнопку ОК.
Теперь можете проверить измененную страницу Guestbook_table.asp. Переключитесь в режим показа "живых" данных или откройте ее в Web-обозревателе. Поскольку набор данных Guestbook содержит данные, содержимое страницы (оно же — содержимое необязательной области) будет отображено.
Теперь давайте создадим еще одну необязательную область, но отображаемую, если набор данных не имеет записей. Поместим в эту область текст "Гостевая книга не содержит записей". Это обычная практика в Web-дизайне: предупредить посетителя о том, что какой-то набор данных пуст.
Поместим текстовый курсор после созданной ранее необязательной области и нажмем клавишу <Enter>. В новом текстовом абзаце наберем текст "Гостевая книга не содержит записей и выделим его целиком, для чего щелкнем по соответствующей кнопке секции тегов.
Далее выберем в подменю Show Region меню кнопки "плюс" панели Server Behaviors пункт Show Region If Recordset Is Empty. На экране появится диалоговое окно Show Region If Recordset Is Empty, аналогичное уже знакомому вам окну Show Region If Recordset Is Not Empty. Выберем в раскрывающемся списке Recordset нужный набор данных и нажмем кнопку ОК.
Также можно поместить гиперссылки, составляющие навигатор, в необязательные области, отображаемые и скрываемые в зависимости от того, является ли текущая запись первой или последней. Сделайте это сами — это будет хорошей практикой.
На этом рассказ о создании простейших серверных страниц можно считать почти законченным. Почти потому, что нам нужно рассмотреть еще одну возможность, предлагаемую Dreamweaver, — быстрое создание серверных страниц.
Быстрое создание серверных страниц
Очень часто бывает просто необходимо быстренько сляпать какую-либо серверную страницу: поместить в нее форму для ввода данных, навигатор, строку статуса и т. п. Специально для таких "пожарных" случаев Dreamweaver предлагает возможность быстрого создания серверных страниц. Воспользовавшись пунктами подменю Application Objects меню Insert или соответствующими им кнопками вкладки Application панели объектов и введя нужные данные в появившихся на экране диалоговых окнах, вы можете быстро создать различные элементы, присущие серверным страницам. Согласитесь — это неплохой выход для малоопытных программистов и торопыг.
Вы спросите, почему автор описал эту замечательную возможность в паре абзацев, да вдобавок в самом конце книги? Дело в том, что задача автора: научить вас серверному программированию в среде Dreamweaver. А для этого вам нужно самим "почувствовать" в руках если не сам программный код, то хотя бы поведения Dreamweaver и элементы страниц, к которым они привязаны. Вы должны сами знать, как что работает. Кроме того, настоящий творец все делает своими руками. (Можете считать это шуткой, но это правда.)
Хотя не в силах автора запретить вам пользоваться возможностями быстрого создания серверных страниц. Но только если действительно нет времени (или желания) творить.
Что дальше?
А дальше продолжим занятия серверным программированием.
В этой главе мы научились создавать простейшие серверные страницы. А в следующей — и последней — главе настоящей книги мы узнаем, как создаются простейшие интерактивные сайты. Мы узнаем, как объединить вместе серверные страницы, обрабатывающие данные из базы. А также изучим некоторые основные понятия, не затронутые в этой главе.