Создание серверных приложений на языке PERL

         

Ssi


Теперь посмотрите, что вы натворили. Мда, натворили. Допустим, вы уже сделали сайт. К примеру, на нем 30 страниц с общим дизайном, причем на каждой странице есть навигация, например, по разделу. Что произойдет, если вы добавите в раздел новую статью? Правильно, вам понадобится изменять все страницы, входящие в раздел. Хорошо если их 10. А если больше? А если вам необходимо дизайн поменять?

Мда, ситуация незавидная. С такой ситуацией я столкнулся, когда пытался сделать похожий ресурс на бесплатном сервере. Это кончилось тем, что я просто не смог обновлять сайт. К счастью, есть выход! Этим выходом является технология Server-Side Includes (включения на стороне сервера), в просторечии SSI. Она, если сервер ее поддерживает, позволяет прямо-таки творить чудеса. Суть в следующем - включив в свою страничку код

<!--#include virtual="header.ssi" -->

Вы тем самым включаете в нее все, что находится внутри этого файла. Кроме того, вы можете включить в страницу исполняемый файл

<!--#exec cgi="cgi.pl" -->

Вот так. После этого вы можете переделать свои страницы так, что смену дизайна можно будет произвести за 5 минут, изменив только два-три файла. Именно это я могу сделать со своим сервером. В моем случае страница, которую вы видите как чистый HTML, на самом деле состоит из заголовка с META-тэгами, особыми для каждой страницы, заголовка страницы, потом идет общий заголовок (SSI), потом подзаголовок в темно-серой линии, потом навигация по разделу (SSI), потом текст, потом "стопа" документа (SSI). Вот так:

<html>

<head>

<meta http-equiv="Content-Language" content="ru">

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Кормушка :: Локальная копия :: HTML учебник</title>

<!--#include virtual="header.ssi" -->

<p><b><a href="index.shtml">Кормушка</a>

 :: <a href="local.shtml">Локальная копия</a>

 :: HTML учебник</b>

</p>

<!--#include virtual="leftnav.ssi" -->

<!--#include virtual="localheader.ssi" -->

Тут лежит текст



<!--#include virtual="rightnav.ssi" -->

</body>

</html>

Как видите, все гениальное просто. Попробуйте аналогичные преобразования на своих страницах. Не получилось? Еще бы! Это же Server-Side Includes. Для просмотра SSI-документов на своей машине необходимо установить сервер. О том, как это сделать, читайте в следующей статье.

В связи с разрастанием проекта структура немного изменилась, но, поскольку это не меняет сути дела, статью я переписывать не стал.


<!--#include file="file.html" --> или



<!--#include virtual="URL" -->



Первый случай используется при подключении файла, находящегося в том же самом каталоге, второй – для подключения файла, находящегося в любом месте, даже на другом сервере. (Но не все бесплатные сервера разрешат вам подключить файл, находящийся на другом сервере). Все говорят, что предпочтительнее использовать virtual, и я не буду спорить. В этом случае можно использовать как относительные, так и абсолютные адреса. Само собой разумеется, что подключаемый файл тоже, в свою очередь, может содержать директивы SSI. Обратите внимание: пробелы есть только после слова include и перед -->. Желательно, чтобы файл, в котором есть директивы SSI, имел вид name.shtml, где name – любая комбинация латинских букв, цифр и знаков подчеркивания. На некоторых серверах разрешают вставлять директивы SSI и в файлы с расширением *.htm, *.html.

Данные

Для хранения данных существуют переменные. Они объявляются так:



<!--#set var="имя" value="значение" -->



Передача данных

Передавать данные можно двумя способами. Даже тремя.

  • Используя метод get формы.


  • Через URL вызываемого файла в виде
    file.html?param=value[&param=value].


  • Используя возможности SSI.


  • В принципе, первые два различаются лишь тем, самостоятельно будете вы кодировать строку запроса (2-й способ) или предоставите это делать пользователю (1-й способ), который будет заполнять форму и жать на ОК или SUBMIT. Этот способ рассмотрен мною подробно в другой статье. Для передачи данных средствами SSI достаточно объявить переменную и присвоить ей значение. Теперь она доступна из любого файла, подключающего данный.

    Получение данных

    Получить и затем использовать данные можно двумя способами.

  • Стандартными средствами DHTML (HTML+JavaScript)


  • Средствами SSI.


  • Первый способ рассмотрен все в той же статье "Передача данных…", да и не интересует он нас сейчас. А вот средствами SSI получить данные можно опять-таки двумя способами.



  • Данные, содержащиеся в переменных, которые мы объявляли в подключаемых файлах, уже можно считать полученными и с чистой душой и спокойной совестью можно приступать к их использованию.


  • Если вы самостоятельно сформировали строку запроса так, как описано выше, или передавали данные из формы, это равносильно объявлению переменных. То есть строка file.shtml?param=value эквивалентна объявлению переменной param, равной value.


  • <!--#set var="param" value="value" -->

    Чтобы проверить, передались ли вам какие-либо данные или нет, есть директива

    <!--#printenv -->

    Она выводит на экран список всех переменных и их значения.

    Обработка данных

    Нет смысла передавать данные и не использовать их потом. Разве что делать это с целью заморочить голову посетителю. Самое простое, что можно сделать, это вставить переменную в текст документа.



    <!--#echo var="$name" --> -

    просто вставит значение переменной в текст документа. Допустим, в переменной url содержится адрес какого-то файла, на который надо организовать ссылку, тогда это выглядит так



    <a href="<!--#echo var="$url" -->">

    Ссылка</a>.



    Или, например, посетитель сказал нам, как его зовут, нажал на кнопочку, и на следующей странице к нему будем обращаться по имени. Строка запроса у нас получилась
    file.shtml?name=Alexey и используем мы эти бесценные сведения



    Привет,

    <!--#echo var="$name" -->.



    В результате на экране отобразится Привет, Alexey.

    Если передавались данные, требующие аналитической обработки, на это есть директива if.

    <!--#if expr=(условие) -->

    <!--#elif expr=(условие) -->



    <!--#else -->

    <!--#endif -->

    endif является обязательным элементом. elif может повторяться сколько угодно раз. else между if и endif может быть лишь единожды, причем после else уже не может использоваться elif. После каждого условия можете вставлять неограниченное количество строчек кода HTML. Например, предыдущий пример (с именем) можно модернизировать





    <!--#if expr=($name="Alexey") -->

    <h1>Привет, <!--#echo var="$name" --></h1>

    <!--#else -->

    <h2>Привет, <!--#echo var="$name" --></h2>

    <!--#endif -->



    Теперь, если посетитель окажется моим тезкой, приветствие будет написано чуть крупнее, чем для всех остальных.

    Организация сайта

    Наконец-то я добрался до того, ради чего и затеял-то писать эту статью. Мы же хотим организовать свой сайт так, чтобы в случае чего модернизация заняла бы минимум усилий. Возможны два пути для достижения этой цели. Видите, какой я нынче демократичный – всегда предоставляю вам право выбора. Цените это J

    . Следует учесть, что HTML – очень терпимый к ошибкам язык. Если вы что-то неправильно написали, к фатальным последствиям это не приведет. Так, например, не смотря на то, что во всех руководствах заголовок документа (head) рекомендуют писать в начале файла, броузеры правильно понимают его в любой части документа, даже если вы забудете заключить его в контейнер <head>. Единственное (имхо) неудобство заключается в том, что, располагая заголовок, содержащий title, в конце файла, страница броузера остается безымянной до тех пор, пока не прочитает этот заголовок.

    Способ первый

    Пишем статью в формате HTML, как обычно, но не указывая никакие стили, избегая изменения цветов (потому что мало ли какой цвет фона нам потом приспичит сделать – вдруг видно не будет) и даже опуская тег body. Остаются только font size, b, big, img, a, i, table и некоторые другие. Сохраняем как filename.html. Имя, естественно, у каждой статьи разное. Самое главное – запомнить, в каком файле какая статья лежит, а лучше записывать это. Адрес этой статьи никому не говорим – он для сугубо внутреннего использования.

    Далее создаем публичный файл статьи. В начале документа пишем <html> и затем объявляем переменные, в которых будем передавать информацию о статье



    <html>

    <!--#set var="description" value="описание" -->



    <!--#set var="title" value="Заголовок" -->

    <!--#set var="keywords" value="ключевые слова" -->

    <!--#set var="file" value="url статьи" -->

    <!--#include virtual="файл интерфейса.shtml" -->



    Сохраняем это все и запоминаем адрес – это и будет адрес статьи, который вы будете регистрировать в каталогах и рекомендовать посетить друзьям. Можно еще написать то, что вы там еще обычно пишете в заголовке. Я чаще всего ограничиваюсь одним title. Как-то спокойно отношусь к тому, что релевантность маленькая окажется J

    .

    Теперь создаем файл интерфейса (*,shtml). Начало его выглядит так:



    <html><head>

    <title><!--#echo var="$title" --></title>

    <meta name="description" content="<!--#echo var="$description" -->">

    <meta name="keywords" content="<!--#echo var="$keywords" -->">

    </head>



    Далее оформляем внешний вид – вешаем баннеры, вставляем счетчики, добавляем новости и т.д. Наконец в том уголке, где должна быть статья, пишем



    <!--#include virtual="$file" -->



    Все. Теперь, как и обещалось, для радикального изменения дизайна достаточно изменить лишь наш файл интерфейса.

    Способ второй

    Честно говоря, он мне не очень нравится, и поэтому я его приводить не буду. Идея его заключается в том, чтобы вызывать все статьи как, например, index.shtml?sub=filename. Выигрыш можно получить в том, что одна и та же статья теперь имеет два адреса. Кому интересно, можете сами организовать такую структуру.

    Заключение

    Некоторые тонкости. Обращение к переменным я делал как "$name". На сервере, где мой хоумпейдж, работает именно так. На других может быть "${name}" (скорее всего) или как-нибудь по-другому (маловероятно).

    При тестировании дома могут возникнуть сложности. Для получения данных нужен сервер. Если у вас не стоит Apache или какой-нибудь другой и вы не хотите его ставить, и не надо. Есть хорошая программка Small HTTP Server (около 60кб). Последний раз я видел ее по адресу http://wwwkoi.wplus.net/pp/mrdoors/srv/rdesc.htm. После установки вы сможете тестировать дома CGI, SSI, PHP и т.д.

    Статья взята с сайта Bookware.Ru. Автор - Алексей Годовник.


    Содержание раздела