Серверные директивы
Теперь пришла пора поговорить о серверных директивах.
Введение в серверные директивы
Весь НТМЬ-код, из которого состоит ¥еЬ-страница, пересылаемая по Сети, обрабатывается клиентом. Клиентом практически всегда является Veb - обозреватель (существуют и другие программы, обрабатывающие Veb - страницы на стороне клиента, но мы не будем их рассматривать). Именно для ¥еЬ-обозревателя предназначены все эти теги, что мы создаем вручную или в ¥еЬ-редакторе. ¥еЬ-сервер же их совсем не понимает.
Задача ¥еЬ-сервера совсем другая: принять запрос от клиента, найти нужный файл на своих дисках и переслать его клиенту для обработки. Ну и, разумеется, он должен устойчиво работать и потреблять как можно меньше системных ресурсов. Обработка НТМЬ-кода в его обязанности не входит.
Однако разработчики ¥еЬ-серверов все же заставили их понимать некоторые команды, с помощью которых можно обработать НТМЬ-код. Как вы уже поняли, эта обработка выполняется на стороне сервера, более тсго, самим ¥еЬ-сервером. Конечно, эти команды позволяют выполнить самые простые действия: вставить в содержимое одного файла содержимое другого, поместить в код текущую дату и т. п. Но даже в этом случае они — хорошее подспорье ¥еЬ-дизайнеру.
Эти команды и называются серверными директивами. Несмотря на всю их простоту, они позволяют решить много проблем, неустранимых иными средствами.
Помните, как мы пытались поместить на ¥еЬ-страницу текущую дату? Для этого нам пришлось в свое время писать ¥еЬ-сценарий. А если Veb - обозреватель не поддерживает ¥еЬ-сценарии? А если компьютер, на котором он работает, настолько маломощен, что пользователь отключил поддержку сценариев? В таком случае сценарий, помещающий на страницу дату, не выполнится.
¥еЬ-сервер же работает всегда, и серверная директива, осуществляющая вставку в НТМЬ-код текущей даты, выполнится в любом случае. Veb - обозреватель же, загрузивший страницу, даже не будет знать, что эта страница была предварительно обработана сервером. (Вообще-то, об этом догадаться может если не ¥еЬ-обозреватель, то опытный пользователь, имеющий представление о ¥еЬ-серверах и их настройке.)
Так же трудно вставить НТМЬ-код, находящийся в одном файле, в другой файл средствами клиентских ¥еЬ-сценариев. ¥еЬ-сервер же с помощью специальной директивы делает это с легкостью. Таким образом, можно создавать ¥еЬ-страницы, "собираемые" на стороне сервера из множества частей: заголовка, полосы навигации, сведений об авторских правах и, разумеется, основного содержимого. Это идеальное решение многих проблем сайтов, созданных на основе табличного дизайна. Далее об этом будет рассказано подробнее.
К несчастью, как уже было сказано, серверные директивы никем не стандартизировались. Каждый Web-сервер поддерживает свой набор этих директив, а каких — зависит от доброй воли его создателя. Правда, существует некий набор директив, поддерживаемых большинством серверов, этакий неписаный стандарт "де-факто". Применяя в своих страницах директивы из этого набора, вы можете быть уверены, что они с большой долей вероятности будут поддерживаться сервером, на котором вы собираетесь их (страницы) разместить.
А пока что давайте рассмотрим серверные директивы, поддерживаемые подавляющим большинством Web-серверов, за исключением самых уж примитивных. Назовем их стандартным набором серверных директив, хотя их фактически никто не стандартизировал. Но все равно перед тем, как применять серверные директивы, обратитесь к документации на Web-сервер или к его администратору, чтобы выяснить, какие директивы ваш сервер поддерживает.
Стандартный набор серверных директив
Прежде всего, давайте рассмотрим, как серверные директивы вставляются в HTML-код. Проблема заключается в том, что их нужно как-то выделить, чтобы Web-сервер сразу их "увидел", а Web-обозреватель, наоборот, "не заметил". Поэтому серверные директивы помещаются в тег комментария и помечаются значком # ("решетка"):
<! — #<Директива> <Атрибут1>=<3начение1> <Атрибут2>=<3начение2> ... —>
Однако, кроме этого, надо выполнить еще кое-какие действия. Чтобы Web - сервер "знал", что в какой-либо странице используются серверные директивы, нужно изменить расширение файла, в котором сохранена эта страница. Как вы помните, обычно НТМL-файлы имеют расширение htm или html. Так вот: эти расширения нужно изменить соответственно на shtm и shtml.
Подавляющее большинство Web-серверов требуют, чтобы Web-страницы с серверными директивами находились в файлах с расширениями shtm и shtml. Правда, встречаются серверы с другими требованиями (например, малоизвестный Web-сервер со странным названием "я3" требует, чтобы такие файлы имели расширение ssi), но подобные случаи весьма редки. И все же, невредно было бы прежде, чем применять в своих страницах серверные директивы, прочитать документацию к серверу или проконсультироваться у его администратора.
Как видите, серверная директива может иметь (и практически всегда имеет) несколько атрибутов, которым присвоены значения. В этом смысле серверные директивы чем-то похожи на теги HTML.
Директива include вставляет в содержимое текущего файла содержимое другого. (Эта директива также называется серверным включением, а файл, содержащий включаемый фрагмент кода, — файлом включения). Вставка осуществляется в то место файла, где встретилась эта директива. Записывается она так:
<!— #include £Ие="<Имя файла>" —> или так:
<!— #include virtual="<HM« файла>" —>
В первом случае <имя файла> представляет собой обычное имя файла, заданное с учетом особенностей файловой системы серверного компьютера. Например, так:
<!— #include file="c:Inetpubwwwrootincludesheader. inc" —>
В данном случае в текущий файл вставляется содержимое файла header. inc, находящегося в папке Inetpubwwwrootincludes на диске С.
Во втором случае файл <имя файла> ищется относительно корневой папки сайта. Также он может находиться на другом Web-сайте; в этом случае в качестве значения атрибута virtual указывается полный интернет-адрес этого файла.
<!— #include virtual="/htmls/includes/header. inc" —>
В данном случае файл header. inc располагается в папке htmls/includes, вложенной в корневую папку сайта.
<!— #include virtual="Http://www. othersite. ru/includes/header. inc" —>
А в этом случае файл header. inc находится вообще на другом сайте.
Существует негласное правило: все файлы включений должны иметь расширение inc (от англ. include — включение). Хотя не возбраняются другие расширения. Также, если у вас имеется достаточно много файлов включений, лучше всего поместить их в особую папку, например includes. В противном случае можно оставить их в той же папке, где находятся все Web- страницы.
Не все Web-серверы поддерживают обе разновидности директивы include. Например, Microsoft Internet Information Server поддерживает только форму с атрибутом file.
Директива echo помещает в HTML-код содержимое одной из встроенных переменных ¥еЬ-сервера. Она имеет такой синтаксис:
<!— #echo var="<HMH переменной>" —>
В качестве значения атрибута var задается имя нужной переменной. Встроенные переменные, поддерживаемые большинством Web-серверов, перечислены в табл. 14.3.
Таблица 14.3. Встроенные переменные Web-сервера
|
В частности, именно с помощью данной серверной директивы на страницу помещается текущая дата. Для этого, как вы поняли, нужно использовать директиву:
<!— #echo var="DATE_LOCAL" —>
ИЛИ
<!— #echo var="DATE_GMT" —> если нужно вывести дату по Гринвичу.
Также многие Web-серверы поддерживают другие серверные переменные. Чтобы выяснить их, обратитесь к документации по серверу или к его администратору.
Как использовать серверные директивы
А сейчас давайте поговорим, как можно использовать серверные директивы.
Ну, насчет директивы echo все ясно. Используйте ее, если на страницу нужно поместить текущую дату или имя файла страницы. Для этого достаточно подставить в качестве значения атрибута var имя соответствующей переменной.
А вот как можно использовать директиву include?
Для разделения кода Web-страниц на отдельные части.
Зачем это нужно?
Необходимо это во многих случаях. Но нужнее всего, если сайт построен по принципам табличного дизайна, либо странички содержат какие-либо повторяющиеся стандартные элементы. В этом случае умелое разделение кода на фрагменты принесет истинное облегчение Web-дизайнеру. Даже если он использует Dreamweaver.
Давайте вернемся назад и вспомним, чем отличаются Web-страницы, построенные на основе табличного дизайна, от прочих. Как вы помните, все, что находится на такой странице, представляет собой содержимое одной огромной таблицы, занимающей всю эту страницу. А какие недостатки таблиц мы знаем?
Недостаток первый: очень медленная загрузка. Web-обозреватель не может вывести на экран таблицу, пока не загрузит ее целиком. А если таблица довольно велика, а канал связи с Интернетом достаточно нетороплив, загрузка может продолжаться очень долго.
Недостаток второй: большой объем получающегося HTML-кода. В самом деле, вспомните, какие размеры были у страниц, созданных на основе табличного дизайна! Сравните их со страничками сайта, основанного на фреймах! Отчасти это происходит из-за того, что сам код, создающий таблицу, очень велик — это плата за гибкость. Но основная причина этого другая: при использовании табличного дизайна каждая страница включает в себя все повторяющиеся элементы (заголовок, полоса навигации, сведения об авторских правах), которые во втором случае "вынесены" в отдельные фреймы, т. е. размер HTML-кода еще больше увеличивается.
Недостаток третий, свойственный не самим таблицам, а табличному дизайну: каждая страница содержит все стандартные, повторяющиеся элементы оформления. А теперь представьте, что вам нужно слегка изменить стандартное примечание, а страниц в вашем сайте добрая сотня. Что делать? Открывать каждую из них и вручную править текст? А если вы пропустите какую-нибудь из них? А если забудете сохранить при закрытии? Уже не стоит говорить о том, что перелопатить вручную такое количество страниц трудно чисто физически.
Dreamweaver пытается решить эту проблему, предоставляя уже известные вам шаблоны. Но это не решение проблемы, а половина решения. Да, вы можете внести изменения в шаблон, после чего Dreamweaver за вас будет переносить эти изменения во все страницы сайта. Но это не устраняет проблему увеличения размеров страниц. Страницы, созданные на основе табличного дизайна, все же остаются большими, занимая место на дисках сервера, которого всегда не хватает. Более того, размер страниц увеличивается еще за счет разного рода специальных комментариев, вносимых самим Dreamweaver, чтобы выделить HTML-код шаблона.
Так как же решить эту проблему? И есть ли у нее решение?
Есть.
Решение в том, чтобы вынести повторяющиеся элементы страниц в отдельные файлы, оставив в них только основное содержимое, т. е. выделить в HTML-коде страницы фрагменты, создающие ее заголовок, полосу навигации и сведения об авторских правах, вырезать их и сохранить в других файлах. А на их место поместить серверные директивы include, указывающие на эти файлы.
Поясним вышесказанное на примере. Давайте для примера создадим страничку, код которой приведен ниже.
<HTML>
<HEAD>
<ТТТЪЕ>Страница</ТТТЪЕ>
</HEAD>
<BODY>
CTABLE B0RDER="1">
<TR>
CTDXA HREF="pagel. Ы;т">Страни1да 1</A></TD>
<TD R0WSPAN="4">3to основное содержимое страницы.</TD>
</TR>
<TR>
CTDXA HREF="page2 . Ы;т">Страни1да 2</Ax/TD>
</TR>
<TR>
<TDXA HREF="page3. Ы;т">Страни1да 3</Ax/TD>
</TR>
<TR>
<TDXA HREF="page4 . Ы;т">Страница 4</Ax/TD>
</TR>
</TABLE>
</BODY>
</HTML>
Сохраните этот код в файле 14.1.htm и откройте его в Web-обозревателе. Вы увидите нечто, похожее на рис. 14.21.
Эта страница сделана на основе табличного дизайна. Значит, она содержит все повторяющиеся элементы. Давайте вынесем их в другие файлы.
Рис. 14.21. Страница-пример, сделанная без использования серверных директив |
Сначала нужно выяснить, где находится основное содержимое страницы. В нашем случае это строка: "Это основное содержимое страницы.". Все остальное — повторяющиеся элементы.
Наш случай — самый простой. Мы вынесем все, что находится от тега <body> до приведенной выше строки, в файл 14.Line, а все, что расположено после нее и до тега </body>, — в файл 14.2.inc. А саму страницу переименуем в 14.2.shtm. После всех этих пертурбаций ее код будет выглядеть так:
<HTML>
<HEAD>
<Т1ТЬЕ>Страница</Т1ТЬЕ>
</HEAD>
<BODY>
<!— #include file="14.1.inc" —>
Это основное содержимое страницы - <!— #include file="14.2.inc" —>
</BODY>
</HTML>
Как видите, от изначального HTML-кода страницы осталось не так уж и много. А теперь вообразите, что мы проделали такую операцию со всеми страницами большого и сложного сайта. Представляете, насколько уменьшатся все его файлы!
Тогда файл 14.Line будет выглядеть так:
CTABLE BORDER="l">
<TR>
<TDXA HREF="pagel. htm">CTpaHHu, a 1</A></TD>
<TD ROWSPAN="4">
А файл 14.2.inc — так:
</TD>
</TR>
<TR>
<TDXA HREF="page2 . htm">CTpaHHu, a 2</Ax/TD>
</TR>
<TR>
<TDXA HREF="page3. htm">CTpaHHu, a 3</Ax/TD>
</TR>
<TR>
<TDXA HREF="page4 . htm">CTpaHHu, a 4</Ax/TD>
</TR>
</TABLE>
К сожалению, просмотреть страницы этого "дивного нового" сайта в Web - обозревателе мы не сможем. Ни один Web-обозреватель не понимает серверных директив, как ни один Web-сервер не понимает HTML-тегов. Это не его обязанности. Чтобы увидеть, как Web-сервер обработает серверные директивы, нам понадобится сам Web-сервер. А его у нас нет.
Поддержка Dreamweaver серверных директив
К сожалению, поддержка серверных включений Dreamweaver MX оставляет желать лучшего.
Разработчики Dreamweaver утверждают, что их программа читает файлы включений, расшифровывает их и выводит в окно документа вместе содержимым страницы, использующей эти включения. Так-то оно так, но не совсем. Dreamweaver действительно выводит содержимое серверных включений в окне документа, но некорректно обрабатывает HTML-разметку: он "проглатывает" весь HTML-код, находящийся в серверных включениях, и выводит только текст. Посмотрите, что он сделал с нашей страницей 14.2.shtm (рис. 14.22).
Рис. 14.22. Web-страницы, содержащие серверные включения, Dreamweaver отображает некорректно |
Иначе, как грубейшей ошибкой, назвать это нельзя. Ведь автор прекрасно помнит, что третья версия Dreamweaver (3.0) нормально отображала содержимое файлов включений. Досадно, что новая версия, вместе с новыми возможностями, таит в себе новые ошибки.
Однако не все так плохо. Вы можете отключить вывод содержимого серверных включений; в этом случае они будут просто помечаться особым значком (рис. 14.23). Для этого откройте окно Preferences, выбрав пункт Preferences в меню Edit, и переключитесь на вкладку Invisible Elements. Отключите флажок Server-Side Includes и нажмите кнопку ОК.
Рис. 14.23. Серверные включения, отображаемые в виде значков |
На этом поддержка серверных директив include Dreamweaver не заканчивается. Вы можете вставить серверное включение в код страницы, выбрав пункт Server-Side Include подменю Script Objects меню Insert или нажав кнопку Server-Side Include (рис. 14.24), находящуюся на вкладке Script панели объектов. После этого вам останется только выбрать нужный файл в появившемся на экране диалоговом окне Select File.
Рис. 14.24. Кнопка Server-Side Include панели объектов
Если вы выберете значок серверной директивы include, редактор свойств примет вид, представленный на рис. 14.25. С его помощью вы сможете изменить значения атрибутов этой директивы.
Разновидность директивы include — с атрибутом file или virtual — задается с помощью набора переключателей Туре. Вам необходимо будет выбрать нужный переключатель: File или Virtual.
Само имя файла задается в поле ввода Filename. Вы также можете нажать значок папки, расположенный справа этого поля ввода, и выбрать нужный файл в появившемся на экране диалоговом окне Select File.
Нажав кнопку Edit, вы сможете отредактировать файл серверного включения. Dreamweaver отобразит его в окне документа в виде HTML-кода.
Да, Dreamweaver очень странно поддерживает серверные директивы. Будем надеяться, что в следующей его версии этот недостаток будет устранен. А пока что можем только посоветовать изучать язык HTML и править код таких вот разделенных на части страниц вручную.
На этом рассказ о серверных директивах окончен.
На этом мы закончим разговор о Web-дизайне и начнем говорить о Web - программировании. Удивлены? Скажете, что мы вроде бы уже говорили о программировании в Интернете в главе 13? Да, говорили.
Те программы, которые мы писали ранее, работали на стороне клиента, под управлением Web-обозревателя и виртуальной машины. Но знаете ли вы, что можно писать программы, которые будут работать на стороне Web - сервера? Эти программы будут принимать от посетителя сайта какие-либо данные, обрабатывать их и выдавать результат в виде сформированной самой программой Web-страницы.
Заинтригованы? Тогда читайте дальше.