Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Интернет технологии -> ASP -> Active Server Pages - введение


Данный документ подготовлен мною после просмотра материалов российского сервера http://www.activeserverpages.ru/, чей логотип служит заголовком этой статьи. Невозможность получить серьезную документацию по ASP на русском языке подтолкнули меня к написанию данного материала. Документ предназначен для оказания первой помощи всем желающим в ознакомлении и применении технологии активных серверных страниц и не предназначен для коммерческого использования.

А. Мазарчук

Что такое Активные Серверные Страницы (Active Server Pages - ASP)?

Основная идея заключается в том, чтобы заставить Web-сервер посылать клиенту информацию в стандартном формате HTML, формируемую "налету" и способную изменять свое содержимое в зависимости от некоторых условий, например, текущего времени или даты, предыдущего запроса пользователя или точки вызова. Понятно, что необходимо определить алгоритм такого "интеллектуального" поведения, а, значит, без программирования, ну хотя бы на простеньком Бейсике, тут не обойтись. Так вот, кстати, документ ASP, запрашиваемый пользователем и состоит из HTML-тэгов, форматирующих некоторые строки информации, с вплетенными в них строками алгоритма на языке Visual Basic Script. Так что основой ASP лично я считаю HTML + VBScript + изучение весьма немногочисленных особенностей в рамках технологии ASP.

При отправке ASP-документа пользователю сервер читает строки этого документа. Все тэги HTML вместе с информацией отсылаются в неизменном виде. Специальные тэги, заключенные в скобки <% и %>, являются текстом программы на VBScript и выполняются самим сервером. Например, вы желаете, чтобы в некотором месте документа пользователь по воскресеньям видел слово выходной, а в остальные дни - слово рабочий. Вот как это будет выглядеть в ASP-документе:

...В этот <%If WeekDay(Date) = 1 Then%>выходной<%Else%>рабочий<%End If%> день мы желаем вам хорошего настроения...

Функция Visual Basic WeekDay (ДеньНедели) определяет день недели от текущей даты (Date). Если это 1 (воскресенье - см. справочник по VB), то пользователю будет отослано слово выходной, иначе - рабочий, но ни в коем случае оба сразу. Пользователь видит только окончательно сформированные строки документа и не видит строки VBScript, т.е. он получает либо "В этот выходной день мы желаем вам хорошего настроения" либо "В этот рабочий день мы желаем вам хорошего настроения". Таким образом, язык скрипта позволяет управлять различными фрагментами документа: операторы ветвления заставляют сервер выдавать одни фрагменты и пропускать другие, операторы циклов позволяют повторять выдачу похожих или однотипных фрагментов документа.

Две вещи восхищают в технологии ASP: первое - пользователь получает только HTML-документ, поэтому не требуется какого-то особого браузера (это может быть и Internet Explorer и Netscape Communicator); второе - пользователь никогда не увидит, каким алгоритмом этот документ сформирован, что в какой-то мере защищает ваши авторские права как программиста. К тому же формирование самого ASP-документа, согласитесь, достаточно прозрачно и может выполняться тем же инструментом, что при создании обычных HTML-страниц. С моей точки зрения, использование CGI, языков типа PHP или Perl хотя и позволяет достичь аналогичного эффекта, но делает весь процесс создания документа гораздо менее удобным и более ориентированным в сторону программирования. Кстати, приверженцы JavaScript совершенно свободно могут использовать его в ASP-документе вместо VBScript.

Таким образом, VBScript и JavaScript могут использоваться на стороне клиента (пользователю отсылаются строки HTML-документа вместе со строками скриптов), при этом пользователь может видеть исходный код программ. Эти же средства могут использоваться и на стороне сервера в рамках технологии ASP. Оба случая не идентичны друг другу и служат различным целям. Я рекомендую на стороне сервера использовать VBScript как более простой и удобный, а на стороне клиента - JavaScript, поскольку Netscape, к сожалению, пока не встраивает VBScript в свои браузеры. Использование 2-3 языков сегодня для разработчика считается приемлемым и оптимальным (для использования какого-то одного языка пока нет реальных возможностей). К тому же VBScript является средством автоматизации работы пользователя почти во всех продуктах фирмы Microsoft, последних продуктах фирмы Corel и некоторых других фирм, лицензирующих использование данного языка в своих продуктах как средство, испытанное временем и позволяющее получать потрясающие результаты. ASP можно использовать для придания документу необходимого "с точки зрения" сервера вида, а скрипты, встроенные в документ и выполняемые на стороне клиента браузером, - для интенсивной работы клиента с документом, когда уже сам документ "должен решать", как реагировать на конкретные действия клиента. Если хотите, скрипт, выполняемый сервером - это "мозги" родителя, создающего документ, а скрипт, выполняемый внутри документа браузером клиента, - это "мозги" самого ребенка, т.е. документа.

Очень привлекательной возможностью ASP является возможность сервера передавать клиенту информацию, извлекаемую из баз данных. С помощью скрипта Web-сервер легко подсоединяется к любой базе данных, использующей драйвера ODBC или любую другую аналогичную технологию, обычно с помощью SQL-запросов получает информацию из таблиц базы данных и передает ее клиенту. Кстати, с помощью тех же скриптов можно выполнить предварительную обработку такой информации и придать ей любой желаемый вид. Симбиоз Web-сервера и SQL-сервера, связанных ASP-прослойкой, может стать отличной информационной системой или базой знаний, к тому же от клиента требуется наличие только одного браузера, что позволяет разработчикам легко сопровождать всю систему в целом.

Какой сервер нужен для работы ASP?

Возможность работать с ASP-документами встроена Microsoft в Internet Information Server (IIS для Windows NT) и Personal Web Server (PWS для Windows-9x), начиная с версии 4.0. Существует также отдельное бесплатное приложение ASP, которое может быть дополнительно инсталлировано под IIS 2.0 или 3.0 для Windows NT. PWS удобно использовать для персональных разработок под Windows-95,98 (дистрибутив Windows-95 OSR-2 имеет встроенный PWS, для Windows-98 нужно искать дистрибутив, в котором имеется дополнительный каталог типа AddOn\PWS). Дистрибутив Windows NT имеет встоенный IIS 2.0 или 3.0 (начиная с Service Pack 3 и выше). Однако предоставить возможность клиентам пользоваться в сети прелестями вашей информационной службы можно только с помощью NT и IIS.

Если вы используете другой сервер, то Chili!ASP для вас будет полнофункциональным аналогом Microsoft's ASP-сервера, позволяющего работать на серверах, отличных от IIS. К примеру, это Netscape Enterprise сервер, Netscape FastTrack сервер, ISAPI-совместимый сервер, IBM ICSS 4.2 сервер и, конечно же, сервер под UNIX-платформу. Chili!ASP полностью поддерживает ActiveX-компоненты, построенные на Java, C++, VB, Delphi и языках скрипта, таких как VBScript, JScript, и HTML. Данный сервер доступен на http://www.chilisoft.com/.

С чего лучше начать для овладения технологией ASP?

Конечно же нужно знать и уметь работать с HTML. Неплохо, если вы умеете хоть немного программировать в рамках любого распространенного языка типа Бейсик, Паскаль или Си. Предварительно ознакомьтесь с языком сценариев VBScript, хотя бы в объеме для начинающих. Если у вас есть пробелы в указанных средствах, рекомендую временно отложить изучение ASP и заняться их восполнением.

Итак, вы разбираетесь с HTML и ориентируетесь в базовых конструкциях VBScript. ASP - это одна из тех технологий, которые принято называть словами клиент-сервер. В этих рамках ASP использует два основных объекта: Request (запрос, с помощью которого клиент получает необходимую информацию) и Response (ответ, с помощью которого сервер отсылает клиенту затребованную информацию). Строка запроса формируется для клиента чаще всего в виде гиперссылки и имеет формат:

Запрашиваемый_файл?параметр1=значение1&параметр2=значение2...

"Запрашиваемый_файл" - для нас это ASP-файл - должен иметь возможность проанализировать строку запроса и определить значения конкретных параметров. После этого сервер может сформировать должным образом ответный документ. Как видно, параметры отделяются от имени файла символом "?", а друг от друга - символом "&". С помощью таких ссылок-запросов документ может обращаться сам к себе, а с помощью различных значений параметров изменять свое содержимое порой самым кардинальным образом.

Изучение интереснее и эффективнее всегда проводить на примерах. Поэтому далее я покажу несколько несложных примеров, часть из которых приводится в документации с уже упоминавшимся бесплатным приложением ASP. При желании вы можете подробнее ознакомиться с данной документацией, правда для этого необходимо хотя бы сносно владеть английским языком, или использовать эту документацию в дальнейшем в качестве справочной. При создании собственных активных страничек на локальной машине не забывайте, что ASP-файлы нельзя просто просмотреть браузером в дисковом каталоге, как HTML-файлы. Необходимо обязательно установить либо IIS, либо PWS и поместить такую страничку в какой-либо Web-каталог и обращаться к ней с помощью URL:

http://my_host/asp_folder/my_example.asp
(http://имя_моего_Web_сервера/Web_имя_ASP_каталога/имя_файла.asp)

 Не очень удобно? Ну, так ведь это же клиент-серверная технология. Как же вы обойдетесь без сервера? Итак, приступим.

Пример 1: "Hello, World!"

Все примеры, включая и данный, оформлены в виде отдельных ASP-файлов. Специальный модуль, кстати тоже выполненный в виде отдельного ASP-файла, позволит вам просмотреть исходный текст представляемого примера. Изучайте все, начиная от ссылки (см. строку статуса вашего браузера), с помощью которой вызывается пример, и заканчивая комментариями к примеру. Если все понятно, тут же придумывайте что-то свое и пробуйте это реализовать. Материал лучше изучать небольшими порциями и обязательно закреплять практикой. Банальные вещи, но это вековой опыт наших предков. Так что не будем нарушать традиций.

Щелкнув по следующей ссылке, вы увидете результат работы первого примера. Просмотрите его исходный текст и изучите дальнейшие пояснения, следующие в данном документе ниже. Рекомендую еще сделать вот что. Прежде чем просматривать исходный текст ASP, щелкните правой кнопкой мыши в окне с результатом работы примера и выберите "View Source" или "HTML текст". У вас появится возможность сравнить тот текст, который посылается клиенту, с тем, который "читает" сервер в ASP-источнике. Это поможет вам лучше понять работу сервера при выпонении активного сценария.

Hello, World!

Внешне до заголовка тела документа пример похож на обычный HTML-документ. А далее написан сценарий, который семь раз циклически печатает одну и ту же строку "Hello, World!". Поскольку тэги HTML - это тоже текст, команды скрипта можно также применять и для формирования тэгов. Здесь с помощью значения счетчика цикла изменяется размер шрифта текста от 1 до 7. Обратите внимание, что тэг <% =ИмяПеременной %> позволяет в этом месте документа, посылаемого клиенту, вставлять значение указанной переменной. В конце исходного текста можно заметить строку, которая выглядит как комментарий:

<!--#include virtual="/Docs/ASP/Samples/srcform.inc"-->

На самом деле директива #include с параметром virtual заставляет Web-сервер вставить в данное место документа текст из указанного файла. Это удобно, когда некоторый фрагмент несколько раз встречается в различных документах. Конкретно данная вставка формирует ссылку для вызова модуля формирования исходного текста примера. Так что мы с ним еще встретимся в других примерах.

А как этот же документ создать с помощью JavaScript? Посмотрите следующий пример:

Hello, World! (JScript)

Первая строка задает язык скрипта по умолчанию для всего документа. На самом деле это не совсем JavaScript, а лишь его разновидность JScript в интерпретации Microsoft. Хотя и весьма близкая. Аналогично можно было писать и для VBScript: <%@ Language = VBScript%>. Однако, если не писать, то это подразумевается по умолчанию. Ну, а в остальном все понятно.

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

Красный   Зеленый   Синий   Радуга

Перед началом формирования заголовка документа я хочу разобраться с параметрами запроса. Имя параметра - color, обращение к нему - с помощью объекта Request. Значение параметра сохраняется в переменной Color. Не смотря на то, что имя параметра и переменной одинаковы, на самом деле - это разные вещи. К переменной можно обращаться прямо по имени, а к параметру - только с помощью объекта Request. Далее с помощью оператора выбора select в зависимости от значения параметра формируется либо массив цветов, либо простая переменная с соответствующим значением. В теле документа с помощью оператора if выбирается нужный фрагмент документа для работы. Формирование параметров шрифта уже должно быть понятно. Можно было поступить немного по-другому: общий оператор IF убрать вообще, вместо двух фрагментов оставить один, а параметр цвета формировать, например, так:

...color=<%if Color = "Радуга" then%><%=C(i-1)%><%else%><%=C%><%end if%>>Hello, World!...

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

Пример 2: Использование Request и Response

Объект Request имеет весьма небольшую коллекцию свойств. За полным списком обращайтесь к английской документации по ASP, здесь же мы рассмотрим только два, с моей точки зрения наиболее часто встречающиеся, - QueryString и Form.

QueryString содержит строку параметров, передаваемых клиентом. Данное свойство имеет дополнительный параметр Count, с помощью которого можно получить количество переданных параметров. Form содержит значения элементов формы, находящейся в теле документа и использующей метод POST для передачи информации.

Ну, если с Request более или менее все ясно, то как же используется объект Response? Ведь, скажите вы, информация и так прекрасно посылается клиенту в виде HTML-строк и вроде никакого Response мы при этом не использовали. Дело в том, что существует два основных способа, с помощью которых сервер посылает информацию клиенту. Все, что находится вне тэгов скрипта, считается строками HTML-документа и отсылается клиенту без изменений. Внутри скрипта при необходимости выдать строку информации в браузер клиента используется объект Response с методом Write. Response имеет несколько свойств и несколько методов. Свойства используются редко, а из методов наиболее часто используются Write и Redirect.

Write посылает в окно браузера клиента указанную строку. Redirect перенаправляет клиента по указанному URL.

Рассмотрим работу описанных свойств и методов. Все это демонстрирует один и тот же ASP-документ (см. ссылки в строке статуса).

Перенаправление

Не ожидали? Обращались к документу RequestResponse.asp, а получили старый пример "Hello, World!". Исходный текст нового примера вы увидите чуть позже. Просто я указал параметр "mode" ("режим") со значением "redirect" ("перенаправить"), и был вызван метод Redirect объекта Response. После этого чтение исходного документа прерывается (поэтому до тела документа дело просто не дошло) и загружается перенаправляемый документ (я указал hello.asp).

Работа Response

Здесь тоже пока доступа к исходному тексту не видно. Я намеренно указал только один параметр "name" и сервер с помощью объекта Response и его метода Write вывел в браузер полученное вами сообщение, не сформировав самого HTML-документа.

Параметры Request

А вот теперь все в порядке. Рассмотрим сценарий нового примера. В переменной k запоминается количество параметров, передаваемых в строке запроса (элементы формы при этом не учитываются). Если k = 1 (как в предыдущих двух случаях), то при наличии параметра mode = "redirect" происходит перенаправление на документ hello.asp (первый случай) и далее больше ничего не выполняется. Если же параметр mode отсутствует (во втором случае посылается только один параметр name), в качестве его значения возвращается пустая строка "", оператор if пропускается и осуществляется переход на выдачу сообщения с помощью Response.Write. Если же параметров более одного (последний случай), то, пройдя все препоны, мы переходим на формирование HTML-документа. Если вы нажмете кнопку формы (это будет чуть дальше), то k будет равен 0 и вы увидете фрагмент, работающий с элементом формы. Иначе вы видите обработку параметров запроса. Количество параметров = 2 потому, что параметр name воспринимается как один, но представленный в виде массива (запомните этот прием для передачи массива параметров). Работа с ним демонстрируется с помощью сканирующей конструкции For Each и с помощью индекса (как с обычным массивом). В отличие от массивов нумерация параметров начинается не с 0, а с 1.

А теперь введите в следующее поле ваше имя и нажмите кнопку "Старт".

Ваше имя:

Поле, в которое вы вводили свое имя, имеет имя "YourName". Как видно из исходного текста, обращаться к значению этого поля можно как с помощью свойства Form объекта Request, так и точно таким же образом, как будто вы в строке запроса передали параметр с именем "YourName".

Пример 3: Работа с базой данных

Для выполнения сложной работы в рамках технологии ASP используются специальные OLE-объекты, называемые ActiveX-компоненты сервера (ActiveX Server Components). Данные объекты имеют достаточно сложную программную реализацию и служат для расширения базовых возможностей Web-сервера. Объекты удобны тем, что они работают на стороне сервера и не доставляют никаких лишних хлопот клиенту. Так, например, имеется объект Ad Rotator, позволяющий организовать в некоторой области окна браузера клиента ротацию некоторого набора картинок (своеобразный рекламный ролик или слайд-шоу), объект Browser Capabilities, позволяющий как в Explorer (в Проводнике) выводить на экран иерархические списки в виде раскрывающихся деревьев, и другие объекты (просмотрите раздел Tutorial документации). Однако, наиболе полезным, на мой взгляд, является набор объектов ADO (ActiveX Data Objects) - объектов доступа к данным. С объектами очень легко работать, если изучить их свойства (параметры) и методы (набор действий, которые могут выполнять эти объекты). В рамках краткого обзора я покажу только два основных объекта ADO: Connection (соединение) и Recordset (набор записей, получаемых из таблиц базы данных), а также несколько простых примеров работы с ними. Однако, уже даже этого будет достаточно, чтобы организовать приличную работу Web-сервера совместно с файловой базой данных или SQL-сервером.

Для демонстрации я подготовил небольшую базу данных в формате Microsoft Access, содержащую таблицу рейсов самолетов, вылетающих из аэропортов г. Киева, а также две таблицы с автобусными маршрутами, проходящими через Хмельницкую область (к сожалению, это данные 1997 года). Итак, для начала посмотрим, как получить таблицу рейсов самолетов из Киева.

Самолеты из Киева

Данный пример классическим образом можно использовать как заготовку для своих будущих разработок. Оказывается, все достаточно просто. Поскольку я не передаю никакого параметра, то по умолчанию устанавливается название таблицы "Самолеты из Киева". Так как название содержит пробелы, при формировании SQL-строки его необходимо заключить в квадратные скобки. Сначала создается объект Connection и ссылка на него устанавливается на переменную Conn. С помощью этого объекта Web-сервер будет осуществлять связь с базой данных.

Далее необходимо определить строку подсоединения. Обычно это имя источника данных (Alias), прописанного в службе ODBC вашего сервера. Под именем "Справочник" на закладке ODBC "System DSN" я прописал параметры базы данных, расположенной в файле "Справочник.mdb". Использование данной службы удобно тем, что все параметры подсоединения определяются именно там, что позволяет легче сопровождать работу всей информационной системы. Вы можете изменить через ODBC порядок доступа к базе, ее место расположения, даже перевести из одного формата в другой (например, из Access на SQL-сервер). Оставив имя источника тем же самым, вам ничего не придется менять в ASP-документе. Правда, вы можете покопаться в документации и найти все параметры строки подсоединения для указания вручную драйвера базы данных, путь к источнику базы данных, имя и пароль пользователя для входа и некоторые другие параметры, но этот вариант я считаю менее гибким и достаточно неудобным.

Далее созданный объект Conn открывает указанное соединение. Теперь вы можете обращаться к любым таблицам и объектам подсоединенной базы данных. Данные извлекаются с помощью SQL-запросов, которые выполняются методом Execute объекта соединения. Запросы могут выполнять действия без возвращения наборов записей (запросы на вставку, удаление и изменение записей), но могут и осуществлять выборки данных, в результате чего всегда возвращается некоторый набор отобранных записей. Создавая набор записей, объект соединения автоматически порождает объект Recordset, ссылку на который необходимо сохранить для дальнейшей работы. У нас для этого служит переменная RS. Объект Recordset имеет несколько свойств и методов для работы с набором записей. К полям записей можно обращаться по именам или по индексам. Свойство Fields содержит семество всех полей набора записей. В свою очередь, Fields обладает свойством Count, где хранится количество всех полей. Для перемещения по записям набора Recordset имеет весьма прозрачные методы MoveNext, MovePrevious, MoveFirst, MoveLast. Для контроля выхода за конец набора используется свойство EOF, за начало - BOF. Так же, как и при работе с файлами, по окончании работы со всеми объектами их надо закрыть, используя их методы Close.

Формирование таблицы начинается с заголовочной строки, куда помещаются названия полей. Обратите внимание, как динамично формируется строка. Цикл For пробегает по всем полям с помощью индекса (нумерация полей начинается, как в массивах, с нуля). Используя имя переменной типа Recordset, можно обратиться к значению поля: RS(i). Если использовать свойство Name поля, то можно получить имя этого поля. Количество столбцов, формируемых тэгами <TD>, будет ровно столько, сколько и полей в наборе записей.

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

По окончанию набора записей структура таблицы закрывается тэгом </TABLE>, объекты Recordset и Connection также закрываются. Пример интересен тем, что может использоваться для просмотра данных любой таблицы, достаточно в параметре клиентского запроса передать название таблицы и соответствующим образом сформировать строку SQL-запроса. Взгляните, как этот же документ выводит данные таблицы с автобусными маршрутами:

Автобусные маршруты

Неожиданно некоторые ячейки оказались непрорисованными. Происходит это в тех случаях, когда значение поля пусто (Null). Поэтому я рекомендую проверять значение поля и в случае, если оно пусто, посылать в ячейку непустой пробел "&nbsp;" (к сожалению, в исходном тексте этот код выглядит как обычный пробел). Я немного изменил файл предыдущего документа, добавив в него функцию, выдающую либо значение поля, либо непустой пробел. Кстати, обратите внимание, как можно комбинировать скрипты сразу на двух (!!!) языках. Посмотрите что получилось:

Автобусные маршруты (2)

И в завершение посмотрим работу документа, имеющего дело сразу с несколькими таблицами. В моем справочнике автобусные маршруты хранятся в двух таблицах: "Автобусы" и "Автобусы (расписание)". Первую вы уже видели. Во второй таблице по коду маршрута можно получить строки всех промежуточных пунктов назначения с временами прибытия, убытия и стоянки. Введите в следующее поле номер маршрута и посмотрите результат (если не помните номеров маршрутов, воспользуйтесь предыдущей ссылкой).

Номер рейса:

Здесь демонстрируется доступ к значениям полей по их именам (если структура таблицы вам известна и не нужно выводить все поля, то это удобно потому, что помнить индекс конкретного поля весьма обременительно). Сначала с помощью параметра клиентского запроса определяем номер рейса. Затем с помощью SQL-запроса получаем набор из одной записи таблицы "Автобусы", которая соответствует указанному рейсу. Если запись присутствует, то в качестве заголовка таблицы выводятся данные в виде отдельных полей. Затем набор записей закрывается и с помощью этой же уже освободившейся переменной RS мы получаем доступ к записям другой таблицы "Автобусы (расписание)", которая по указанному номеру рейса выдает только принадлежащие ему строки маршрута.

Аналогичную структуру может иметь любой документ, который извлекает данные из какой-то конкретной таблицы. Какой из показанных структур документов отдать предпочтение - решать вам самим в каждом конкретном случае.

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

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

А. Мазарчук

 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.