Основы web-технологий

         

DELETE


Метод DELETE запрашивает сервер об удалении ресурса, имеющего запрашиваемый идентификатор. Запрос с данным методом может быть отвергнут сервером, если у пользователя нет прав на удаление запрашиваемого ресурса.



Основы web-технологий


Метод GET позволяет получать любую информацию, связанную с запрашиваемым ресурсом. В большинстве случаев, если идентификатор запрашиваемого ресурса указывает на документ (например, документ HTML, текстовый документ, графическое изображение, видеоролик), то сервер возвращает содержимое этого документа (содержимое файла). Если запрашиваемый ресурс является приложением (программой), формирующим в процессе своей работы некоторые данные, то в теле сообщения ответа возвращаются эти данные, а не двоичный образ выполняемого файла. Это используется, например, при создании приложений CGI. Если идентификатор запрашиваемого ресурса указывает на директорию (каталог, папку), то, в зависимости от настроек сервера, может быть возвращено либо содержимое директории (список файлов), либо содержимое одного из файлов, находящегося в этой директории (как правило, index.html или Default.htm). В случае запроса папки ее имя может указываться как с символом "/" на конце, так и без него. При отсутствии на конце идентификатора ресурса данного символа сервер выдает один из ответов с перенаправлением (с кодами статуса 301 или 302).

Одной из разновидностей метода GET является "условный GET" ("conditional GET"), при котором сообщение запроса включает заголовки запроса If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, или If-Range. Условный метод GET запрашивает передачу объекта, только если он удовлетворяет условиям, описанным   в   приведенных   заголовках.  Например,   при   наличии   заголовка   If-Modified-Since содержимое запрашиваемого ресурса будет получено только в том случае, если оно не изменялось после момента времени, указанного в качестве значения данного заголовка. Условный метод GET предназначен для уменьшения ненужной загрузки сети, поскольку позволяет не загружать вторично уже сохраненные клиентом данные.

Различают также "частичный GET" ("partial GET"), при котором сообщение запроса включает заголовок запроса Range. Частичный GET запрашивает передачу только части объекта. Частичный метод GET предназначен для уменьшения ненужной загрузки сети, за счет запроса только части объекта, когда другая часть уже загружена клиентом. Значением заголовка Range является строка "bytes=" с последующим указанием диапазона байтов, которые необходимо получить. Байты нумеруются с 0. Начальный  и  конечный  байты диапазона разделяются символом "–". Как начальный, так и конечный байты в диапазоне могут отсутствовать. Если нужно получить несколько диапазонов, то они перечисляются через запятую. Если некоторые из перечисленных диапазонов пересекаются, то сервер осуществляет их объединение. Сообщение ответа в случае запроса с частичным методом GET должно содержать заголовок Content-Range, в котором указывается передаваемый диапазон. Если сервер передает несколько непересекающихся диапазонов, то заголовок Content-Type принимает специальное значение "multypart/byteranges". Тело сообщения разбивается на части, разделенные сгенерированным сервером разделителем и переданным в качестве параметра заголовка Content-Type. Каждая отдельная часть содержит собственные заголовки Content-Type и Content-Range с пустой строкой перед содержимым диапазона.



HEAD


Метод HEAD идентичен GET, за исключением того, что сервер не возвращает в ответе тело сообщения. Информация, содержащаяся в HTTP заголовках ответа на запрос HEAD, идентична информации, представляемой в ответ на запрос GET для того же ресурса. Этот метод может использоваться для получения информации об объекте запроса без непосредственной пересылки тела объекта. Метод HEAD может использоваться для тестирования гипертекстовых связей.



Общий интерфейс шлюзов CGI


Серверы Web обеспечивают просмотр пользователем документов и переход с одного документа на другой. Часто такого взаимодействия пользователя с сервером Web бывает недостаточно. Во многих случаях пользователь должен получать для просмотра не статические документы, хранящиеся на сервере Web, а динамические, содержимое которых изменяется в соответствии с работающей на сервере Web программой. Для реализации подобной возможности необходимо выполнение, по крайней мере, двух условий. Во-первых, сервер Web должен уметь инициировать запуск на выполнение программ в соответствии с запросом пользователя. Во-вторых, необходима возможность передачи данных от пользователя удаленной программе, а также результатов работы программы – пользовательскому агенту. Для выполнения этих условий необходим программный интерфейс между сервером Web и запускаемым приложением. При создании Web был разработан такой интерфейс, получивший название общего интерфейса шлюзов (Common Gateway Interface, CGI).

Технология CGI относится к технологиям стороны сервера. Это означает, что программа CGI запускается на сервере Web и работает в его локальной операционной системе. Взаимодействие пользовательского агента с удаленной программой осуществляется по следующей общей схеме (рис. 2):

1.       Пользовательский агент соединяется с сервером Web, на котором расположена программа, и передает ему запрос, содержащий идентификатор программы и данные для обработки. Идентификатор передается в стартовой строке запроса. Место расположения данных для обработки в запросе зависит от метода, применяемого к запрашиваемой программе.

2.     Сервер Web получает запрос пользователя, запускает программу, идентификатор которой содержится в стартовой строке полученного запроса, передает ей по интерфейсу CGI данные для обработки и обеспечивает возможность



получения результатов работы программы CGI.

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


4.     Сервер Web формирует сообщение ответа HTTP с результатом работы программы в качестве объекта, и передает его пользовательскому агенту.

Данные для обработки могут быть содержимым формы, заполненной пользователем. Форма – это часть документа HTML, содержащая органы управления, информация о состоянии которых может быть передана пользователем серверу Web. Для размещения формы внутри документа HTML используется элемент FORM:

<FORM action=uri method=m enctype=mime>...</FORM>

Обязательны как начальный, так и конечный тэги. Атрибут action задает идентификатор программы, которой будут отправлены данные формы для обработки. Чаще всего это программа CGI, однако, можно указать идентификатор обычного пассивного документа. В последнем случае обработки формы не произойдет, но будет осуществлен переход к новому документу.

Атрибут method задает метод, применяемый к ресурсу. Может принимать значения GET и POST. Атрибут enctype задает способ кодирования содержимого формы (значений в строках ввода, состояний переключателей). Если данные из формы будут переданы серверу Web в теле сообщения запроса, то способ кодирования означает тип содержимого и передается в заголовке объекта Content-Type. По умолчанию применяется единственный возможный для метода GET способ кодирования application/x-www-form-urlencoded. Для метода POST применим также способ text/plain.

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

Отправка формы может осуществляться при нажатии кнопки класса submit, при нажатии клавиши ENTER в строке ввода, при нажатии мышью внутри органа управления класса image. При отправке формы клиент производит следующие действия:

1.  Кодирование содержимого элементов. У каждого органа управления (элемента) формы имеются атрибуты name и value, обозначающие соответственно имя элемента и значение. Имя задается в документе HTML. Значение зависит от типа элемента. Например, для строки ввода – это введенная строка, для включенного одиночного переключателя – on, для группы переключателей – имя включенного. Кодирование заключается в замене некоторых недопустимых символов последовательностями допустимых. Пробелы в значениях кодируются символом '+'. Символы с кодом больше или равным 127, а также некоторые символы с кодом меньше 127, например, '+', '%' и '&', кодируются тройкой символов '%hh', где hh – две шестнадцатеричные цифры кода символа. Код символа зависит от кодировки, в которой создан содержащий форму документ. Таким образом, для каждого элемента получается строка вида name=value, где name – имя элемента органа управления, value – строка с закодированным значением элемента органа управления.



2.  Кодирование содержимого формы в соответствии с атрибутом enctype элемента FORM. В случае способа кодирования application/x-www-form-urlencoded полученные строки для каждого элемента соединяются друг с другом символом '&':

name1=value1&name2=value2&...&nameN=valueN

В случае способа кодирования text/plain строки разделяются символами перевода строки и возврата каретки:

name1=value1

name2=value2

...

nameN=valueN

3.  Формирование HTTP-сообщения запроса. В случае метода GET кодированное содержимое формы присоединяется к идентификатору запрашиваемого ресурса (программы CGI) в начальной строке запроса при помощи символа '?':

URI?name1=value1&name2=value2&...&nameN=valueN

В случае метода POST кодированное содержимое формы помещается в тело сообщения. В сообщение запроса включается заголовок Content-Type, в котором содержится способ кодирования содержимого, и заголовок Content-Length, указывающий на длину кодированного содержимого.

4.  Отправка сообщения серверу.

При получении сообщения запроса от клиента сервер выполняет следующие действия:

1.  По идентификатору определяет, что запрашиваемый ресурс является программой.

2.  Выделяет блок памяти для переменных окружения создаваемого процесса. В выделенный блок копируются переменные окружения процесса сервера Web.

3.  Создает переменные окружения с информацией о протоколе HTTP, сервере Web и интерфейсе CGI и добавляет в выделенный блок переменных окружения. В табл. 9 приведены основные переменные окружения CGI.

4.  Запрашиваемый метод из полученного сообщения присоединяется в виде значения к переменной окружения REQUEST_METHOD, после чего созданная переменная добавляется в выделенный блок переменных окружения.

5.  Часть заголовков из полученного сообщения запроса преобразуется в соответствующие переменные окружения и добавляется в созданный блок переменных окружения.


зависящие от реализации команды, касающиеся


Заголовок

Назначение

Pragma

Специальные, зависящие от реализации команды, касающиеся передаваемого содержимого

Transfer-Encoding

Способ кодирования сообщения при передаче

Подробное описание заголовков HTTP/1.0 можно найти в RFC 2068.

В теле сообщения содержится собственно передаваемая информация – полезная нагрузка сообщения. Тело сообщения представляет собой последовательность октетов (байтов). Тело сообщения может быть закодировано, например, для уменьшения объема передаваемой информации, при этом способ кодирования указывается в заголовке объекта Content-Encoding.

Сообщение запроса от клиента к серверу состоит из строки запроса (request-line), заголовков (общих, запросов, объекта) и, возможно, тела сообщения. Строка запроса начинается с метода, затем следует идентификатор запрашиваемого ресурса, версия протокола и завершающие символы конца строки:

<Метод> <Идентификатор> <Версия HTTP>

Метод указывает команду протокола HTTP, которую нужно применить к запрашиваемому ресурсу. Например, метод GET говорит о том, что клиент хочет получить содержимое ресурса. Идентификатор определяет запрашиваемый ресурс. Версия HTTP обозначается строкой следующего вида:

HTTP/<версия>.<подверсия>

В RFC 2068 представлен протокол HTTP/1.1.

Рассмотрим основные методы протокола HTTP.



Код

Поясняющая фраза согласно

RFC 2068

Эквивалентная поясняющая фраза на русском языке

5xx: Коды ошибок сервера

500

Internal Server Error

Внутренняя ошибка сервера

501

Not Implemented

Не реализовано

503

Service Unavailable

Сервис недоступен

505

HTTP Version Not Supported

Не поддерживаемая версия HTTP

Подробную информацию о кодах ответа и заголовках, сопровождающих данные ответы, можно получить в RFC 2068.

За строкой состояния следуют заголовки (общие, ответа и объекта) и, возможно, тело сообщения.

Одной из важнейших функций сервера Web является предоставление доступа к части локальной файловой системы. Для этого в настройках сервера указывается некоторая директория, которая является корневой для данного сервера Web. Чтобы опубликовать документ, то есть сделать его доступным пользователям, "посещающим" данный сервер (осуществляющим с ним соединение по протоколу HTTP), нужно скопировать этот документ в корневую директорию Web-сервера или в одну из ее поддиректорий. При соединении по протоколу HTTP на сервере создается процесс с правами пользователя, как правило, не существующего реально, а специально созданного для просмотра ресурсов сервера. Настраивая права и разрешения данного пользователя, можно управлять доступом к ресурсам Web.



Атрибут

Элементы

Значение

defer

SCRIPT

Отложить выполнение (defer)

start

OL

Начальный пункт списка

type

OL, LI

Стиль списка (1, a, A, i, I)

type

UL, LI

Стиль списка (disc, square, circle)

clear

BR

Управление разбиением текста (left, all, right, none)

color

FONT

Цвет текста

nohref

AREA

Нет ссылки (nohref)

HR

Нет тени ()

valuetype

PARAM

Тип параметра (data, ref, object)

class, id, style, title

Кроме BASE, BASEFONT (class, style, title), HEAD, HTML, META, PARAM (class, style, title), SCRIPT, STYLE, TITLE

Набор параметров, управляющих отображением

Подробное описание каждого атрибута можно найти в стандарте REC-html40.

Средством разработки и описания языков разметки, подобных HTML, является язык SGML (Standard Generalized Markup Language – обобщенный язык разметки). Каждая конструкция данного языка заключается между специальными скобками: "<!" и ">". В языке HTML могут присутствовать конструкции языка SGML, которые браузер должен пропускать. Для указания версии языка HTML, на котором написан документ, следует поместить в первую строку этого документа конструкцию DOCTYPE языка SGML с указанием типа документа и URI реализации версии HTML. Для HTML версии 4.0 эта строка выглядит следующим образом:

<!DOCTYPE HTML PUBLIC "–//W3C//DTD HTML 4.0//EN"  

              "http://www.w3.org/TR/REC-html40/strict.dtd">

Внутри конструкций языка SGML можно помещать комментарии, заключенные между символами "--". Данные комментарии можно использовать и в языке HTML, поскольку последний пропускает конструкции SGML. Для HTML комментарии будут выглядеть следующим образом:

<!-- Текст комментария (возможно многострочный) -->

Подробную информацию о конструкциях языка SGML можно найти в ISO 8879.

Начиная с версии 4.0, в HTML поддерживаются фреймы. Фреймы позволяют отображать в одном окне навигатора несколько независимых документов. Будем считать фреймом рамку вокруг содержимого документа – окна. Окно может быть разбито на несколько частей. При этом каждая часть будет иметь свою собственную рамку – фрейм, имеющий собственное содержимое – окно. Таким образом, в любом фреймовом документе имеется иерархия фреймов и окон.



Атрибут

Элемент

Событие

onclick

Кроме APPLET, BASE, BASEFONT, BDO, BR, FONT, FRAME, FRAMESET, HEAD, HTML, IFRAME, ISINDEX, META, PARAM, SCRIPT, STYLE, TITLE

Щелчок

ondblclick

Двойной щелчок

onkeydown

Клавиша нажата

onkeypress

Клавиша нажата и отпущена

onkeyup

Клавиша отпущена

onmousedown

Кнопка мыши нажата

onmousemove

Мышь перемещена

onmouseout

Курсор мыши покинул область элемента

onmouseover

Курсор мыши перемещен в область элемента

onmouseup

Кнопка мыши отпущена

onload

BODY, FRAMESET

Документ загружен

onunload

Документ выгружен

onreset

FORM

Форма сброшена

onsubmit

Форма отправляется

3. ТЕХНОЛОГИИ СТОРОНЫ СЕРВЕРА


Олег Иванович Стрельников


Основы Web-технологий

Учебное пособие

Редактор Е. И. Кагальницкая

Темплан 2001 г., поз. № 56

Лицензия ИД № 04790 от 18.05.2001 г.

Подписано в печать                      Формат 60´84 1/16

Бумага газетная. Печать офсетная.

Усл. печ. л. 4,18. Уч. – изд. л. 3,43.

Тираж 300 экз. Заказ

Волгоградский государственный технический университет

400131 Волгоград, пр. Ленина, 28.

РПК "Политехник" Волгоградского государственного технического университета

400131 Волгоград, ул. Советская, 35.



OPTIONS


Метод OPTIONS выполняет запрос информации об опциях соединения (например, методах, типах документов, кодировках), которые поддерживает сервер для запрашиваемого ресурса. Этот метод позволяет клиенту определять опции и/или требования, связанные с ресурсом, или возможности сервера, не производя никаких действий над ресурсом и не инициируя его загрузку.

Если ответ сервера – это не сообщение об ошибке, то заголовки объекта содержат информацию, которую можно рассматривать как опции соединения. Например, в заголовке Allow перечислены все методы, поддерживаемые сервером для данного ресурса.

Если идентификатор запрашиваемого ресурса – звездочка ("*"), то запрос OPTIONS предназначен для обращения к серверу в целом.

Если идентификатор запрашиваемого ресурса – не звездочка, то запрос OPTIONS применяется к опциям, которые доступны при соединении с указанным ресурсом.



Основные атрибуты элементов


Атрибут

Элементы

Значение

name

META

Имя переменной

http-equiv

META

Заголовок HTTP

content

META

Значение переменной или заголовка http

background

BODY

URI фонового изображения

bgcolor

BODY

Цвет фона

alink

BODY

Цвет выбранных ссылок

vlink

BODY

Цвет просмотренных ссылок

link

BODY

Цвет ссылок

text

BODY

Цвет текста

cols

FRAMESET

Список колонок в наборе фреймов

rows

FRAMESET

Список строк в наборе фреймов

align

P, H1–H6, DIV

Выравнивание текста (left, right, center, justify)

href

A, AREA, LINK, BASE

URI, на который указывает элемент

coords

A, AREA

Список координат

name

A, APPLET, FRAME, IFRAME, OBJECT, MAP, PARAM,

органы управления

Имя объекта

shape

A, AREA

Тип поверхности (rect, circle, poly, default)

target

A, AREA, BASE, FORM, LINK

Имя фрейма

align

IMG, APPLET, IFRAME, INPUT, OBJECT

Горизонтальное и/или вертикальное выравнивание (top, middle, bottom, left, right)

alt

IMG, APPLET, AREA, INPUT

Краткое описание

border

IMG, OBJECT

Толщина границы (размер)

height

IMG, IFRAME, OBJECT, APPLET

Высота

hspace

IMG, IMG, OBJECT

Горизонтальный отступ

ismap

IMG

Карта (ismap)

vspace

IMG, APPLET, OBJECT

Вертикальный отступ

width

IMG, IFRAME, OBJECT, APPLET, HR, PRE

Ширина

src

IMG, SCRIPT, INPUT, FRAME, IFRAME

URI источника



POST


Метод POST используется для запроса, при котором адресуемый сервер принимает данные, включенные в тело сообщения (объект) запроса, и отправляет их на обработку приложению, указанному как запрашиваемый ресурс. POST разработан для того, чтобы общим методом реализовать следующие функции:

аннотация существующих ресурсов;

регистрация сообщения на электронной доске объявлений (BBS), в конференциях новостей (newsgroups), списках рассылки (mailing lists) или подобной группе статей;

передача блока данных, например результат ввода в форме, процессу обработки;

выполнение запросов к базам данных (БД);

загрузка файлов на сервер.

Фактически функция, выполняемая методом POST, определяется приложением, на которое указывает идентификатор запрашиваемого ресурса. Наряду с методом GET, метод POST используется при создании приложений CGI. Браузер может формировать запросы с методом POST при отправке форм. Для этого элемент FORM документа HTML, содержащего форму, должен иметь атрибут method со значением POST.

Приложение, запуск которого инициируется методом POST, может выполнить действие на сервере и не передать никакого содержимого в качестве результата работы. В зависимости от того, включает ответ тело сообщения, описывающее результат, или нет, код состояния в ответе может быть как 200 (OK), так и 204 (Нет содержимого, No Content).

Если ресурс на сервере был создан, ответ содержит код состояния 201 (Создан, Created) и включает заголовок ответа Location.



в последовательности перехода по клавише


Атрибут

Элементы

Значение

usemap

IMG, INPUT, OBJECT

URI клиентской карты

frameborder

FRAME, IFRAME

Границы фреймов (0, 1)

marginheight, marginwidth

FRAME, IFRAME

Ширина и высота в пикселях

scrolling

FRAME, IFRAME

Полоса прокрутки (yes, no, auto)

noresize

FRAME

Нельзя изменять размер (noresize)

archive

APPLET

URI архива, содержащего аплет

code

APPLET

Класс аплета

codebase

APPLET

Базовый URI

object

APPLET

Потоковый (сериализованный) класс, содержащий объект

standby

OBJECT

Сообщение при загрузке

data

OBJECT

URI объекта

action

FORM

URI обработчика формы

enctype

FORM

Способ кодирования

method

FORM

Метод доступа к обрабатывающему ресурсу сервера (GET, POST)

disabled

Органы управления

Не активен (disabled)

tabindex

Органы управления

Номер в последовательности перехода по клавише TAB

checked

INPUT

Отмеченный элемент (checked)

cols

TEXTAREA

Число столбцов

for

LABEL

Идентификатор связанного управляющего элемента

label

OPTION, OPTGROUP

Иерархия

maxlength

INPUT

Максимальное число вводимых символов

readonly

TEXTAREA, INPUT

Не изменяемый (readonly)

selecting

OPTION

Выбран (selected)

rows

TEXTAREA

Число строк

multiple

SELECT

Разрешен множественный выбор (multiple)

type

INPUT

Тип ввода (text, password, checkbox, radio, submit, reset, file, hidden, image, button)

type

BUTTON

Тип кнопки (submit, reset, button)

size

HR, FONT, BASEFONT, INPUT, SELECT

Размер

value

OPTION, PARAM, INPUT, BUTTON, LI

Значение

language

SCRIPT

Язык скрипта


ПРОТОКОЛ HTTP


Протокол передачи гипертекста HTTP (Hypertext Transfer Protocol, RFC 1945, 2068) предназначен для передачи гипертекстовых документов от сервера к клиенту. Протокол HTTP относится к протоколам прикладного уровня. Согласно RFC, транспортным протоколом для него должен быть протокол с установлением соединения, надежной передачей данных и без сохранения границ между сообщениями. На практике в подавляющем большинстве случаев транспортным протоколом для HTTP является протокол TCP, причем сервер HTTP (сервер Web) находится в состоянии ожидания соединения со стороны клиента стандартно по порту 80 TCP, а клиент HTTP (браузер Web) является инициатором соединения.

В терминах Web все, к чему может получить доступ пользователь, – документы, изображения, программы, – называется ресурсами. Каждый ресурс имеет уникальный для Web адрес, называемый универсальным идентификатором ресурса (URI – Universal Resource Identifier). В самом общем случае URI выглядит следующим образом:

protocol://user:password@host:port/path/file?paremeters#fragment

Отдельные поля URI имеют следующий смысл:

protocol - прикладной протокол, посредством которого получают доступ к ресурсу;

user - пользователь, от имени которого получают доступ к ресурсу либо сам пользователь в качестве ресурса;

password - пароль пользователя для аутентификации при доступе к ресурсу;

host - IP-адрес или имя сервера, на котором расположен ресурс;

port - номер порта, на котором работает сервер, предоставляющий доступ к ресурсу;

path - путь к файлу, содержащему ресурс;

file - файл, содержащий ресурс;

parameters - параметры для обработки ресурсом-программой;

fragment - точка в файле, начиная с которой следует отображать ресурс.

Взаимодействие между клиентом и сервером Web осуществляется путем обмена сообщениями. Сообщения HTTP делятся на запросы клиента серверу и ответы сервера клиенту.

Сообщения запроса и ответа имеют общий формат. Оба типа сообщений выглядят следующим образом: сначала идет начальная строка (start-line), затем, возможно, одно или несколько полей заголовка, называемых, также, просто заголовками, затем пустая строка (то есть строка, состоящая из символов CR и LF), указывающая конец полей заголовка, а затем, возможно, тело сообщения:


начальная строка

поле заголовка 1

поле заголовка 2

...

поле заголовка N

CR LF

тело сообщения

Формат начальной строки клиента и сервера различаются и будут рассмотрены далее. Заголовки бывают четырех видов:

общие заголовки (general-headers), которые могут присутствовать как в запросе, так и в ответе;

заголовки запросов (request-headers), которые могут присутствовать только в запросе;

заголовки ответов (response-headers), которые могут присутствовать только в ответе;

заголовки объекта (entity-headers), которые относятся к телу сообщения и описывают его содержимое.

Каждый заголовок состоит из названия, символа двоеточия ":" и значения. Наиболее важные заголовки приведены в табл. 1.


PUT


Тело сообщения, которое передается в запросе с методом PUT, сохраняется на сервере, причем идентификатор запрашиваемого ресурса будет идентификатором сохраненного документа. Если идентификатор запрашиваемого ресурса указывает на уже существующий ресурс, то включенный в тело сообщения объект рассматривается как модифицированная версия ресурса, находящегося на сервере. Если новый ресурс создан, то сервер сообщает пользовательскому агенту об этом посредством ответа с кодом состояния 201 (Создан, Created).

Различие между методами POST и PUT заключается в различном значении идентификатора запрашиваемого ресурса. URI в запросе POST идентифицирует ресурс, который обрабатывает включенный в тело сообщения объект. Этим ресурсом может быть приложение, принимающее данные. Напротив, URI в запросе PUT идентифицирует объект, включенный в запрос в виде тела сообщения, то есть пользовательский агент назначает данный URI включенному ресурсу.



Сценарии стороны клиента. Язык JavaScript


Одним из основных недостатков языка HTML является пассивность и статичность документов на этом языке, то есть невозможность алгоритмического построения содержимого документа в соответствии с программой, реализующей алгоритм, или в зависимости от действий пользователя, просматривающего документ. Для преодоления этих недостатков в язык HTML введена поддержка сценариев – программ, загружаемых с сервера вместе с документом HTML и выполняемых навигатором при просмотре этого документа. Существует несколько языков, на которых может быть написан сценарий. Наибольшей популярностью пользуется язык JavaScript компании Netscape, первой реализовавшей поддержку сценариев стороны клиента в своем браузере.

Поскольку программа-сценарий выполняется пользовательским агентом на машине клиента, то данную технологию следует отнести к технологиям стороны клиента.

JavaScript, как и другие языки для встраивания сценариев в HTML-документы, имеет программный интерфейс для доступа навигатору. Навигатор, как правило, имеет панель инструментов, строку ввода адреса, рабочую область и строку состояния. Панель инструментов, как минимум, содержит кнопки "Back", "Forward", "Stop", "Reload" и "Home". Используя язык JavaScript, можно управлять содержимым рабочей области и строки состояния, а также открывать новые окна навигатора, возможно, без панели инструментов и строки ввода адреса. Кроме того, можно вызывать простейшие диалоговые панели с кнопками и полями ввода.

Для доступа к компонентам в языке JavaScript используются объекты. Под объектом понимается некоторая программная абстракция, в которой инкапсулированы свойства (данные) и методы (код) некоторого реального объекта. В языке JavaScript между объектами не устанавливается отношения наследования. Таким образом, JavaScript не является объектно-ориентированным языком.

С понятием объекта связано понятие класса. Каждый объект принадлежит определенному классу. Например, каждый объект "окно" принадлежит классу "окно" (window). Можно сказать, что каждое конкретное окно является переменной типа window или экземпляром класса window. С этой точки зрения, понятие класса близко к понятию типа.


В языке JavaScript имеется возможность создавать собственные новые классы, однако данная возможность используется редко из-за малой гибкости (по сравнению с объектно-ориентированными языками) при создании интерфейса нового класса. Можно определить JavaScript как язык для доступа к некоторой объектной библиотеке.

С точки зрения лексики и синтаксиса, язык JavaScript похож на языки C++ и Java.

Рассмотрим следующие элементы языка JavaScript: 

типы;

операции;

операторы;

встроенные функции;

объекты и классы.

Типы языка JavaScript, не соответствующие никаким классам, – числовой и логический, будем условно называть number и bool. Значения типа number – целые и вещественные числа. Значения типа bool соответствуют числовым значениям 0 и 1. Константы языка JavaScript могут быть числовыми и строковыми. Последние имеют тип, соответствующий классу string. Значения остальных типов (bool и других классов) не представляются в виде констант, но могут возвращаться функциями и методами. Следует еще раз отметить, что слов number и bool в JavaScript не существует. Это условное обозначение для указания типов свойств, параметров и возвращаемых значений функций и методов.

В JavaScript имеется ряд операций аналогичных операциям языка C: '+', '–', '*', '/', '%', '<<', '>>', '+=', '–='. Операция '+' для строк перегружена и означает конкатенацию.

Основные операторы JavaScript перечислены в табл. 5.

Таблица 5

Операторы языка JavaScript

Оператор

Описание

var name = value

Объявление переменной name и присвоение ей значения value

if (cond) {...}

else {...}

Оператор условия

while (cond) {...}

Цикл с предусловием

for (init; cond; modif)

 {...}

Цикл с параметром. Перед выполнением цикла осуществляется инициализация init. Перед каждой итерацией цикла проверяется условие cond. После каждой итерации производится модификация параметра цикла modif.

for (prop in obj) {...}

Цикл свойств объекта obj

break

Оператор прерывания цикла

continue

Оператор продолжения цикла

function name(par) {...}

Определение функции

<


Встроенные функции JavaScript перечислены в табл. 6.

Таблица 6

Встроенные функции JavaScript

Функция

Описание

string escape(string)

Перевод строки в escape-последовательность

string unescape(string)

Перевод escape-последовательности в строку

number

 parseFloat(string value)

Перевод строки в вещественное число

number

 parseInt(

  string value,

  [number radix]

 )

Перевод строки в целое число в заданной системе счисления

Bool isNaN(number)

Проверка на "не число" (Not-a-Number). Не числом является, например, бесконечность, получающаяся при делении на 0.

string eval(string)

Выполнить строку

Здесь и далее для объявления функций, свойств и методов применен C-подобный стиль: тип возвращаемого значения, идентификатор (название), список параметров в круглых скобках. Необязательные параметры перечислены в квадратных скобках. В качестве типа указывается имя класса или одно из слов number или bool.

Объекты JavaScript описывают интерфейс доступа к документу в навигаторе и инкапсулируют его свойства и методы.

В табл. 7 приведены свойства и методы основных классов JavaScript.

Таблица 7

Классы JavaScript

Свойства и методы

Описание

string: Строка (с информацией о выводе на экран)

number length

Длина строки

string big()

Большой шрифт

string small()

Маленький шрифт

string bold()

Полужирный шрифт

string italics()

Наклонный шрифт

string strike()

Перечеркнутый

string fixed()

Моноширинный шрифт

string sub()

Нижний индекс

string sup()

Верхний индекс

string blink()

Мигающая строка

string toLowerCase()

Строчные буквы

string toUpperCase()

Заглавные буквы

string fontsize(number size)

Установить размер символов

string fontcolor(string color)

Установить цвет символов

string anchor(string name)

Превращает строку в "якорь" name

string link(string href)

Превращает строку в гиперссылку href

string charAt(number i)

i-й символ строки

number indexOf(string what, [number from])

Позиция подстроки what, начиная с позиции from

number lastIndexOf(string what, [number from])

Позиция подстроки what при просмотре в обратном порядке, начиная с from

string substring(number begin, number end)

Подстрока

window: Окно

string name

Название окна

string defaultStatus

Содержимое строки состояния по умолчанию

string status

Строка состояния

number length

Число фреймов в окне

frame[] frames

Массив фреймов

Продолжение табл. 7

Свойства и методы

Описание

window self

Ссылка на себя

window window

Ссылка на себя

window parent

Родительское окно

window top

Ссылка на верхнее окно в иерархии

document document

Документ

frame frame

Фрейм

location location

Местоположение отображаемого содержимого

window open(string URL, string Name, string features)

Открыть новое окно. Параметр features представляет собой список параметров и значений, перечисленных через запятую. Название параметра и значение разделяются символом "=". Возможны следующие параметры: toolbar, location, directories, status, menubar, scrollbars, resizeable, width, height. Все параметры, кроме width и height принимают логические значения (yes, no, 1 или 0). Параметры width и height принимают целочисленные значения.

close()

Закрыть окно

timeout setTimeout(string expr, number msec)

Установить таймаут

clearTimeout(timeout t)

Удалить таймаут

alert(string message)

Диалоговая панель с сообщением message и кнопкой Ok

bool confirm(string message)

Диалоговая панель с сообщением message и кнопками Ok и Cancel

string prompt(string message, string default)

Диалоговая панель с сообщением и полем ввода

frame: Фрейм

string name

Название

number length

Число внутренних фреймов

frame[] frames

Набор фреймов внутри данного

frame self

Ссылка на себя

frame window

Ссылка на себя

frame parent

Ссылка на родительский фрейм

window parent

Ссылка на родительское окно

timeout setTimeout(string expr, number msec)

Установить таймаут

clearTimeout

 (timeout t)

Удалить таймаут

Продолжение табл. 7

Свойства и методы

Описание

location: Идентификатор ресурса

string hash

Поле fragment в URI

string host

Поля host и port в URI

string hostname

Поле host в URI

string href

URI

string pathname

Поле path в URI

number port

Поле port в URI

string protocol

Поле protocol в URI

string search

Параметры в URI для программы CGI

document: Документ (содержимое окна)

string title

Заголовок

string URL

URI

Date lastModified

Дата и время последней модификации документа

string fgColor

Цвет переднего плана

string bgColor

Цвет фона

string linkColor

Цвет ссылки

string alinkColor

Цвет ссылки во время перехода

string vlinkColor

Цвет посещенной ранее ссылки

anchor anchor

Якорь

link link

Ссылка

history history

Набор ссылок

form form

Форма

anchor[] anchors

Массив "якорей"

link[] links

Массив ссылок

form[] forms

Массив форм

string referrer

URI документа, из которого вызван текущий

open([string mime])

Начать вывод содержимого документа

close()

Завершить вывод содержимого документа

write(...)

Вывести в качестве содержимого документа

writeln(...)

Вывести в качестве содержимого документа и перевести строку

history: Набор ссылок

number length

Число ссылок в памяти

back()

Вернуться на предыдущую страницу

forward()

Загрузить следующую страницу

go(number delta)

Перейти

go(string location)

Перейти

static Math: Математические константы и функции

number E

E

Продолжение табл. 7

Свойства и методы

Описание

number LN2

ln(2)

number LN10

ln(10)

number LOG2E

log2(e)

number LOG10E

log10(e)

number PI

p

number SQRT1_2

1/sqrt(2)

number SQRT2

sqrt(2)

number abs(number a)

Абсолютное значение

number acos(number a)

Арккосинус

number asin(number a)

Арксинус

number atan(number a)

Арктангенс

number ceil(number a)

Наименьшее целое, не меньшее a

number cos(number a)

Косинус

number exp(number a)

Экспонента

number floor(number a)

Наибольшее целое, не большее a

number log(number a)

Натуральный логарифм

number max(number a, number b)

Максимум

number min(number a, number b)

Минимум

number pow(number a, number b)

ab

number random()

Случайное число от 0 до 1

number sin(number a)

Синус

number sqrt(number a)

Квадратный корень

number tan(number a)

Тангенс

Date: Дата и время

Date()

Инициализация объекта текущей датой и временем

static number UTC(number year, number month, number day [[[, number hrs], number min], number sec])

Возвращает число миллисекунд, прошедших от Epoche (01.01.1970 00:00:00 GMT) до даты, указанной в качестве параметра

static number parse(string time)

Возвращает число миллисекунд, прошедших от 01.01.1970 00:00:00 по местному времени до даты, указанной в качестве параметра

number getDate()

Число

number getDay()

День недели

number getHours()

Часы

number getMinutes()

Минуты

number getMonth()

Месяц

number getSeconds()

Секунды

number getTime()

Число миллисекунд с Epoche

number getTimeZoneOffset()

Смещение временной зоны

Окончание табл. 7

Свойства и методы

Описание

number getYear()

Год, начиная с 1900

setDate(number Date)

Установка даты

setHours(number Hours)

Установка часов

setMinutes(number Minutes)

Установка минут

setMonth(number Month)

Установка месяца

setSeconds(number Seconds)

Установка секунд

setTime(number Time)

Установка времени в миллисекундах, прошедших с Epoche

setYear(number Year)

Установка года

string toGMTString()

Преобразование к строке с датой и временем по Гринвичу

string toLocaleString()

Преобразование к строке с местными датой и временем

Array: Массив

Array()

Пустой массив

Array(number size)

Массив с size элементами

Array(a0, a1, ...)

Массив с элементами,

инициализированными a0, a1, ...

number length

Число элементов массива

string join()

Объединение элементов массива в строку

reverse()

Изменение порядка элементов массива на обратный

sort()

Сортировка элементов в массиве

Image: Изображение

Image()

Пустое изображение

Image(number w, number h)

Пустое изображение с заданными размерами

string src

URI ресурса, содержащего изображение

<


В объектно-ориентированном анализе при проектировании и описании объектных библиотек чаще всего рассматриваются иерархии двух видов: иерархия классов (иерархия "is-a") и иерархия объектов (иерархия "part-of"). В иерархии классов отображаются отношения наследования между классами. Поскольку в JavaScript не существует наследования, то нет и иерархии данного типа. В иерархии объектов отображаются отношения агрегации (то есть отношения целого и части) между классами и объектами. На рис. 1 приведена иерархия объектов JavaScript.

Для доступа к свойствам и методам объекта применяется операция ".":

<объект>.<свойство>

<объект>.<метод>(<параметры>)

Некоторые свойства и методы класса могут быть статическими. Такие свойства относятся не к конкретному объекту, а к классу в целом. Можно получить доступ к этим свойствам и методам, даже не имея доступа ни к одному из объектов класса. В этом случае операция "." применяется не к объекту, а к классу:

<класс>.<свойство>

<класс>.<метод>(<параметры>)

Класс, в котором все свойства и методы являются статическими, называется статическим. Статические свойства, методы и классы в табл. 7 приведены со словом "static" перед идентификатором.

Методы некоторых классов могут иметь то же имя, что и класс. Такие методы называются конструкторами и  используются для создания динамических объектов при помощи операции new, единственным аргументом которой является конструктор с параметрами.

Массивы в языке JavaScript являются объектами некоторого предопределенного класса Array. В отличие от C и C++ массивы в JavaScript являются динамическими, то есть размер массива автоматически увеличивается при присваивании значения не существующему элементу массива. Индексы массива нумеруются с нуля. Для доступа к элементам массива используются квадратные скобки. Так же как и обычные переменные, элементы массива не имеют типа. Тип имеют значения элементов. В различных элементах массива могут храниться значения различных типов.



В языке JavaScript имеется возможность определять собственные функции. Определение функции в JavaScript имеет следующий вид:

function <идентификатор>(<параметры>) { ... }

Идентификатор функции – это имя, по которому функция будет вызываться в сценариях JavaScript. Параметры указываются без типов и разделяются символом ",". Пользовательские функции в JavaScript не могут возвращать значения, в отличие от встроенных функций.

Для размещения сценариев JavaScript внутри документов HTML используется элемент SCRIPT:

<SCRIPT language=l src=s defer></SCRIPT>

Начальный и конечный тэги обязательны. Атрибут language указывает язык, на котором написан сценарий. Для сценариев на языке JavaScript этот атрибут должен принимать значение "JavaScript". В атрибуте src указывается URI файла со сценарием. Атрибут defer указывается, если сценарий не осуществляет вывод на экран при помощи методов write и writeln объекта document для ускорения формирования содержимого страницы.


Сценарии стороны сервера. Технология PHP


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

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

2.       Содержимое документа HTML формируется приложением CGI. При изменении дизайна приходится осуществлять перекомпиляцию приложения.

3.       Приложения CGI, использующие интерфейс прикладных программ (API) локальной операционной системы сервера, плохо переносимы.

Одним из вариантов решения приведенных проблем является использование технологии PHP для динамического формирования документов HTML на стороне сервера. Технология PHP является технологией стороны сервера. Аббревиатура PHP раскрывается рекурсивно: "PHP: Hypertext Preprocessor". Основными сферами применения данной технологии являются создание серверных приложений и интерфейсов к базам данных.

Приложения PHP встраиваются в документы HTML в качестве сценариев, подобно сценариям JavaScript, однако, в отличие от JavaScript, сценарии PHP выполняются не пользовательским агентом, а специальной программой – проигрывателем сценариев PHP, которая является приложением CGI и запускается сервером. Пользовательский агент получает результат выполнения запрошенного им сценария и не видит кода самого сценария. Документ HTML, содержащий сценарий PHP, как правило, имеет специальное расширение, например, php3 или phtml. При получении запроса такого документа сервер выполняет следующие действия:

1.       Запрашивает локальную операционную систему о типе файла php3 или phtml.

2.       Получив ответ, что данный файл является сценарием и путь к программе, выполняющей подобные сценарии, запускает проигрыватель сценариев, указав запрошенное пользователем имя файла в качестве параметра запуска.


3.      

Проигрыватель сценариев PHP анализирует содержимое документа, выполняя инструкции PHP и передавая остальное содержимое клиенту без изменений.

На рис. 3 приведено взаимодействие различных компонентов при запросе клиентом сценариев PHP.

Инструкции PHP внутри документа html располагаются внутри специальных скобок, состоящих из последовательностей символов "<?" и "?>" или "<?php" и "?>". Можно также для включения сценариев PHP использовать элемент SCRIPT с атрибутом language, имеющим значение "php". Текст, находящийся вне специальных скобок, и называемый статической частью документа, проигрывателем сценариев PHP не анализируется и передается клиенту без изменений. Фактически, статическая часть является шаблоном документа HTML.

Синтаксис языка сценариев PHP похож на синтаксис языков программирования C, C++, Java. Сценарий PHP представляет собой оператор PHP или последовательность операторов PHP, разделенных символами ";".

Основными объектами языка сценариев PHP являются переменные, выражения, операторы и функции.

Переменные в PHP не имеют типа. Тип переменной определяется хранимым в данной переменной значением. Тип переменной динамически изменяется в зависимости от контекста. В PHP различаются следующие типы:

целый - integer;

действительный - double;

строковый - string;

массив - array;

объект - object.

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

Переменные различаются по именам. Имя переменной в PHP начинается с символа "$". Для определения переменной нужно присвоить ей значение при помощи операции присваивания. Способы создания нового значения переменной отличаются для различных типов.

Переменной скалярного типа (integer, double, string) можно присвоить в качестве значения соответствующую константу.



Массивы в PHP являются не набором переменных, а переменными некоторого определенного типа array. В языке сценариев PHP массивы ассоциативны. Это означает, что индексом массива может являться не только число, но и строка. Индекс ассоциативного массива называется ключом. Новый массив может быть создан либо при создании элемента массива, либо при помощи вызова array. Для создания нового элемента массива нужно при присваивании значения переменной после имени указать ключ в квадратных скобках. При этом имя переменной будет именем созданного массива, а значение в квадратных скобках – ключом для получения доступа к значению созданного элемента массива. В PHP массивы являются динамическими. При присваивании значения элементу массива проверяется, существует ли уже в массиве элемент с заданным ключом. Если существует, то его значение заменяется на новое. В противном случае создается новый элемент массива. Все элементы массива объединены в двусвязный список. В массиве имеется внутренний указатель текущего элемента. Имеется возможность просмотреть текущее значение указателя, а также переместить указатель на предыдущий или последующий элемент в списке, а также на начальный или конечный элементы списка. Таким образом, можно осуществить последовательный доступ к каждому элементу массива. Для элементов массива с целочисленными ключами ведется счетчик индексов. Значением счетчика является увеличенное на единицу максимальное в массиве значение целочисленного ключа (индекса). Если массив не содержит элементов с целочисленными ключами, то счетчик индексов имеет нулевое значение. Если при присваивании значения элементу массива не указывать ключа в квадратных скобках, то ключом для нового элемента будет значение счетчика индексов, который после создания нового элемента увеличится на единицу. Данная возможность позволяет добавлять в конец массива элементы с последовательными индексами.

Для создания массива с несколькими начальными элементами используется ключевое слово array, после которого в круглых скобках перечисляются присваиваемые элементам массива значения. В качестве ключей элементов используется счетчик индексов. Такое назначение ключей по умолчанию можно изменить при помощи операции "=>". Данная операция применяется в следующем виде:



ключ => значение

Если в списке значений array встречается подобная операция, то очередному элементу массива будет присвоен указанный ключ. Данная возможность используется для создания массивов со строковыми ключами, а также для пропуска значений целочисленных ключей (индексов).

Объекты в PHP служат для поддержки объектного программирования. Для создания нового объекта используется вызов new.

Переменным любого типа можно присваивать в качестве значения другие переменные, а также значения, возвращаемые функциями и методами объектов.

В PHP можно создавать ссылки на переменные. Ссылка – это имя переменной, отличное от заданного при определении. Для создания ссылки нужно определить переменную,  значением  которой будет имя ссылки. Если теперь присвоить значение переменной, в которой хранится имя ссылки, указав перед именем переменной двойной символ "$$", то будет создана ссылка, к которой можно обращаться по имени как к обычной переменной. При одновременной работе со ссылками и массивами возникает неопределенность, связанная с приоритетами символов "$" и квадратных скобок. Для разрешения данной неопределенности можно использовать фигурные скобки как символы явного определения приоритетов.

При выполнении сценария PHP интерпретатор определяет ряд переменных, связанных с параметрами сервера, протокола HTTP, самого интерпретатора, а также полученным запросом. Каждый орган управления формы, содержащийся в документе HTML, имеет атрибуты name и value. При разборе полученного от клиента запроса интерпретатор PHP создает переменные, именами которых являются значения атрибутов name, а значениями – значения атрибутов value соответствующих органов управления. Это упрощает разбор форм в сценариях PHP.

Важным понятием языка интерпретатора PHP является понятие выражения. Выражение – это константа, переменная или  составленная из них при помощи операций конструкция. Выражение может быть составной частью более сложного выражения. Каждое выражение имеет значение, которое называется значением выражения. Значением операции является ее результат. Тип значения выражения зависит от типов входящих в выражение переменных и констант, а также от операций.



Помимо типов, которые могут иметь переменные, значения выражений могут быть булевого типа. Выражения булевого типа могут принимать только значения FALSE или TRUE. Значения булевого типа не могут быть присвоены переменным, но иногда подставляются в функции и операторы. При подстановке переменных вместо булевых выражений происходит преобразование типа переменной к булевому. Для целых чисел значение FALSE имеет только 0, для строк – строки "" и "0". Операции языка интерпретатора PHP приведены в табл. 10.

Таблица 10

Операции PHP

Знак

Операция

Арифметические

+

Сложение



Вычитание

*

Умножение

/

Деление

%

Остаток от деления

Строковые

.

Конкатенация строк

Присваивание

=

Обычное присваивание

+=

Присваивание со сложением

–=

Присваивание с вычитанием

*=

Присваивание с умножением

/=

Присваивание с делением

%=

Присваивание с получением остатка

.=

Присваивание с конкатенацией

Побитовые

&

Побитовое умножение (И)

|

Побитовое сложение (ИЛИ)

~

Побитовое отрицание (НЕ)

Окончание табл. 10

Знак

Операция

Логические

and

Логическое И

or

Логическое ИЛИ

xor

Логическое исключающее ИЛИ

!

Логическое отрицание

&&

Логическое И

||

Логическое ИЛИ

Сравнение

==

Равно

!=

Не равно



Меньше



Больше

<=

Меньше или равно (не больше)

>=

Больше или равно (не меньше)

Сценарий PHP состоит из операторов. Помимо оператора вычисления выражения, существует ряд операторов, характерных для структурных языков. Некоторые операторы PHP имеют два синтаксиса: синтаксис языка C и модифицированный синтаксис для вставки HTML-кода внутрь операторов. В табл. 11 приведены основные операторы PHP. Операторы записаны с использованием синтаксиса языка C.

Таблица 11

Операторы PHP

Синтаксис

Оператор

if (cond1) {...}

elseif (cond2) {...}

...

else {...}

Ветвление

while (cond) {...}

Цикл с предусловием (цикл ПОКА)

do {...} while

(cond)

Цикл с постусловием (цикл ДО)

for (init; cond; expr) {...}

Цикл с предусловием

break

Безусловный переход на конец операторов while, do while, for и switch

continue

Безусловный переход на следующий цикл

Окончание табл. 11

Синтаксис

Оператор

switch (var) {

 case val1: ...

 case val2: ...

 ...

 default: ...

}

Выбор

function name(parameters)

 {...}

Определение функции

return val

Возврат значения

<


Синтаксис определения функции в интерпретаторе PHP отличается от синтаксиса языка C. Функция – это набор операторов или часть кода, выполняемая при разборе специальной операции, называемой вызовом функции. Для вызова функции указывается ее имя, за которым в круглых скобках следует набор параметров, передаваемых функции.

Пользовательские функции определяются при помощи оператора function. При определении функции указывается ее имя и список параметров. Параметры перечисляются через запятую. Каждый параметр считается локальной переменной функции. Внутри блока операторов функции могут определяться новые переменные. Каждая переменная, определенная на внутреннем уровне является локальной. Все обычные локальные переменные создаются в стеке при каждом вызове функции и уничтожаются после завершения.

Функции не имеют доступа к глобальным переменным. Для получения доступа к глобальным переменным последняя должна быть локально переобъявлена. Локальное переобъявление выполняется указанием ключевого слова global перед именем глобальной переменной, к которой необходимо получить доступ.

Помимо обычных (автоматических) локальных переменных, в функции можно определить статические переменные, которые создаются при определении функции и существуют все время пока выполняется программа. Для определения статической переменной перед ее именем нужно указать ключевое слово static. Статические переменные сохраняют свое значение после выхода из функции.

Функции могут возвращать значения. Для этого используется оператор return. Тип возвращаемого значения зависит от типа параметра оператора return.

Стандартно параметры передаются в функцию по значению. Это означает, что при вызове функции для каждого параметра создается локальная переменная, куда копируется значение передаваемого параметра. В PHP имеется возможность организовать передачу параметров функции по ссылке. Для этого в списке параметров при определении функции перед именем параметра необходимо указать символ "&". При передаче по ссылке при вызове функции для передаваемого параметра создается еще одно имя, которое является именем параметра или, что то же самое, именем локальной переменной функции. При передаче по ссылке у функции имеется возможность изменять значение передаваемой переменной. Если необходимо при некоторых вызовах одной и той же функции передавать параметр по значению, а при других по ссылке, то функция должна быть определена обычным образом. При этом при вызове функции с передачей параметра по ссылке следует в списке параметров перед соответствующим параметром указать символ "&".



Параметры функции могут иметь значение по умолчанию. Для указания значения параметра по умолчанию в списке параметров после имени параметра ставится символ "=", за которым следует необходимое значение. Если какой-либо параметр имеет значение по умолчанию, то все последующие параметры в списке также должны иметь значения по умолчанию. При вызове функций со значениями параметров по умолчанию соответствующие параметры вызова можно опустить.

В интерпретаторе PHP имеются встроенные функции. Встроенные функции определены в самом интерпретаторе или в загружаемых модулях. В табл. 12 приведены основные встроенные функции PHP.

Таблица 12

Встроенные функции PHP

Функция

Описание

Математические функции

mixed abs(mixed x)

Абсолютное значение аргумента x

int ceil(double x)

Наименьшее целое, большее x

int floor(double number)

Наибольшее целое, меньшее x

Продолжение табл. 12

Функция

Описание

double round(double x)

Округление

string decbin(int dec)

Преобразование десятичного числа в двоичное

string dechex(int dec)

Преобразование десятичного числа в шестнадцатеричное

string decoct(int dec)

Преобразование десятичного числа в восьмеричное

int bindec(string bin)

Преобразование двоичного числа в десятичное

int hexdec(string hex)

Преобразование шестнадцатеричного числа в десятичное

int octdec(string oct)

Преобразование восьмеричного числа в десятичное

int rand([int min,

 int max])

Получить случайное число

void srand(int seed)

Инициализировать генератор случайных чисел

int getrandmax()

Получить максимальное число, возвращаемое rand

int mt_rand([int min,

 int max])

Получить случайное число

void mt_srand(int seed)

Инициализировать генератор случайных чисел

int mt_getrandmax()

Максимальное число, возвращаемое mt_rand

double sqrt(double x)

Квадратный корень

double exp(double x)

Экспонента

double pow(double x,

 double y)

xy

double log(double x)

Натуральный логарифм

double log10(double x)

Десятичный логарифм

double pi()

p

double cos(double x)

Косинус

double sin(double x)

Синус

double tan(double x)

Тангенс

double acos(double x)

Арккосинус

double asin(double x)

Арксинус

double atan(double x)

Арктангенс

double atan2(double y,

 double x)

Арктангенс y/x

Обработка строк

void print(string str)

Вывести строку в стандартный поток вывода

int printf(string format,

 mixed arg, ...)

Форматированный вывод

string sprintf(

 string format,

 mixed arg, ...)

Форматировать строку

Продолжение табл. 12

Функция

Описание

string addslashes(

 string str)

Экранирование символов "$", "\", "'" и 0 в строке str

string stripslashes(

 string str)

Удалить экранирующие символы из строки

string chr(int ascii)

Получить символ с заданным кодом

int ord(string ch)

Код символа

string convert_cyr_string(

 string str, string from,

 string to)

Перевод строки из одной русскоязычной кодировки в другую

void parse_str(string str)

Разбить строку запроса и создать соответствующие переменные

Обработка массивов

int count(mixed arr)

Число элементов массива

mixed current(array arr)

Текущий элемент массива

mixed pos(array arr)

Псевдоним current

array each(array arr)

Получить в виде массива пару ключ/значение текущего элемента arr

mixed key(array arr)

Ключ текущего элемента массива

mixed reset(array arr)

Установить внутренний указатель массива на начальный элемент

mixed prev(array arr)

Переместить указатель массива на предыдущий элемент

mixed next(array arr)

Переместить указатель массива на следующий элемент

mixed end(array arr)

Установить внутренний указатель массива на последний элемент

void sort(array arr)

Сортировка массива

void rsort(array arr)

Сортировка массива в обратном порядке

void asort(array arr)

Сортировка ассоциативного массива array

void arsort(array arr)

Сортировка ассоциативного массива arr в обратном порядке

int ksort(array arr)

Сортировка ассоциативного массива по ключам

Процессы

string exec(

 string command [,

 array output [,

 int return_code]]

)

Выполнить команду command оболочки UNIX. Стандартный вывод будет записан в массив строк output, код возврата – в переменную result_code. Возвращается последняя строка стандартного потока вывода

string system(

 string cmd [,  int ret])

Выполнить команду и возвратить результат

int chdir(string dir)

Изменить текущий рабочий каталог

void putenv(string str)

Установить значение переменной окружения

Продолжение табл. 12

Функция

Описание

string getenv(string var)

Получить значение переменной окружения

void sleep(int sec)

Задержка выполнения текущего процесса на sec секунд

void usleep(int us)

Задержка выполнения текущего процесса на us микросекунд

int sem_get(int key

 [, int max [, int perm]])

Получить идентификатор семафора

int sem_acquire(int sem)

Уменьшение счетчика семафора

int sem_release(int sem)

Увеличение счетчика семафора

Файлы и каталоги

int copy(string src,

 string dest)

Копировать файл

int rename(string old,

 string new)

Переименовать файл

int unlink(

 string filename)

Удалить файл

int readfile(

 strinf filename)

Прочитать текстовый файл в стандартное устройство вывода

array file(string filename)

Прочитать текстовый файл в массив строк

int filesize(

 string filename)

Размер файла

int file_exists(

 string filename)

TRUE, если файл существует

int fopen(string filename,

 string mode)

Открыть файл

string fgetc(int fd)

Прочитать символ из файла

string fgets(int fd,

 int maxlen)

Прочитать из файла строку максимальной длиной maxlen

int fputs(int fd, string str

 [, int length])

Записать строку в файл

string fread(int fp,

 int len)

Бинарное чтение файла

int fwrite(int fd,

 string str, int len)

Бинарная запись в файл

int ftell(int fd)

Текущая позиция указателя

int fseek(int fd, int offset)

Переместить внутренний указатель файла

int rewind(int fd)

Переместить указатель файла на начало

int feof(int fd)

TRUE, если дескриптор fd указывает на конец файла

int fclose(int fd)

Закрыть файл

int popen(

 string command,

 string mode)

Запустить процесс command и возвратить дескриптор стандартного потока ввода или стандартного потока вывода созданного процесса

Продолжение табл. 12

Функция

Описание

int pclose(int fd)

Закрыть поток, открытый popen

int mkdir(string dir,

 int mode)

Создать директорию

int rmdir(string dir)

Удалить директорию

int opendir(string dir)

Открыть директорию

string readdir(int fd)

Получить имя очередного файла в каталоге

void rewinddir(int fd)

Переместить указатель каталога на первый файл

void closedir(int fd)

Закрыть директорию

void clearstatcache()

Очистить файловый кэш

flush()

Очистка буфера стандартного вывода

int fsockopen(string host,

 int port)

Открыть сокет

Дата и время

int time()

Получить текущее время в формате UNIX

string date(string format,

 int timestamp)

Строковое представление локальной даты и времени в указанном формате

string gmdate(

 string format,

 int timestamp)

Преобразовать дату и время GMT в формате UNIX в форматированную строку

array getdate(

 int timestamp)

Преобразовать дату и время в ассоциативный массив

int mktime(int hour,

 int minute, int second,

 int month, int day,

 int year)

Дата и время в формате UNIX

int gmmktime(int hour,

 int minute, int second,

 int month, int day,

 int year)

Дата и время GMT в формате UNIX

TCP/IP, HTTP, CGI, PHP

string gethostbyname(

 string host)

Получить IP-адрес хоста

string gethostbyaddr(

 string addr)

Получить имя хоста по IP-адресу

int header(string hdr)

Отправить заголовок HTTP

string htmlspecialchars(

 string str)

Преобразовать специальные символы HTML в строке str в escape-последовательности

int isset()

TRUE, если переменная определена

void eval(string code)

Обработка code в качестве вложенного сценария

void exit()

Завершить текущий сценарий

Окончание табл. 12

Функция

Описание

int phpinfo()

Вывод информации о текущей реализации PHP

string phpversion()

Вывод информации о текущей версии PHP

<


Более подробную информацию о встроенных функциях языка интерпретатора PHP можно найти в руководствах по этому языку.

4. ПУБЛИКАЦИЯ БАЗ ДАННЫХ В INTERNET

Публикация баз данных в Internet является одной из наиболее популярных и быстро развивающихся отраслей Web. Под публикацией БД в Internet будем понимать создание программного обеспечения, позволяющего частично или полностью осуществлять работу с удаленной БД при помощи клиента Web. Как правило, при публикации предоставляется возможность просмотра содержимого БД, однако в общем случае подразумевается также возможность модификации и администрирования БД. Публикация в Internet подразумевает также публикацию в локальных сетях, созданных по технологии Internet (Intranet). С точки зрения создания программного обеспечения БД, публикацию БД можно рассматривать с двух сторон:

1.  Создание программного обеспечения БД, формирующего отчеты в виде документов HTML.

2.  Создание Web-интерфейса к БД.

Публикация в Internet имеет следующие преимущества по сравнению с обычными локальными и сетевыми БД:

1)    возможность удаленного доступа к БД через глобальную или локальную сеть;

2)    использование преимуществ протокола HTTP при передаче различной, в том числе мультимедийной, информации;

3)    наличие стандартного интерфейса у БД.

Web-интерфейс является стандартом де-факто для любого программного обеспечения, в том числе БД.

Существует два основных подхода к публикации БД в Internet. Первый подход подразумевает формирование статических документов HTML из содержимого БД с последующим доступом к сформированным документам при помощи сервера Web. При модификации содержимого БД осуществляется обновление документов HTML. Программу, осуществляющую преобразование содержимого БД в набор документов

HTML, будем называть преобразователем. На рис. 4 показано взаимодействие программ при публикации БД в Internet в рамках первого подхода.

Публикация БД в Internet  в рамках первого подхода сводится к написанию программы-преобразователя, которая будет периодически или при изменении БД полностью или частично модифицировать документы HTML. К недостаткам первого подхода можно отнести сложности модификации БД и поиска в БД.



Второй подход состоит в динамической генерации документов HTML в соответствии с запросами пользователя Web. При запросе пользователя к БД сервер Web запускает программу, которая передает запрос БД, получает ответ, формирует в соответствии с полученным ответом документ HTML и отправляет его клиенту Web. Программа, осуществляющая работу с БД, может быть создана с использованием любой технологии стороны сервера (например, CGI), либо быть сценарием стороны сервера (например, PHP). На рис. 5 показано взаимодействие программ при публикации БД в Internet с использованием технологии CGI.

Приложение CGI фактически является в данном случае посредником между СУБД и клиентом Web. Архитектура системы на рис. 5 является трехзвенной, в отличие от двухзвенной архитектуры "Клиент-Сервер". Общий вид трехзвенной архитектуры изображен на рис. 6.

При публикации БД в Internet с использованием технологии CGI тонким клиентом является клиент Web, толстым клиентом – приложение CGI, а сервером – СУБД, которая в данном случае называется сервером баз данных.

Приведенные два подхода к публикации БД в Internet могут комбинироваться. В любом случае, при публикации существует программа, которая обращается к СУБД для работы с БД. Как правило, взаимодействие между программой, работающей с БД, и СУБД осуществляется посредством запросов на каком-либо языке запросов. Стандартным языком запросов является язык SQL. Данный язык содержит команды создания таблиц и схемы БД, добавления записей в таблицу, извлечения данных из БД, модификации и удаления записей в таблице. SQL запросы передаются от приложения к серверу БД посредством какого-либо зависящего от реализации сервера средства межпроцессного взаимодействия. Наиболее перспективным является использование интерфейса сокетов, поскольку в этом случае запросы могут передаваться между различными хостами. Существуют также реализации СУБД в виде библиотек статической компоновки. В этом случае код СУБД входит в код программы, работающей с БД, что приводит к увеличению размера загрузочного модуля приложения и неэффективному расходу памяти. Поэтому такой способ реализации СУБД целесообразно применять только для однозадачных операционных систем.



Программный интерфейс сервера БД зависит от реализации. Как правило, производители СУБД поставляют вместе с сервером БД библиотеки, в которых реализован API для доступа к БД. Ниже приведен список наиболее распространенных в настоящее время СУБД (серверов БД):

BDE;

ODBC;

InterBase Server;

Microsoft SQL Server;

MySQL;

mSQL;

PostgreSQL;

SyBase;

Informix;

Oracle.

Программный интерфейс, как правило, включает средства инициализации СУБД, установления связи с БД, передачи запросов БД и разбора ответов от сервера. Рассмотрим подробнее API некоторых серверов БД.

Фирма Inprise поставляет вместе со своей СУБД BDE два программных интерфейса различного уровня. Программный интерфейс низкого уровня (IDAPI) - это библиотека функций для доступа к базам данных в различных форматах. Интерфейс высокого уровня - это библиотека компонентов для сред визуального программирования Delphi и C++Builder, которая использует интерфейс низкого уровня. В табл. 13 приведены основные классы библиотеки компонентов BDE.

Таблица 13

Основные классы библиотеки компонентов BDE

Название класса

Описание

TDataModule

Контейнер для хранения остальных компонентов BDE

TDatabase

База данных. Содержит название БД или папку с таблицами БД

TQuery

SQL запрос. Включает содержимое запроса и метод для его отправки серверу

TDataSet

Набор данных. Включает данные, полученные от сервера в качестве ответа

Вместе с сервером MySQL фирмы TcX поставляется библиотека, реализующая API для доступа к БД MySQL. В табл. 14 приведены основные функции этой библиотеки.

Таблица 14

Основные функции библиотеки MySQL

Функция

Описание

MYSQL *mysql_init(

 MYSQL *mysql);

Инициализация структуры MYSQL для последующего подключения к СУБД

MYSQL *mysql_connect(

 MYSQL *mysql,

 const char *host,

 const char *user,

 const char *passwd);

Установка соединения с СУБД без соединения с БД

int mysql_create_db(

 MYSQL *mysql,

 const char *db);

Создание новой БД. Возвращает 0 в случае успешного завершения

int mysql_select_db(

 MYSQL *mysql,

 const char *db);

Установить соединение с БД. Возвращает 0 в случае успешного завершения

Продолжение табл. 14

Функция

Описание

int mysql_query(

 MYSQL *mysql,

 const char *query);

Отправить запрос SQL. Возвращает 0 в случае успешного завершения

int mysql_real_query(

 MYSQL *mysql,

 const char *qyery,

 unsigned int length);

Отправить запрос SQL, содержащий двоичные данные. Возвращает 0 в случае успешного завершения

MYSQL_RES *

mysql_store_result(

 MYSQL *mysql);

Получить результат последнего запроса

unsigned int

mysql_num_fields(

 MYSQL_RES *result);

Количество полей в полученном результате

int mysql_num_rows(

 MYSQL_RES *result);

Количество записей в полученном результате

MYSQL_FIELD *

mysql_fetch_fields(

 MYSQL_RES *result);

Возвращает массив структур MYSQL_FIELD, содержащих поля полученного ответа

MYSQL_ROW

mysql_fetch_row(

 MYSQL_RES *result);

Выбрать текущую запись из набора и переместить указатель на следующую запись

void mysql_data_seek(

 MYSQL_RES *res,

 unsigned int offset);

Перемещение указателя в наборе данных на указанную позицию

my_bool mysql_eof(

 MYSQL_RES *res);

Возвращает ненулевое значение, если указатель набора данных перемещен за последнюю запись в наборе

void mysql_free_result(

 MYSQL_RES *result);

Освобождает память, занятую результатами последнего запроса

Окончание табл. 14

Функция

Описание

int mysql_drop_db(

 MYSQL *mysql,

 const char *db);

Уничтожение БД. Возвращает 0 в случае успешного завершения

unsigned int mysql_errno(

 MYSQL *mysql);

Возвращает номер последней ошибки

char *mysql_error(

 MYSQL *mysql);

Возвращает строку с сообщением о последней ошибке

void mysql_close(

 MYSQL *mysql);

Разрыв соединения с сервером БД

<


В настоящее время также разработаны API доступа к БД для сценариев стороны сервера, в частности, для PHP. Взаимодействие программ при публикации БД с использованием технологии PHP изображено на рис. 7.

Библиотеки для доступа к БД подключаются к проигрывателю сценариев PHP в виде внешних загружаемых модулей. В настоящее время разработаны модули для большинства распространенных серверов БД. Если подключен модуль, реализующий API доступа к БД, то в сценарии PHP определяются специальные, зависящие от сервера БД, функции.

В табл. 15 приведены основные функции для доступа к БД MySQL.

Таблица 15

Основные функции PHP для доступа к БД MySQL

Функция

Описание

int mysql_affected_rows(int [link_identifier] )

Количество столбцов, использованных предыдущими mysql операциями

int mysql_close(int [link_identifier] )

Закрывает mysql соединение

int mysql_connect(string [hostname] [:port] , string [username] , string [password] )

Открывает соединение с mysql сервером

int mysql_create_db(string database name, int [link_identifier] )

Создает базу данных mysql

int mysql_data_seek(int result_identifier, int row_number)

Перемещает внутренний указатель результата

int mysql_db_query(string database, string query, int [link_identifier] )

Посылает mysql запрос

int mysql_drop_db(string database_name, int [link_identifier] )

Удаляет базу данных mysql

int mysql_errno(int [link_identifier] )

Возвращает номер сообщения об ошибке предыдущей операции mysql

string mysql_error(int [link_identifier] )

Возвращает текст сообщения об ошибке предыдущей операции mysql

array mysql_fetch_array(int result)

Выбрать результат как ассоциативный массив

object mysql_fetch_field(int result, int [field_offset] )

Получает информацию о столбце из результата и возвращает ее как объект

Продолжение табл. 15

Функция

Описание

array mysql_fetch_lengths(int result)

Получает максимальный размер данных для каждого выходного значения

object mysql_fetch_object(int result)

Получает строку результата как объект

array mysql_fetch_row(int result)

Получите строку результата как пронумерованный массив

string mysql_field_name(int result, int field_index)

Получает имя определенного поля в результате

int mysql_field_seek(int result, int field_offset)

Устанавливает указатель запроса в определенное поле

string mysql_field_table(int result, int field_offset)

Получает имя таблицы, в которой находится указанное поле

string mysql_field_type(int result, int field_offset)

Получает тип указанного поля в результате

string mysql_field_flags(int result, int field_offset)

Получает флаги, связанные с указанным полем в результате

int mysql_field_len(int result, int field_offset)

Возвращает длину указанного поля

int mysql_free_result(int result)

Освобождает память результата

int mysql_insert_id(int [link_identifier] )

Получает id сгенерированный предыдущим выполнением SQL-запроса INSERT

int mysql_list_fields(string database_name, string table_name, int [link_identifier] )

Показывает список полей mysql в результате запроса

int mysql_list_dbs(int [link_identifier] )

Показывает список доступных Баз Данных на сервере

int mysql_list_tables(string database, int [link_identifier] )

Показывает список таблиц в базе данных mysql

Окончание табл. 15

Функция

Описание

int mysql_num_fields(int result)

Получает количество полей в результате

int mysql_num_rows(int result)

Получает количество столбцов в результате

int mysql_pconnect(string [hostname] [:port] , string [username] , string [password] )

Открывает устойчивое соединение с mysql-сервером

int mysql_query(string query, int [link_identifier] )

Отправляет SQL-запрос на mysql

int mysql_result(int result, int row, mixed field)

Получает данные результата

int mysql_select_db(string database_name, int [link_identifier] )

Выбирает Базу Данных mysql

string mysql_tablename(int result, int i)

Получает имя таблицы, содержащей указанное поле

<


Более подробную информацию о доступе к базам данных MySQL из сценариев PHP можно получить в руководствах по СУБД MySQL и языку интерпретатора PHP.

Литература

1. Золотов С. Протоколы Internet. – СПб.: BHV – Санкт-Петербург,

1998. – 304 с.

2. Семенов Ю. А.  Протоколы и ресурсы Internet. – М.: Радио и связь,

1996. – 320 с.

3. Фролов А. В., Фролов Г. В. Сервер Web своими руками. ­– М.: ДИАЛОГ-МИФИ, 1997. (Библиотека системного программиста, т. 29).

4. Браун М., Ханнатт Д. HTML 3.2 в подлиннике. – СПб.: BHV – Санкт-Петербург, 1997.

5. Фролов А. В., Фролов Г. В. Javascript. – М.: ДИАЛОГ-МИФИ, 1998. (Библиотека системного программиста, т. 34).

6. Тихомиров Ю. Microsoft SQL Server 7.0 в подлиннике. – СПб.: BHV – Санкт-Петербург, 1999. – 720 с.

7. Яргер Р., Риз Дж., Кинг Т. MySQL и mSQL. Базы данных для небольших предприятий и Интернета – СПб.: Символ-Плюс, 2000. – 560 с.

8. Фролов А. В., Фролов Г. В. Microsoft Visual J++. Создание приложений и аплетов на языке Java. В 2-х ч. – М.: ДИАЛОГ-МИФИ, 1997. (Библиотека системного программиста, т. 30, 32).

9. Фролов А. В., Фролов Г. В. Разработка приложений для Internet. – М.: ДИАЛОГ-МИФИ, 1997. – 286 c. (Библиотека системного программиста, т. 31).

10. Храмцов П. Б. Лабиринт Internet. Практическое руководство. – М.: ”Электронинформ”, 1996. – 256 c.

11. Джамса  К.,  Коуп  К.  Программирование для Internet в среде Windows: Пер. с англ. – СПб.: Питер, 1996. – 688 с.

12. Барфилд Э.,  Уолтерс Б.  Программирование "клиент-сервер" в локальных вычислительных сетях: Пер.  с англ. – М.: Информационно-издательский дом "Филинъ", 1997. – 424 с.


которым закодировано тело сообщения, например,


Заголовки протокола HTTP
Заголовок
Назначение
Заголовки объекта
Allow
Перечисляет поддерживаемые сервером методы
Content-Encoding
Способ, которым закодировано тело сообщения, например, с целью уменьшения размера
Content-Length
Длина сообщения в байтах
Content-Type
Тип содержимого и, возможно, некоторые параметры
ETag
Уникальный тэг ресурса на сервере, позволяющий сравнивать ресурсы
Expires
Дата и время, когда ресурс на сервере будет изменен, и его нужно получать заново
Last-Modified
Дата и время последней модификации содержимого
Заголовки ответа
Age
Число секунд, через которое нужно повторить запрос для получения нового содержимого
Location
URI ресурса, к которому нужно обратиться для получения содержимого
Retry-After
Дата и время или число секунд, через которое нужно повторить запрос, чтобы получить успешный ответ
Server
Название программного обеспечения сервера, приславшего ответ
Заголовки запроса
Accept
Типы содержимого, которое "понимает" клиент и может воспроизвести
Accept-Charset
Кодировки символов, в которых клиент может принимать текстовое содержимое
Accept-Encoding
Способ, которым сервер может закодировать сообщение
Host
Хост и номер порта, с которого запрашивается документ
If-Modified-Since
If-Match
If-None-Match
If-Range
If-Unmodified-Since
Заголовки запроса для условного обращения к ресурсу
Range
Запрос части документа
User-Agent
Название программного обеспечения клиента
Общие заголовки
Connection
Указывает серверу на завершение (close) или продолжение (keep-alive) сеанса
Date
Дата и время формирования сообщения


10.  Читает передаваемые программой CGI данные, формирует из них сообщение HTTP ответа и отправляет его пользовательскому агенту.
Если какие-либо из действий выполнить не удалось, то пользовательскому агенту отправляется строка с ошибочным кодом состояния и созданный процесс уничтожается.
Все современные операционные системы содержат в своем API средства для запуска дочернего процесса с данной средой окружения. В DOS – функция 4B00h прерывания 21h, в UNIX – системный вызов execve, в WIN32 – функция API CreateProcess. В любом случае, прикладная программа может получить доступ к среде окружения. Языки высокого уровня унифицируют интерфейс доступа к среде окружения для различных ОС. Например, в языках C и C++ имеются следующие переменные и функции:
#include <stdlib.h>
extern char **environ;
#include <stdlib.h>
char *getenv(char *varname);
Указатель на массив строк environ может быть использован для доступа ко всей среде окружения процесса. В массиве содержатся переменные окружения в формате "name=value", где name – имя переменной окружения, value – ее значение. Последний элемент массива содержит пустую строку в качестве признака окончания среды процесса.
Функция getenv позволяет получить значение переменной окружения, имя которой передано в качестве параметра varname. Если переменная с данным именем отсутствует, функция возвращает 0.
Если программой CGI обрабатывается запрос, содержащий метод POST, то тело сообщения запроса, в котором находится кодированное содержимое отправленной клиентом формы, можно получить из стандартного потока ввода. С каждым процессом связан стандартный поток ввода. Чтение из этого потока стандартно означает чтение с клавиатуры. При помощи операций с дескрипторами можно поместить блок данных в стандартный поток ввода. Читать из стандартного потока ввода в языке C удобнее всего при помощи функции чтения потока:
#include <stdio.h>
int fread(void *buffer, size_t size, size_t count, FILE *stream);


В параметре buffer передается адрес буфера, куда будут помещены прочитанные данные. В параметрах size и count указывается длина читаемого блока. Поскольку пользовательский агент передает длину тела сообщения в байтах, то в параметре size указывается 1, а в параметре count – длина тела сообщения запроса. В качестве параметра stream следует передать константу stdin для указания, что считывание производится из стандартного потока ввода. Функция fread возвращает количество фактически прочитанных символов.
Чтение из стандартного потока ввода является блокирующим, поэтому следует заранее определить число читаемых символов. Клиент вместе с другими заголовками передает заголовок Content-Length, в котором сообщается длина тела сообщения. Сервер при формировании среды окружения создает переменную CONTENT_LENGTH, значение которой совпадает со значением соответствующего заголовка. Поэтому чтением данной переменной можно определить число символов в стандартном потоке ввода.
Помимо стандартного потока ввода, с каждым процессом связан стандартный поток вывода. Для обычных процессов стандартный поток вывода, как правило, связан с экраном. При помощи операций замены дескриптора можно переключить стандартный поток вывода на любой открытый дескриптор. Сервер Web осуществляет переключение стандартного потока вывода на дескриптор канала или другого коммуникационного объекта. В результате такого перенаправления вся выводимая программой CGI в стандартный поток вывода информация будет передаваться серверу Web.
Формат данных, передаваемых от приложения CGI серверу Web, совместим с форматом сообщений протокола HTTP. Эти данные должны содержать заголовки, пустую строку и тело сообщения. Заголовки делятся на заголовки CGI и заголовки HTTP. Существует 3 заголовка CGI:
1.  Content-Type – тип содержимого передаваемого тела сообщения. Значение соответствует заголовку Content-Type протокола HTTP.
2.  Location – идентификатор, в котором содержится запрашиваемый ресурс. Значение соответствует заголовку Location протокола HTTP. При получении данного заголовка сервер Web передает пользовательскому агенту ответ с кодом перенаправления.


3.  Status – строка состояния. Значением данного заголовка является трехзначный код состояния и поясняющая фраза, которые сервер Web должен передать пользовательскому агенту.
Все остальные заголовки считаются сервером Web заголовками HTTP и передаются пользовательскому агенту без изменения, также как и тело сообщения. Можно считать, что данные передаются от программы CGI непосредственно клиенту Web.
Выводить в стандартный поток вывода можно при помощи функции printf():
#include <stdio.h>
int printf(char *format, ...);
При обмене двоичными данными между приложением CGI и сервером Web, например, при отправке графического изображения, сформированного приложением CGI в процессе своей работы, следует учитывать некоторые особенности. Потоки могут находиться в двух режимах: двоичном и текстовом. В двоичном режиме данные передаются в том виде, в котором они представляются при хранении этих данных в памяти. В текстовом режиме некоторые символы могут приводить к определенным эффектам. Например, при записи символа конца файла происходит закрытие текстового потока, а при записи символа перевода строки в текстовый поток записываются два символа: перевода строки и возврата каретки. Аналогично, при чтении двух символов из потока, содержащего подряд символы перевода строки и возврата каретки, будет считан только один символ перевода строки. Поскольку стандартные потоки, как правило, открываются в текстовом режиме, перед передачей двоичных данных следует перевести эти потоки в двоичный режим. Для перевода потока в двоичный режим следует сначала получить его дескриптор. Это можно сделать, вызвав функцию fileno() стандартной библиотеки:
#include <stdio.h>
int fileno(FILE *stream);
Единственным параметром данной функции является указатель на поток. При получении дескриптора стандартного потока вывода в качестве значения параметра следует указать константу stdout, а при получении дескриптора стандартного потока ввода – stdin. Полученное значение дескриптора теперь можно использовать при вызове функции setmode() для перевода потока в двоичный режим:


#include <io.h>
#include <fcntl.h>
int setmode(int handle, int mode);
Первым параметром данной функции является дескриптор открытого потока. Вторым параметром является режим, в который будет переведен поток, задаваемый одной из констант: O_TEXT при переводе потока в текстовый режим или O_BINARY при переводе потока в двоичный режим. Функция возвращает ранее установленный режим для данного потока или –1 в случае ошибки.
Для записи в поток, находящийся в двоичном режиме, удобно использовать функцию fwrite():
#include <stdio.h>
int fwrite(void *buffer, size_t size, size_t count, FILE *stream);
В параметре buffer передается адрес буфера, откуда будут взяты записываемые в поток данные. В параметрах size и count указывается длина читаемого блока. Поскольку приложение CGI передает длину тела сообщения в байтах, то в параметре size указывается 1, а в параметре count – длина передаваемого блока данных. В качестве параметра stream следует передать константу stdout, для указания того, что запись производится в стандартный поток вывода. Функция fwrite() возвращает количество фактически записанных символов.
Функцию printf() неудобно использовать при передаче двоичных данных, поскольку в передаваемом блоке могут оказаться нули.
Стандартный поток ввода практически всегда нужно переводить в двоичный режим, поскольку, если передаваемые от пользовательского агента данные являются многострочными, то есть содержат символы перевода строки и возврата каретки, то значение переменной окружения CONTENT_LENGTH не будет соответствовать фактическому числу символов, прочитанному из стандартного потока ввода в текстовом режиме.
Программа CGI должна выполнить следующие действия:
1.     Прочитать значение заголовка REQUEST_METHOD для определения запрашиваемого метода.
2.     Если запрашиваемый метод – GET, то прочитать переменную окружения QUERY_STRING и считать полученное значение кодированным содержимым формы. Способ кодирования считать равным application/x-www-url-encoded.
3.     Если запрашиваемый метод – POST, то прочитать длину тела сообщения запроса из переменной окружения CONTENT_LENGTH. Из стандартного потока ввода прочитать тело сообщения запроса и считать его кодированным содержимым формы. Способ кодирования прочитать из переменной окружения CONTENT_TYPE.
4.     Разобрать кодированное содержимое формы в зависимости от способа кодирования.
5.     Прочитать необходимые программе CGI переменные окружения.
6.     Выполнить все необходимые в программе действия и сформировать документ с результатом работы программы.
7.     Отправить в стандартный поток вывода все необходимые заголовки CGI и HTTP и пустую строку.
8.     Отправить в стандартный поток вывода сформированный документ.

Технология Dynamic HTML


Для создания интерактивных документов в язык HTML были введены события. С точки зрения пользователя, события – это действия, совершаемые над активными элементами документа HTML при помощи устройств ввода. С точки зрения языка HTML, события – это специальные атрибуты элементов, в которых указываются действия, выполняемые при попытке пользователя воздействовать на данный элемент. Такая технология получила название Dynamic HTML. В качестве действия, выполняемого в случае наступления события, можно указывать программы (последовательности операторов) JavaScript. В табл. 8 перечислены основные события Dynamic HTML.

Таблица 8

События Dynamic HTML

Атрибут

Элемент

Событие

onfocus

A, AREA, BUTTON, INPUT, LABEL, SELECT, TEXTAREA

Попадание в фокус

onblur

Потеря фокуса

onchange

INPUT, SELECT, TEXTAREA

Изменение

onselect

INPUT, TEXTAREA

Выбор элемента списка



 TRACE


Метод TRACE используется для возврата переданного запроса на уровне протокола HTTP. Получатель запроса (сервер Web) отправляет полученное сообщение обратно клиенту как тело сообщения ответа с кодом состояния 200 (OK). Запрос TRACE не должен содержать тела сообщения.

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

Если запрос успешно выполнен, то ответ содержит все сообщение запроса в теле сообщения ответа, а заголовок объекта Content-Type имеет значение "message/http".

Подробную информацию о методах протокола HTTP/1.1 можно найти в RFC 2068.

После получения и интерпретации сообщения запроса, сервер отвечает сообщением HTTP ответа.

Первая строка ответа – это строка состояния (Status-Line). Она состоит из версии протокола, числового кода состояния, поясняющей фразы, разделенных пробелами и завершающих символов конца строки:

<Версия HTTP> <Код состояния> <Поясняющая фраза>

Версия протокола имеет тот же смысл, что и в запросе.

Элемент код состояния (Status-Code) – это целочисленный трехразрядный (трехзначный) код результата понимания и удовлетворения запроса. Поясняющая фраза (Reason-Phrase) представляет собой короткое текстовое описание кода состояния. Код состояния предназначен для обработки программным обеспечением, а поясняющая фраза предназначена для пользователей.

Первая цифра кода состояния определяет класс ответа. Последние две цифры не имеют определенной роли в классификации. Имеется 5 значений первой цифры:



С появлением высокопроизводительных серверов, сетевого


 
С появлением высокопроизводительных серверов, сетевого оборудования и высокоскоростных каналов связи стала реальностью организация на основе ПК корпоративных вычислительных сетей. Корпоративные сети объединены во всемирную глобальную сеть – Internet. Одним из крупнейших достижений Internet стала "всемирная паутина" – WWW (World Wide Web или просто Web). WWW представляет собой множество независимых, но взаимосвязанных серверов. Работая с Web, пользователь "перемещается" между серверами, то есть последовательно соединяется с ними и получает информацию, как правило, в виде гипертекста. В современном Internet WWW играет настолько важную роль, что именно ее часто имеют в виду, говоря об Internet, что, вообще говоря, неверно.
Согласно REC-html40-971218 – стандарту языка HTML 4.0, Web – это сеть информационных ресурсов, в которой для доступности этих ресурсов наиболее широкой аудитории используется три механизма:
1.  Единая схема именования ресурсов для поиска последних в Web – URI.
2.  Протокол для доступа к ресурсам через Web – HTTP.
3.  Гипертекст для перемещения по ресурсам – HTML.
Под Web-технологиями будем понимать всю совокупность средств для организации WWW. Поскольку в каждом сеансе взаимодействуют две стороны – сервер и клиент, Web-технологии разделяются на две группы – технологии стороны сервера (server-side) и технологии стороны клиента (client-side). Благодаря Web-технологиям, пользователю WWW доступны не только статические документы, но и такие ресурсы, как программы или базы данных. Публикация баз данных в Internet в последнее время приобрела огромную популярность и практически стала отдельной отраслью компьютерной науки.
Целью настоящего пособия является изложение основ программирования для Web с применением различных технологий. Пособие предназначено для читателей, впервые приступающих к изучению программирования для Web, но знакомых с основой сетевого взаимодействия, архитектурой приложений "Клиент-сервер", языками программирования C и C++, языком разметки гипертекста HTML, а также имеющих навык работы с браузерами Web. Справочная информация, приведенная в пособии, может оказаться полезной и опытным Web-программистам.
В пособии содержатся только самые необходимые данные. Более подробную информацию можно получить в стандартах:
RFC 1866 "Hypertext Markup Language – HTML 2.0"
RFC 1945 "Hypertext Transfer Protocol – HTTP/1.0"
RFC 2068 "Hypertext Transfer Protocol – HTTP/1.1"
REC-html4-971218 "Hypertext Markup Language – HTML 4.0"
ISO 8879 "Standard Generalized Markup Language – SGML".

X: Коды ошибок сервера – сервер не в состоянии выполнить допустимый запрос.


Поясняющие фразы для каждого кода состояния перечислены в RFC 2068 и являются рекомендуемыми, но могут быть заменены на эквивалентные без ограничений со стороны протокола. Например, в локализованных русскоязычных версиях HTTP серверов эти фразы заменены русскими. В табл. 2 приведены коды ответов сервера HTTP.