Skip to content

2. Основи

У цьому розділі ми розглядаємо основи веб-програмування. Його основною метою є ознайомлення з основними принципами веб-програмування, які не залежать від конкретної технології, що використовується для їх реалізації. У ньому наведено чимало прикладів, які рекомендується випробувати, щоб поступово «ввібратися» у філософію веб-розробки. Безкоштовні інструменти, необхідні для їх тестування, наведено в кінці документа у додатку під назвою «Веб-інструменти».

2.1. Компоненти веб-додатку

Machine Serveur

Image

15Клієнтська машина

Номер
Роль
Поширені приклади
1
OS Сервер
Linux, Windows
2
Веб-сервер
Apache (Linux, Windows)
IIS (NT), PWS (Win9x), Cassini (Windows + платформа .NET)
3
Скрипти, що виконуються на стороні сервера. Вони можуть виконуватися модулями сервера або програмами, зовнішніми щодо сервера (CGI).
PERL (Apache, IIS, PWS)
VBSCRIPT (IIS, PWS)
JAVASCRIPT (IIS, PWS)
PHP (Apache, IIS, PWS)
JAVA (Apache, IIS, PWS)
C#, VB.NET (IIS)
4
База даних — вона може знаходитися на тому самому комп’ютері, що й програма, яка її використовує, або на іншому комп’ютері через Інтернет.
Oracle (Linux, Windows)
MySQL (Linux, Windows)
Postgres (Linux, Windows)
Access (Windows)
SQL Server (Windows)
5
OS Клієнт
Linux, Windows
6
Веб-браузер
Netscape, Internet Explorer, Mozilla, Opera
7
Скрипти, що виконуються на стороні клієнта в браузері. Ці скрипти не мають доступу до дисків клієнтського комп'ютера.
VBscript (IE)
JavaScript (IE, Netscape)
PerlScript (IE)
Аплети JAVA

2.2. Обмін даними у веб-додатку з використанням форми

Image

Клієнтський комп'ютер Серверний комп'ютер

Номер
Роль
1
Браузер вперше запитує URL для (http://machine/url). Параметри не передаються.
2
Веб-сервер надсилає йому веб-сторінку з цим URL. Вона може бути статичною або динамічно згенерованою серверним скриптом (SA), який міг використовувати вміст баз даних (SB, SC). У цьому випадку скрипт виявить, що запит на URL надійшов без передачі параметрів, і згенерує початкову сторінку WEB.
Браузер отримує сторінку та відображає її (CA). Скрипти на стороні браузера (CB) могли змінити початкову сторінку, надіслану сервером. Потім у результаті взаємодії між користувачем (CD) та скриптами (CB) веб-сторінка буде змінена. Зокрема, будуть заповнені форми.
3
Користувач підтверджує дані форми, які потім мають бути надіслані на веб-сервер. Браузер повторно запитує початковий URL або інший, залежно від ситуації, і одночасно передає на сервер значення з форми. Для цього він може використовувати два методи, що називаються GET та POST. Отримавши запит від клієнта, сервер запускає скрипт (SA), пов’язаний із запитаним URL, який виявляє параметри та обробляє їх.
4
Сервер видає сторінку WEB, сформовану програмою (SA, SB, SC). Цей етап ідентичний попередньому етапу 2. Відтепер обмін даними відбувається відповідно до етапів 2 та 3.

2.3. Notations

Далі ми припустимо, що певна кількість інструментів вже встановлена, і будемо використовувати такі позначення:

позначення
значення
<apache>
коренева папка дерева каталогів сервера Apache
<apache-DocumentRoot>
коренева папка веб-сторінок, що видаються Apache. Саме в цій кореневій папці мають знаходитися веб-сторінки. Таким чином, URL http://localhost/page1.htm відповідає файлу <apache-DocumentRoot>\page1.htm.
<apache-cgi-bin>
коренева папка дерева, пов’язана з псевдонімом cgi-bin, де можна розміщувати скрипти CGI для Apache. Таким чином, URL http://localhost/cgi-bin/test1.pl відповідає файлу <apache-cgi-bin>\test1.pl.
<IIS-DocumentRoot>
кореневий каталог веб-сторінок, що видаються IIS, PWS або Cassini. Саме в цьому кореневому каталозі повинні знаходитися веб-сторінки. Таким чином, URL http://localhost/page1.htm відповідає файлу <IIS-DocumentRoot>\page1.htm.
<perl>
коренева папка дерева каталогів мови Perl. Виконуваний файл perl.exe зазвичай знаходиться в <perl>\bin.
<php>
корені дерева мови PHP. Виконуваний файл php.exe зазвичай знаходиться в <php>.
<java>
коренева папка дерева Java. Виконувані файли, пов’язані з Java, знаходяться в <java>\bin.
<tomcat>
корені сервера Tomcat. Приклади сервлетів містяться в <tomcat>\webapps\examples\servlets, а приклади сторінок — у JSP та <tomcat>\webbapps\examples\jsp

Щодо кожного з цих інструментів див. додаток, де наведено інструкції з їх встановлення.

2.4. Статичні веб-сторінки, динамічні веб-сторінки

Статична сторінка представлена файлом HTML. Динамічна сторінка, у свою чергу, генерується «на льоту» веб-сервером. У цьому розділі ми пропонуємо вам різні тести з різними веб-серверами та мовами програмування, щоб продемонструвати універсальність веб-концепції. Ми використовуватимемо два веб-сервери: Apache та IIS. Хоча IIS є комерційним продуктом, він має дві більш обмежені, але безкоштовні версії:

  • PWS для комп’ютерів під управлінням Win9x
  • Cassini для комп’ютерів під управлінням Windows 200 та XP

Папка <IIS-DocumentRoot> зазвичай відповідає папці [lecteur:\inetpub\wwwroot], де [lecteur] — це диск (C, D, ...), на якому було встановлено IIS. Те саме стосується PWS. Для Cassini папка <IIS-DocumentRoot> залежить від способу запуску сервера. У додатку показано, що сервер Cassini можна запустити у вікні DOS (або за допомогою ярлика) таким чином:

dos>webserver /port:N /path:"P" /vpath:"/V"

Додаток [WebServer], який також називають веб-сервером Cassini, підтримує три параметри:

  • /port: номер порту веб-служби. Може бути будь-яким. За замовчуванням — 80
  • /path: фізичний шлях до папки на диску
  • /vpath: віртуальна папка, пов’язана з попередньою фізичною папкою. Слід звернути увагу на те, що синтаксис не /path=шлях, а /vpath:шлях, на відміну від того, що зазначено у вікні довідки вище.

Якщо Cassini запускається таким чином:

dos>webserver /port:N /path:"P" /vpath:"/"

то папка P є кореневою папкою веб-дерева сервера Cassini. Отже, саме ця папка позначається як <IIS-DocumentRoot>. Так, у наступному прикладі:

dos12>webserver /path:"d:\data\devel\webmatrix" /vpath:"/"

сервер Cassini працюватиме на порту 80, а кореневою папкою його дерева <IIS-DocumentRoot> є папка [d:\data\devel\webmatrix]. Веб-сторінки, які потрібно протестувати, повинні знаходитися в цій кореневій папці.

Далі кожна веб-програма буде представлена одним файлом, який можна створити за допомогою будь-якого текстового редактора. Файл IDE не потрібен.

2.4.1. Статична сторінка HTML (мова розмітки HyperText)

Розглянемо такий код HTML:

<html>
  <head>
    <title>essai 1 : une page statique</title>
   </head>
   <body>
     <center>
     <h1>Une page statique...</h1>
   </body>
</html>

що створює таку веб-сторінку:

Тести

Image

Тест1

  • запустити сервер Apache
  • вставити скрипт essai1.html у <apache-DocumentRoot>
  • переглянути файл URL http://localhost/essai1.html у браузері
  • зупинити сервер Apache

Тест 2

  • запустити сервер IIS/PWS/Cassini
  • встановити скрипт essai1.html у <IIS-DocumentRoot>
  • переглянути URL http://localhost/essai1.html у браузері

2.4.2. Сторінка ASP (Active Server Pages)

Скрипт essai2.asp:

<html>
  <head>
    <title>essai 1 : une page asp</title>
   </head>
   <body>
     <center>
     <h1>Une page asp générée dynamiquement par le serveur PWS</h1>
     <h2>Il est <% =time %></h2>
     <br>
     A chaque fois que vous rafraîchissez la page, l'heure change.
   </body>
</html>

створює таку веб-сторінку:

Image

Тест

  • запустити сервер IIS/PWS
  • вставити скрипт essai2.asp у <IIS-DocumentRoot>
  • завантажити URL http://localhost/essai2.asp у браузері

2.4.3. Скрипт PERL (Practical Extracting and Reporting Language)

Скрипт essai3.pl:

#!d:\perl\bin\perl.exe

($secondes,$minutes,$heure)=localtime(time);

print <<HTML
Content-type: text/html

<html>
  <head>
    <title>essai 1 : un script Perl</title>
   </head>
   <body>
     <center>
     <h1>Une page générée dynamiquement par un script Perl</h1>
     <h2>Il est $heure:$minutes:$secondes</h2>
     <br>
     A chaque fois que vous rafraîchissez la page, l'heure change.
   </body>
</html>

HTML
;

Перший рядок — це шлях до виконуваного файлу perl.exe. За потреби його слід змінити. Після запуску веб-сервером скрипт генерує таку сторінку:

Image

Тестування

  • веб-сервера: Apache
  • для довідки перегляньте файл конфігурації srm.conf або httpd.conf залежно від версії Apache у папці <apache>\confs і знайдіть рядок, що стосується cgi-bin, щоб дізнатися каталог <apache-cgi-bin>, у який слід помістити файл essai3.pl.
  • Помістіть скрипт essai3.pl у <apache-cgi-bin>
  • запитайте URL-адресу http://localhost/cgi-bin/essai3.pl

Слід зауважити, що для завантаження сторінки perl потрібно більше часу, ніж для сторінки asp. Це пов’язано з тим, що скрипт Perl виконується інтерпретатором Perl, який потрібно завантажити, перш ніж він зможе виконати скрипт. Він не залишається постійно в пам’яті.

2.4.4. Скрипт PHP (процесор HyperText)

Скрипт essai4.php

<html>
  <head>
    <title>essai 4 : une page php</title>
   </head>
   <body>
     <center>
     <h1>Une page PHP générée dynamiquement</h1>
     <h2>
<?
          $maintenant=time();
          echo date("j/m/y, h:i:s",$maintenant);
?>
     </h2>
     <br>
     A chaque fois que vous rafraîchissez la page, l'heure change.
   </body>
</html>

Попередній скрипт створює таку веб-сторінку:

Image

Тестування

Тест 1

  • переглянути файл конфігурації srm.conf або httpd.conf Apache у <Apache>\confs
  • для довідки, перевірте рядки конфігурації php
  • запустити сервер Apache
  • вставити essai4.php у <apache-DocumentRoot>
  • запитати URL http://localhost/essai4.php

Test2

  • запустити сервер IIS/PWS
  • для інформації перевірити налаштування PWS щодо php
  • встановити essai4.php у <IIS-DocumentRoot>\php
  • запитати URL http://localhost/essai4.php

2.4.5. Скрипт JSP (Java Server Pages)

Скрипт heure.jsp

<%  //— програма на Java, що відображає час %>

<%@ page import="java.util.*" %>

<% 
     // код JAVA для обчислення часу
  Calendar calendrier=Calendar.getInstance();
  int heures=calendrier.get(Calendar.HOUR_OF_DAY);
  int minutes=calendrier.get(Calendar.MINUTE);
  int secondes=calendrier.get(Calendar.SECOND);
   // години, хвилини, секунди — це глобальні змінні
   //, які можна використовувати в коді HTML
%>

<% // код HTML %>
<html>
  <head>
     <title>Page JSP affichant l'heure</title>
  </head>
  <body>
     <center>
     <h1>Une page JSP générée dynamiquement</h1>
     <h2>Il est <%=heures%>:<%=minutes%>:<%=secondes%></h2>
     <br>
     <h3>A chaque fois que vous rechargez la page, l'heure change</h3>
  </body>
</html>

Після виконання веб-сервером цей скрипт створює таку сторінку:

Image

Тестування

  • помістіть скрипт heure.jsp у папку <tomcat>\jakarta-tomcat\webapps\examples\jsp (Tomcat 3.x) або у папку <tomcat>\webapps\examples\jsp (Tomcat 4.x)
  • запустіть сервер Tomcat
  • запитати URL http://localhost:8080/examples/jsp/heure.jsp

2.4.6. Сторінка ASP.NET

Скрипт heure1.aspx:

<html>
<head>
    <title>Démo asp.net </title>
</head>
<body>
    Il est <% =Date.Now.ToString("hh:mm:ss") %>
</body>
</html>

Після виконання веб-сервером цей скрипт створює таку сторінку:

Image

Для цього тесту необхідний комп’ютер під управлінням Windows, на якому встановлено платформу .NET (див. додаток).

  • помістіть скрипт heure1.aspx у <IIS-DocumentRoot>
  • запустити сервер IIS/CASSINI
  • запитати URL http://localhost/heure1.aspx

2.4.7. Висновок

Попередні приклади показали, що:

  • сторінку HTML можна динамічно згенерувати за допомогою програми. У цьому й полягає суть веб-програмування.
  • що використовувані мови та веб-сервери можуть бути різноманітними. Наразі спостерігаються такі основні тенденції:
    • комбінації Apache/PHP (Windows, Linux) та IIS/PHP (Windows)
    • технологія ASP.NET на платформах Windows, яка поєднує сервер IIS з мовою .NET (C#, VB.NET, ...)
    • технологія Java-сервлетів та сторінок JSP, що працюють з різними серверами (Tomcat, Apache, IIS) та на різних платформах (Windows, Linux).

2.5. Скрипти на стороні браузера

Сторінка HTML може містити скрипти, які виконуватимуться браузером. Існує багато мов скриптів на стороні браузера. Ось деякі з них:

Мова
Сумісні браузери
Vbscript
IE
JavaScript
IE, Netscape
PerlScript
IE
Java
IE, Netscape

Розглянемо кілька прикладів.

2.5.1. Веб-сторінка зі скриптом VBScript, що виконується на стороні браузера

Сторінка vbs1.html

<html>
  <head>
    <title>essai : une page web avec un script vb</title>
    <script language="vbscript">
      function reagir
        alert "Vous avez cliqué sur le bouton OK"
      end function
    </script>
   </head>

   <body>
<center>
     <h1>Une page Web avec un script VB</h1>
     <table>
       <tr>
         <td>Cliquez sur le bouton</td>
         <td><input type="button" value="OK" name="cmdOK" onclick="reagir"></td>
       </tr>
      </table>
   </body>
</html>

Наведена вище сторінка HTML містить не лише код HTML, а й програму, призначену для виконання браузером, який завантажить цю сторінку. Код виглядає так:

    <script language="vbscript">
      function reagir
        alert "Vous avez cliqué sur le bouton OK"
      end function
    </script>

Теги <script></script> використовуються для виділення скриптів на сторінці HTML. Ці скрипти можуть бути написані різними мовами, і саме параметр language тегу <script> вказує на використовувану мову. У даному випадку це VBScript. Ми не будемо детально розглядати цю мову. Наведений вище скрипт визначає функцію з назвою réagir, яка виводить повідомлення. Коли викликається ця функція? Про це нам повідомляє наступний рядок коду HTML:

         <input type="button" value="OK" name="cmdOK" onclick="reagir">

Атрибут onclick вказує ім’я функції, яку слід викликати, коли користувач натисне на кнопку OK. Коли браузер завантажить цю сторінку і користувач натисне на кнопку OK, ми отримаємо таку сторінку:

Image

Тестування

Лише браузер IE здатний виконувати скрипти VBScript. Netscape для цього потребує додаткових модулів. Можна провести такі тести:

  • сервер Apache
  • скрипт vbs1.html у <apache-DocumentRoot>
  • запитати URL-адресу http://localhost/vbs1.html за допомогою браузера IE

  • сервер IIS/PWS

  • скрипт vbs1.html у <pws-DocumentRoot>
  • запитати URL-адресу http://localhost/vbs1.html за допомогою браузера IE

Веб-сторінка зі скриптом JavaScript, що виконується у браузері

La page : js1.html

<html>
  <head>
    <title>essai 4 : une page web avec un script Javascript</title>
    <script language="javascript">
      function reagir(){
        alert ("Vous avez cliqué sur le bouton OK");
      }
    </script>
   </head>

   <body>
     <center>
     <h1>Une page Web avec un script Javascript</h1>
     <table>
       <tr>
         <td>Cliquez sur le bouton</td>
         <td><input type="button" value="OK" name="cmdOK" onclick="reagir()"></td>
       </tr>
    </table>
   </body>
</html>

Тут ми маємо щось подібне до попередньої сторінки, за винятком того, що мову VBScript замінено на мову Javascript. Перевага останньої полягає в тому, що її підтримують обидва браузери — IE та Netscape. Її виконання дає ті самі результати:

Image

Тести

  • сервер Apache
  • скрипт js1.html у <apache-DocumentRoot>
  • запитати URL-адресу http://localhost/js1.html за допомогою браузера IE або Netscape

  • сервер IIS/PWS

  • скрипт js1.html у <pws-DocumentRoot>
  • запитати URL-адресу http://localhost/js1.html за допомогою браузера IE або Netscape

2.6. Взаємодія «клієнт-сервер»

Повернімося до нашої початкової схеми, яка ілюструвала учасників веб-додатку:

Image

Сервер

Тут нас цікавить обмін даними між клієнтським комп’ютером та сервером. Цей обмін відбувається через мережу, і варто нагадати загальну структуру обміну даними між двома віддаленими комп’ютерами.

2.6.1. Модель OSI

Модель відкритої мережі під назвою OSI (Open Systems Interconnection Reference Model), визначена ISO (Міжнародною організацією зі стандартизації), описує ідеальну мережу, де зв’язок між машинами можна представити за допомогою семирівневої моделі:

Image

Кожен рівень отримує послуги від нижчого рівня та надає свої послуги вищому рівню. Припустимо, що два додатки, розташовані на різних машинах A та B, хочуть встановити зв’язок: вони роблять це на рівні Application. Їм не потрібно знати всіх деталей функціонування мережі: кожна програма передає інформацію, яку вона хоче надіслати, на нижній рівень — рівень Présentation. Отже, програмі потрібно знати лише правила взаємодії з рівнем Présentation. Як тільки інформація потрапляє на рівень Présentation, вона за іншими правилами передається на рівень Session і так далі, доки інформація не потрапить на фізичний носій і не буде фізично передана на машину-адресата. Там вона пройде обробку, зворотну до тієї, яку вона пройшла на комп’ютері-відправнику.

На кожному рівні процес-відправник, відповідальний за надсилання інформації, надсилає її процесу-одержувачу на іншому комп’ютері, що належить до того самого рівня. Це відбувається за певними правилами, які називаються протоколом рівня. Отже, маємо таку кінцеву схему зв’язку:

Image

Роль різних рівнів така:

Physique
Забезпечує передачу бітів по фізичному носію. На цьому рівні знаходяться кінцеві пристрої обробки даних (E.T.T.D), такі як термінал або комп’ютер, а також пристрої завершення каналів передачі даних (E.T.C.D), такі як модулятор/демодулятор, мультиплексор, концентратор. На цьому рівні слід звернути увагу на такі моменти:
. вибір способу кодування інформації (аналоговий або цифровий)
. вибір режиму передачі (синхронний або асинхронний).
Liaison de données
Приховує фізичні особливості фізичного рівня. Виявляє та виправляє помилки передачі.
Réseau
Керує маршрутом, яким має пройти інформація, що надсилається в мережі. Це називається routage: визначення маршруту, яким має пройти інформація, щоб дістатися до адресата.
Transport
Забезпечує взаємодію між двома додатками, тоді як попередні рівні дозволяли лише взаємодію між комп’ютерами. Однією зі служб, що надаються цим рівнем, може бути мультиплексування: транспортний рівень може використовувати одне й те саме мережеве з’єднання (між комп’ютерами) для передачі інформації, що належить кільком додаткам.
Session
На цьому рівні знаходяться послуги, що дозволяють додатку відкривати та підтримувати робочу сесію на віддаленому комп’ютері.
Présentation
Вона спрямована на уніфікацію представлення даних на різних машинах. Таким чином, дані, що надходять з машини A, будуть «оформлені» шаром Présentation машини A відповідно до стандартного формату перед відправкою в мережу. Потрапивши на рівень Présentation комп’ютера-одержувача B, який розпізнає їх завдяки стандартному формату, дані будуть «оформлені» іншим чином, щоб програма комп’ютера B могла їх розпізнати.
Application
На цьому рівні знаходяться програми, які зазвичай використовуються користувачем, такі як електронна пошта або передача файлів.

2.6.2. Модель TCP/IP

Модель OSI є ідеальною моделлю. Набір протоколів TCP/IP наближається до неї у такому вигляді:

Image

  • мережевий інтерфейс (мережева карта комп’ютера) виконує функції рівнів 1 і 2 моделі OSI
  • шар IP (Інтернет-протокол) виконує функції 3-го шару (мережа)
  • рівень TCP (протокол управління передачею) або UDP (протокол користувацьких датаграм) виконує функції 4-го рівня (транспортного). Протокол TCP гарантує, що пакети даних, якими обмінюються комп’ютери, надійно доходять до місця призначення. Якщо це не відбувається, він повертає пакети, що загубилися. Протокол UDP не виконує цю функцію, і тоді це завдання лягає на розробника додатків. Саме тому в Інтернеті, який не є на 100 % надійною мережею, найчастіше використовується протокол TCP. У цьому випадку йдеться про мережу TCP-IP.
  • Рівень додатків охоплює функції рівнів 5–7 моделі OSI.

Веб-додатки знаходяться в шарі Application і, отже, базуються на протоколах TCP-IP. Рівні Application клієнтських машин та сервера обмінюються повідомленнями, які передаються рівням 1–4 моделі для подальшої доставки до місця призначення. Щоб зрозуміти один одного, рівні додатків обох машин повинні «розмовляти» однією мовою або протоколом. Протокол веб-додатків називається HTTP (HyperText Transfer Protocol). Це текстовий протокол, c.a.d, за допомогою якого машини обмінюються рядками тексту в мережі для взаєморозуміння. Цей обмін стандартизовано, c.a.d, тобто клієнт має у своєму розпорядженні певну кількість повідомлень, щоб точно вказати серверу, чого він хоче, а сервер також має у своєму розпорядженні певну кількість повідомлень, щоб надати клієнту відповідь. Цей обмін повідомленнями має такий вигляд:

Image

Клієнт --> Сервер

Коли клієнт надсилає запит до веб-сервера, він надсилає

  1. рядки тексту у форматі HTTP, щоб вказати, що саме він хоче
  1. порожній рядок
  2. за бажанням — документ

Сервер --> Клієнт

Коли сервер надсилає відповідь клієнту, він надсилає

  1. рядки тексту у форматі HTTP, щоб вказати, що він надсилає
  2. порожній рядок
  3. опціонально — документ

Отже, обмін даними має однакову форму в обох напрямках. В обох випадках може відбуватися надсилання документа, хоча клієнт рідко надсилає документ на сервер. Але протокол HTTP це передбачає. Саме це дозволяє, наприклад, абонентам інтернет-провайдера завантажувати різноманітні документи на свій особистий сайт, розміщений у цього провайдера. Обмінювані документи можуть бути будь-якими. Візьмемо для прикладу браузер, який запитує веб-сторінку, що містить зображення:

  1. браузер підключається до веб-сервера та запитує потрібну сторінку. Запитані ресурси однозначно позначаються за допомогою URL (Uniform Resource Locator). Браузер надсилає лише заголовки HTTP, а не сам документ.
  2. Сервер відповідає йому. Спочатку він надсилає заголовки HTTP, що вказують, який тип відповіді він надсилає. Це може бути повідомлення про помилку, якщо запитувана сторінка не існує. Якщо сторінка існує, сервер у заголовках HTTP своєї відповіді вкаже, що після них він надішле документ HTML (HyperText Markup Language). Цей документ — це послідовність рядків тексту у форматі HTML. Текст у форматі HTML містить теги (маркери), які надають браузеру вказівки щодо способу відображення тексту.
  3. Клієнт, виходячи з заголовків HTTP сервера, знає, що отримає документ HTML. Він проаналізує цей документ і, можливо, виявить, що той містить посилання на зображення. Ці зображення відсутні в документі HTML. Тому він надсилає новий запит на той самий веб-сервер, щоб отримати перше зображення, яке йому потрібно. Цей запит ідентичний тому, що був зроблений у пункті 1, за винятком того, що запитуваний ресурс інший. Сервер обробить цей запит, надіславши клієнту запитане зображення. Цього разу у відповіді заголовки HTTP вкажуть, що надісланий документ є зображенням, а не документом HTML.
  4. Клієнт отримує надіслане зображення. Етапи 3 і 4 повторюватимуться доти, доки клієнт (зазвичай веб-браузер) не отримає всі документи, необхідні для відображення сторінки в повному обсязі.

2.6.3. Протокол HTTP

Розглянемо протокол HTTP на прикладах. Які дані обмінюються браузер і веб-сервер?

2.6.3.1. Відповідь сервера HTTP

Тут ми дізнаємося, як веб-сервер відповідає на запити своїх клієнтів. Веб-сервіс або сервіс HTTP — це сервіс TCP-IP, який зазвичай працює на порту 80. Він може працювати й на іншому порту. У такому випадку браузер-клієнт повинен вказати цей порт у запиті URL. Запит URL має такий загальний вигляд:

protocole://machine[:port]/шлях/інформація

з

протоколом
http для веб-сервісу. Браузер також може виступати клієнтом для сервісів ftp, news, telnet тощо.
машина
ім'я комп'ютера, на якому працює веб-сервіс
порт
порт веб-сервісу. Якщо це 80, номер порту можна опустити. Це найпоширеніший випадок
шлях
шлях до запитуваного ресурсу
додаткова інформація
додаткова інформація, що надається серверу для уточнення запиту клієнта

Що робить браузер, коли користувач запитує завантаження файлу URL?

  1. Він відкриває канал зв'язку TCP-IP із машиною та портом, вказаними в розділі machine[:port] файлу URL. Встановити з’єднання TCP-IP означає створити «канал» зв’язку між двома машинами. Після створення цього каналу вся інформація, що обмінюється між двома машинами, буде проходити через нього. Створення цього каналу TCP-IP ще не передбачає використання веб-протоколу HTTP.
  2. Після створення каналу TCP-IP клієнт надсилає запит до веб-сервера, відправляючи йому рядки тексту (команди) у форматі HTTP. Він надсилає серверу частину «шлях/інформація» з URL
  3. сервер відповість йому таким самим чином і через той самий канал
  4. один із двох учасників приймає рішення про закриття каналу. Це залежить від використовуваного протоколу HTTP. З протоколом HTTP 1.0 сервер закриває з’єднання після кожної своєї відповіді. Це змушує клієнта, який повинен зробити кілька запитів для отримання різних документів, що складають веб-сторінку, відкривати нове з’єднання для кожного запиту, що пов’язано з витратами. З протоколом HTTP/1.1 клієнт може вказати серверу залишити з’єднання відкритим, доки він не дасть команду його закрити. Таким чином, він може завантажити всі документи веб-сторінки за допомогою одного з’єднання та самостійно закрити його після отримання останнього документа. Сервер виявить це закриття та також закриє з’єднання.

Щоб проаналізувати обмін даними між клієнтом і веб-сервером, ми скористаємося інструментом під назвою curl. Curl — це програма, яка дозволяє виступати клієнтом інтернет-сервісів, що підтримують різні протоколи (DOS, FTP, TELNET, GOPHER, ...). curl доступний за адресою http://curl.haxx.se/. Тут бажано завантажити версію для Windows win32-nossl, оскільки версія win32-ssl вимагає додаткових DLL-файлів, які не входять до складу пакета curl. Цей пакет містить набір файлів, які потрібно просто розпакувати в папку, яку відтепер будемо називати <curl>. Ця папка містить виконуваний файл із назвою [curl.exe]. Це буде наш клієнт для звернення до веб-серверів. Відкриємо вікно командного рядка та перейдемо до папки <curl>:

dos>dir curl.exe
22/03/2004  13:29              299 008 curl.exe

E:\curl2>curl
curl: try 'curl --help' for more information
dos>curl --help | more
Usage: curl [options...] <url>
Options: (H) means HTTP/HTTPS only, (F) means FTP only
 -a/--append        Append to target file when uploading (F)
 -A/--user-agent <string> User-Agent to send to server (H)
    --anyauth       Tell curl to choose authentication method (H)
 -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)
    --basic         Enable HTTP Basic Authentication (H)
 -B/--use-ascii     Use ASCII/text transfer
 -c/--cookie-jar <file> Write cookies to this file after operation (H)
 ....

Скористаємося цим додатком, щоб звернутися до веб-сервера та проаналізувати обмін даними між клієнтом і сервером. Ми опинимося в такій ситуації:

Image

Веб-сервер може бути будь-яким. Наша мета — проаналізувати обмін даними, що відбуватиметься між веб-клієнтом curl та веб-сервером. Раніше ми створили таку статичну сторінку: HTML:

<html>
  <head>
    <title>essai 1 : une page statique</title>
   </head>
   <body>
     <center>
     <h1>Une page statique...</h1>
   </body>
</html>

що ми бачимо у браузері:

Image

Бачимо, що запитуване URL — це: http://localhost/aspnet/chap1/statique1.html. Отже, сервер веб-служби — це localhost (=локальний сервер), а порт — 80. Якщо переглянути текст HTML цієї веб-сторінки (Вигляд/Джерело), ми побачимо текст HTML, який було створено спочатку:

Image

Тепер скористаємося нашим клієнтом CURL, щоб отримати той самий URL:

dos>curl http://localhost/aspnet/chap1/statique1.html
<html>
  <head>
    <title>essai 1 : une page statique</title>
   </head>
   <body>
     <center>
     <h1>Une page statique...</h1>
   </body>
</html>

Ми бачимо, що веб-сервер надіслав йому набір рядків тексту, який представляє код HTML запитуваної сторінки. Раніше ми зазначали, що відповідь веб-сервера має такий вигляд:

Image

Однак тут ми не побачили заголовків HTTP. Це тому, що [curl] за замовчуванням їх не відображає. Опція --include дозволяє їх відобразити:

E:\curl2>curl --include http://localhost/aspnet/chap1/statique1.html
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Mon, 22 Mar 2004 16:51:00 GMT
X-AspNet-Version: 1.1.4322
Cache-Control: public
ETag: "1C4102CEE8C6400:1C4102CFBBE2250"
Content-Type: text/html
Content-Length: 161
Connection: Close

<html>
  <head>
    <title>essai 1 : une page statique</title>
   </head>
   <body>
     <center>
     <h1>Une page statique...</h1>
   </body>
</html>

Сервер дійсно надіслав серію заголовків HTTP, за якими йшов порожній рядок:

HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Mon, 22 Mar 2004 16:51:00 GMT
X-AspNet-Version: 1.1.4322
Cache-Control: public
ETag: "1C4102CEE8C6400:1C4102CFBBE2250"
Content-Type: text/html
Content-Length: 161
Connection: Close
HTTP/1.1 200 OK
сервер повідомляє
  • що він підтримує протокол HTTP версії 1.1
  • що він має запитуваний ресурс (код 200, повідомлення OK)
Server: 
сервер ідентифікується. У цьому випадку це сервер Cassini
Date: ...
дата/час відповіді
X-ASPNet-Version: ...
заголовок, характерний для сервера Cassini
Cache-Control: public
надає клієнту вказівки щодо можливості кешування відповіді, що надсилається йому. Атрибут [public] вказує клієнту, що він може кешувати сторінку. Атрибут [no-cache] вказав би клієнту, що він не повинен кешувати сторінку.
ETag:
...
Content-type: text/html
сервер повідомляє, що він надішле текст (text) у форматі HTML (html).
Content-Length: 161
кількість байтів документа, який буде надіслано після заголовків HTTP. Це число фактично є розміром у байтах файлу essai1.html:
dos>dir essai1.html

08/07/2002  10:00                  161 essai1.html
Connection: close
сервер повідомляє, що закриє з’єднання після надсилання документа

Клієнт отримує ці заголовки HTTP і тепер знає, що отримає 161 байт, які представляють документ HTML. Сервер надсилає ці 161 байт одразу після порожнього рядка, який сигналізував про кінець заголовків HTTP:

<html>
  <head>
    <title>essai 1 : une page statique</title>
   </head>
   <body>
     <center>
     <h1>Une page statique...</h1>
   </body>
</html>

Тут можна впізнати файл HTML, створений спочатку. Якби нашим клієнтом був веб-браузер, то після отримання цих рядків тексту він би їх інтерпретував, щоб відобразити користувачеві на екрані таку сторінку:

Image

Давайте ще раз використаємо нашого клієнта [curl], щоб запросити той самий ресурс, але цього разу запитуючи лише заголовки відповіді:

dos>curl --head http://localhost/aspnet/chap1/statique1.html
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Tue, 23 Mar 2004 07:11:54 GMT
Cache-Control: public
ETag: "1C410A504D60680:1C410A58621AD3E"
Content-Type: text/html
Content-Length: 161
Connection: Close

Ми отримуємо той самий результат, що й раніше, без документа HTML. Тепер спробуємо завантажити зображення як за допомогою браузера, так і за допомогою універсального клієнта TCP. Спочатку за допомогою браузера:

Image

Файл univ01.gif має розмір 4052 байт:

dos>dir univ01.gif
23/03/2004  08:14             4 052 univ01.gif

Тепер скористаємося клієнтом [curl]:

dos>curl --head http://localhost/aspnet/chap1/univ01.gif
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Tue, 23 Mar 2004 07:18:44 GMT
Cache-Control: public
ETag: "1C410A6795D7500:1C410A6868B1476"
Content-Type: image/gif
Content-Length: 4052
Connection: Close

У наведеному вище циклі «запит-відповідь» слід звернути увагу на такі моменти:

--head
  • ми запитуємо лише заголовки HTTP ресурсу. Адже зображення є бінарним файлом, а не текстовим, і його відображення на екрані у вигляді тексту не дає нічого читабельного.
Content-Length: 4052
  • це розмір файлу univ01.gif
Content-Type: image/gif
  • сервер повідомляє своєму клієнту, що надішле йому документ типу image/gif, c.a.d, а також зображення у форматі GIF. Якби зображення було у форматі JPEG, тип документа був би image/jpeg. Типи документів стандартизовані й називаються типами MIME (Multi-purpose Mail Internet Extension).

2.6.3.2. Запит клієнта HTTP

Тепер задамося таким питанням: якщо ми хочемо написати програму, яка «спілкується» з веб-сервером, які команди вона повинна надсилати веб-серверу, щоб отримати певний ресурс? У попередніх прикладах ми бачили, що отримував клієнт, але не те, що він надсилав. Ми використаємо опцію [--verbose] у curl, щоб також побачити, що клієнт надсилає серверу. Почнемо з запиту статичної сторінки:

dos>curl --verbose http://localhost/aspnet/chap1/statique1.html
* About to connect() to localhost:80
* Connected to portable1_tahe (127.0.0.1) port 80
> GET /aspnet/chap1/statique1.html HTTP/1.1
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
Host: localhost
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

< HTTP/1.1 200 OK
< Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
< Date: Tue, 23 Mar 2004 07:37:06 GMT
< Cache-Control: public
< ETag: "1C410A504D60680:1C410A58621AD3E"
< Content-Type: text/html
< Content-Length: 161
< Connection: Close
<html>
  <head>
    <title>essai 1 : une page statique</title>
   </head>
   <body>
     <center>
     <h1>Une page statique...</h1>
   </body>
</html>
* Closing connection #0

Спочатку клієнт [curl] встановлює TCP/IP-з'єднання з портом 80 комп'ютера localhost (=127.0.0.1)

* About to connect() to localhost:80
* Connected to portable1_tahe (127.0.0.1) port 80

Після встановлення з’єднання він надсилає свій запит HTTP. Цей запит складається з низки рядків тексту, що закінчуються порожнім рядком:

GET /aspnet/chap1/statique1.html HTTP/1.1
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
Host: localhost
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

Запит HTTP від веб-клієнта має дві функції:

  • вказати бажаний ресурс. Цю роль тут виконує перший рядок GET
  • надати інформацію про клієнта, який надсилає запит, щоб сервер міг, за необхідності, адаптувати свою відповідь до цього конкретного типу клієнта.

Значення рядків, надісланих вище клієнтом [curl], є таким:

GET ressource protocole
для запиту певного ресурсу згідно з певною версією протоколу HTTP. Сервер надсилає відповідь у форматі HTTP, за якою йде порожній рядок, а потім — запитуваний ресурс
User-Agent
для вказівки клієнта
host: machine:port
для уточнення (протокол HTTP 1.1) машини та порту запитуваного веб-сервера
Pargma
тут для вказівки, що клієнт не підтримує кеш.
Accept
типи MIME, що вказують типи файлів, які клієнт вміє обробляти

Повторімо операцію з опцією --head у [curl]:

dos>curl --verbose --head --output reponse.txt http://localhost/aspnet/chap1/statique1.html
* About to connect() to localhost:80
* Connected to portable1_tahe (127.0.0.1) port 80
> HEAD /aspnet/chap1/statique1.html HTTP/1.1
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
Host: localhost
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

< HTTP/1.1 200 OK
< Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
< Date: Tue, 23 Mar 2004 07:54:22 GMT
< Cache-Control: public
< ETag: "1C410A504D60680:1C410A58621AD3E"
< Content-Type: text/html
< Content-Length: 161
< Connection: Close

Ми зупинимося лише на заголовках HTTP, надісланих клієнтом:

HEAD /aspnet/chap1/statique1.html HTTP/1.1
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
Host: localhost
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

Змінилася лише команда, що запитує ресурс. Замість команди GET тепер маємо команду HEAD. Ця команда вимагає, щоб відповідь сервера обмежувалася заголовками HTTP і щоб він не надсилав запитуваний ресурс. На наведеному вище знімку екрана не відображаються отримані заголовки HTTP. Вони були збережені у файлі завдяки опції [--output reponse.txt] команди [curl]:

dos>more reponse.txt
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Tue, 23 Mar 2004 07:54:22 GMT
Cache-Control: public
ETag: "1C410A504D60680:1C410A58621AD3E"
Content-Type: text/html
Content-Length: 161
Connection: Close

2.6.4. Висновок

На кількох прикладах ми розглянули структуру запиту веб-клієнта та відповіді, яку йому надає веб-сервер. Діалог відбувається за допомогою протоколу HTTP — набору команд у текстовому форматі, якими обмінюються обидва учасники. Запит клієнта та відповідь сервера мають однакову структуру, яка виглядає так:

Image

У разі запиту (який часто називають «запитом») від клієнта частина [Document] зазвичай відсутня. Проте клієнт може надіслати документ на сервер. Для цього він використовує команду PUT. Дві типові команди для запиту ресурсу — це GET та POST. Остання буде розглянута трохи далі. Команда HEAD дозволяє запитувати лише заголовки HTTP. Команди GET та POST найчастіше використовуються веб-клієнтами типу браузера.

На запит клієнта сервер надсилає відповідь, що має таку саму структуру. Запитаний ресурс передається у частині [Document], за винятком випадків, коли команда клієнта була HEAD — у такому разі надсилаються лише заголовки HTTP.

2.7. Мова HTML

Веб-браузер може відображати різні документи, найпоширенішим з яких є документ HTML (HyperText Markup Language). Це текст, відформатований за допомогою тегів у формі <balise>texte</balise>. Так, тег <B>important</B> відображатиме важливий текст жирним шрифтом. Існують окремі теги, такі як тег <hr>, який відображає горизонтальну лінію. Ми не будемо розглядати теги, які можна знайти в тексті HTML. Існує чимало програм WYSIWYG, що дозволяють створити веб-сторінку, не написавши жодного рядка коду HTML. Ці інструменти автоматично генерують код HTML на основі макета, створеного за допомогою миші та попередньо визначених елементів управління. Таким чином, можна (за допомогою миші) вставити на сторінку таблицю, а потім переглянути код HTML, згенерований програмою, щоб дізнатися, які теги слід використовувати для визначення таблиці на веб-сторінці. Все дуже просто. Крім того, знання мови HTML є необхідним, оскільки динамічні веб-додатки повинні самостійно генерувати код HTML для надсилання веб-клієнтам. Цей код генерується програмно, і, звісно, потрібно знати, що саме слід згенерувати, щоб клієнт отримав бажану веб-сторінку.

Підсумовуючи, для початку веб-програмування зовсім не обов’язково знати мову HTML у повному обсязі. Однак ці знання є необхідними і їх можна здобути завдяки використанню програм для створення веб-сторінок на мові WYSIWYG, таких як Word, FrontPage, DreamWeaver та десятків інших. Ще один спосіб ознайомитися з тонкощами мови HTML — це переглядати веб-сторінки та вивчати їхній вихідний код, який містить цікаві та ще невідомі вам особливості.

2.7.1. Приклад

Розглянемо наступний приклад, створений за допомогою FrontPage Express — безкоштовного інструменту, що входить до складу Internet Explorer. Код, згенерований FrontPage, тут було спрощено. Цей приклад демонструє деякі елементи, які можна знайти у веб-документі, такі як:

  • таблиця
  • зображення
  • посилання

Image

Документ HTML має такий загальний вигляд:

<html>
    <head>
        <title>Un titre</title>
        ...
    </head>
    <body attributs>
        ...
    </body>
</html>

Весь документ обмежений тегами <html>...</html>. Він складається з двох частин:

  1. <head>...</head>: це невидима частина документа. Вона надає інформацію браузеру, який буде відображати документ. У ній часто зустрічається тег <title>...</title>, який визначає текст, що відображатиметься у рядку заголовка браузера. Також тут можуть бути інші теги, зокрема ті, що визначають ключові слова документа, які згодом використовуються пошуковими системами. У цій частині також можуть міститися скрипти, найчастіше написані на JavaScript або VBScript, які будуть виконуватися браузером.
  2. <body атрибути>...</body>: це частина, яка відображатиметься браузером. Теги HTML, що містяться в цій частині, вказують браузеру «бажаний» візуальний вигляд документа. Кожен браузер інтерпретує ці теги по-своєму. Тому два браузери можуть по-різному відображати один і той самий веб-документ. Зазвичай це є однією з головних проблем веб-дизайнерів.

Код HTML нашого прикладу документа виглядає так:

<html>

  <head>
      <title>balises</title>
  </head>

  <body background="/images/standard.jpg">
      <center>
        <h1>Les balises HTML</h1>
        <hr>
      </center>

    <table border="1">
      <tr>
        <td>cellule(1,1)</td>
        <td valign="middle" align="center" width="150">cellule(1,2)</td>
        <td>cellule(1,3)</td>
      </tr>
      <tr>
        <td>cellule(2,1)</td>
        <td>cellule(2,2)</td>
        <td>cellule(2,3</td>
      </tr>
    </table>

    <table border="0">
      <tr>
        <td>Une image</td>
        <td><img border="0" src="/images/univ01.gif" width="80" height="95"></td>
      </tr>
      <tr>
        <td>le site de l'ISTIA</td>
        <td><a href="http://istia.univ-angers.fr">ici</a></td>
      </tr>
    </table>
  </body>
</html>

У коді виділено лише ті моменти, які нас цікавлять:

Елементи
теги та приклади HTML
titre du document
<title>balises</title>
balises з’явиться в адресному рядку браузера, який відображатиме документ
barre horizontale
<hr>: відображає горизонтальну лінію
tableau
<атрибути таблиці>....</table>: для визначення таблиці
<tr атрибути>...</tr>: для визначення рядка
<td атрибути>...</td>: для визначення комірки
приклади:
<table border="1">...</table>: атрибут border визначає товщину межі таблиці
<td valign="middle" align="center" width="150">клітинка(1,2)</td>: визначає клітинку, вміст якої буде клітинка(1,2). Цей вміст буде вирівняно по центру вертикально (valign="middle") та горизонтально (align="center"). Ширина клітинки становитиме 150 пікселів (width="150")
image
<img border="0" src="/images/univ01.gif" width="80" height="95">: визначає зображення без рамки (border="0"), висотою 95 пікселів (height="95"), шириною 80 пікселів (width="80"), вихідний файл якого знаходиться за адресою /images/univ01.gif на веб-сервері (src="/images/univ01.gif"). Це посилання міститься у веб-документі, який було отримано за допомогою URL http://localhost:81/html/balises.htm. Крім того, браузер завантажить файл URL http://localhost:81/images/univ01.gif, щоб отримати зображення, на яке тут є посилання.
lien
<a href="http://istia.univ-angers.fr">тут</a>: робить текст ici посиланням на URL http://istia.univ-angers.fr.
fond de page
<body background="/images/standard.jpg">: вказує, що зображення, яке має слугувати фоном сторінки, знаходиться за адресою URL /images/standard.jpg на веб-сервері. У контексті нашого прикладу браузер надішле запит на URL http://localhost:81/images/standard.jpg, щоб отримати це фонове зображення.

З цього простого прикладу видно, що для побудови всього документа браузер повинен надіслати три запити на сервер:

  1. http://localhost:81/html/balises.htm, щоб отримати вихідний код HTML документа
  2. http://localhost:81/images/univ01.gif — щоб отримати зображення univ01.gif
  3. http://localhost:81/images/standard.jpg — щоб отримати фонове зображення standard.jpg

У наступному прикладі наведено веб-форму, також створену за допомогою FrontPage.

Image

Код HTML, згенерований за допомогою FrontPage та дещо спрощений, виглядає так:

<html>

  <head>
      <title>balises</title>
    <script language="JavaScript">
        function effacer(){
          alert("Vous avez cliqué sur le bouton Effacer");
      }//видалити
        </script>
  </head>

  <body background="/images/standard.jpg">
    <form method="POST" >
      <table border="0">
        <tr>
          <td>Etes-vous marié(e)</td>
          <td>
              <input type="radio" value="Oui" name="R1">Oui
              <input type="radio" name="R1" value="non" checked>Non
          </td>
        </tr>
        <tr>
          <td>Cases à cocher</td>
          <td>
              <input type="checkbox" name="C1" value="un">1
              <input type="checkbox" name="C2" value="deux" checked>2
              <input type="checkbox" name="C3" value="trois">3
          </td>
        </tr>
        <tr>
          <td>Champ de saisie</td>
          <td>
              <input type="text" name="txtSaisie" size="20" value="qqs mots">
          </td>
        </tr>
        <tr>
          <td>Mot de passe</td>
          <td>
              <input type="password" name="txtMdp" size="20" value="unMotDePasse">
          </td>
        </tr>
        <tr>
          <td>Boîte de saisie</td>
          <td>
               <textarea rows="2" name="areaSaisie" cols="20">
ligne1
ligne2
ligne3
</textarea>
          </td>
        </tr>
        <tr>
          <td>combo</td>
          <td>
              <select size="1" name="cmbValeurs">
                <option>choix1</option>
                <option selected>choix2</option>
                <option>choix3</option>
              </select>
          </td>
        </tr>
        <tr>
          <td>liste à choix simple</td>
          <td>
              <select size="3" name="lst1">
                <option selected>liste1</option>
                <option>liste2</option>
                <option>liste3</option>
                <option>liste4</option>
                <option>liste5</option>
              </select>
          </td>
        </tr>
        <tr>
          <td>liste à choix multiple</td>
          <td>
              <select size="3" name="lst2" multiple>
                <option>liste1</option>
                <option>liste2</option>
                <option selected>liste3</option>
                <option>liste4</option>
                <option>liste5</option>
              </select>
          </td>
        </tr>
        <tr>
          <td>bouton</td>
          <td>
              <input type="button" value="Effacer" name="cmdEffacer" onclick="effacer()">
          </td>
        </tr>
        <tr>
          <td>envoyer</td>
          <td>
              <input type="submit" value="Envoyer" name="cmdRenvoyer">
          </td>
        </tr>
        <tr>
          <td>rétablir</td>
          <td>
              <input type="reset" value="Rétablir" name="cmdRétablir">
          </td>
        </tr>
      </table>
      <input type="hidden" name="secret" value="uneValeur">
    </form>
  </body>
</html>

Відповідність візуального елемента <--> тегу HTML така:

Перевірка
тег HTML
formulaire
<form method="POST" >
champ de saisie
<input type="text" name="txtSaisie" size="20" value="кілька слів">
champ de saisie cachée
<input type="password" name="txtMdp" size="20" value="unMotDePasse">
champ de saisie multilignes
<textarea rows="2" name="areaSaisie" cols="20">
рядок1
рядок 2
рядок3
</textarea>
boutons radio
<input type="radio" value="Так" name="R1">Так
<input type="radio" name="R1" value="ні" checked>Ні
cases à cocher
<input type="checkbox" name="C1" value="один">1
<input type="checkbox" name="C2" value="два" checked>2
<input type="checkbox" name="C3" value="три">3
Combo
<select size="1" name="cmbValeurs">
<option>варіант1</option>
<option selected>варіант 2</option>
<option>варіант 3</option>
</select>
liste à sélection unique
<select size="3" name="lst1">
<option selected>список1</option>
<option>список2</option>
<option>список3</option>
<option>список4</option>
<option>список5</option>
</select>
liste à sélection multiple
<select size="3" name="lst2" multiple>
<option>список1</option>
<option>список2</option>
<option selected>список3</option>
<option>список4</option>
<option>список5</option>
</select>
bouton de type submit
<input type="submit" value="Надіслати" name="cmdRenvoyer">
bouton de type reset
<input type="reset" value="Скинути" name="cmdRétablir">
bouton de type button
<input type="button" value="Очистити" name="cmdEffacer" onclick="effacer()">

Давайте розглянемо ці різні елементи управління.

2.7.1.1. Форма

formulaire
<form method="POST" >
balise HTML
<form name="..." method="..." action="...">...</form>
attributs
name="frmexemple": ім'я форми
method="..." : метод, який використовує браузер для надсилання на веб-сервер значень, зібраних у формі
action="..." : URL, на яку будуть надіслані значення, зібрані у формі.
Веб-форма оточена тегами <form>...</form>. Форма може мати ім’я (name="xx"). Це стосується всіх елементів управління, які можна знайти у формі. Це ім’я є корисним, якщо веб-документ містить скрипти, які повинні посилатися на елементи форми. Мета форми — зібрати інформацію, введену користувачем за допомогою клавіатури/миші, та надіслати її на веб-сервер URL. Який саме? Той, що вказаний в атрибуті action="URL". Якщо цей атрибут відсутній, інформація буде надіслана на сервер, на якому розміщений документ, у якому знаходиться форма. Саме так було б у наведеному вище прикладі. До цього моменту ми завжди розглядали веб-клієнта як того, хто «запитує» інформацію у веб-сервера, але ніколи — як того, хто «надає» йому інформацію. Як веб-клієнт передає інформацію (ту, що міститься у формі) веб-серверу? Ми детально розглянемо це трохи пізніше. Він може використовувати два різні методи, які називаються POST та GET. Атрибут method="méthode", у якому метод дорівнює GET або POST, тегу <form> вказує браузеру, який метод слід використовувати для надсилання інформації, зібраної у формі, до URL, вказаного атрибутом action="URL". Якщо атрибут method не вказано, за замовчуванням використовується метод GET.

2.7.1.2. Поле введення

Image

Image

champ de saisie
<input type="text" name="txtSaisie" size="20" value="кілька слів">
<input type="password" name="txtMdp" size="20" value="unMotDePasse">
balise HTML
<input type="..." name="..." size=".." value="..">
Тег `input` використовується для різних елементів управління. Саме атрибут type дозволяє розрізняти ці різні елементи управління між собою.
attributs
type="text": вказує, що це поле введення
type="password": символи у полі введення замінюються на символи *. Це єдина відмінність від звичайного поля введення. Цей тип елемента управління підходить для введення паролів.
size="20": кількість символів, що відображаються у полі — не обмежує введення більшої кількості символів
name="txtSaisie": ім’я елемента управління
value="кілька слів" : текст, який відображатиметься у полі введення.

2.7.1.3. Багаторядкове поле введення

Image

champ de saisie multilignes
<textarea rows="2" name="areaSaisie" cols="20">
ligne1
ligne2
ligne3
</textarea>
balise HTML
<textarea ...>текст</textarea>
відображає багаторядкове поле введення, яке спочатку містить текст
attributs
rows="2": кількість рядків
cols="'20" : кількість стовпців
name="areaSaisie": ім'я елемента управління

2.7.1.4. Радіо-кнопки

Image

boutons radio
<input type="radio" value="Так" name="R1">Так
<input type="radio" name="R1" value="no" checked>Ні
balise HTML
<input type="radio" атрибут2="значення2" ....>текст
відображає перемикач із текстом поруч.
attributs
name="radio": ім'я елемента управління. Перемикачі з однаковим ім'ям утворюють групу, елементи якої взаємовиключні: можна вибрати лише один із них.
value="значення": значення, присвоєне радіо-кнопці. Не слід плутати це значення з текстом, що відображається поруч із радіо-кнопкою. Останній призначений лише для відображення.
checked: якщо це ключове слово присутнє, перемикач позначений, інакше — ні.

2.7.1.5. Поля для позначення

cases à cocher
<input type="checkbox" name="C1" value="один">1
<input type="checkbox" name="C2" value="два" checked>2
<input type="checkbox" name="C3" value="три">3

Image

balise HTML
<input type="checkbox" attribut2="valeur2" ....>текст
відображає прапорець із текстом поруч.
attributs
name="C1": ім'я елемента управління. Поля для позначення можуть мати однакове ім'я або ні. Поля з однаковим ім'ям утворюють групу пов'язаних полів.
value="значення": значення, присвоєне прапорцю. Не слід плутати це значення з текстом, що відображається поруч із перемикачем. Останній призначений лише для відображення.
checked: якщо цей ключовий параметр присутній, перемикач позначений, інакше — ні.

2.7.1.6. Список, що розгортається (комбо)

Combo
<select size="1" name="cmbValeurs">
<option>choix1</option>
<option selected>вибір2</option>
<option>choix3</option>
</select>

Image

balise HTML
<select size=".." name="..">
<option [selected]>...</option>
...
</select>
відображає у списку тексти, що містяться між тегами <option>...</option>
attributs
name="cmbValeurs" — назва елемента управління.
size="1": кількість видимих елементів списку. size="1" перетворює список на комбінований список.
selected: якщо це ключове слово вказано для елемента списку, він відображається у списку як вибраний. У нашому прикладі вище елемент списку choix2 відображається як вибраний елемент комбінованого списку, коли той з’являється вперше.

2.7.1.7. Список з одним вибором

liste à sélection unique
<select size="3" name="lst1">
<option selected>список1</option>
<option>liste2</option>
<option>liste3</option>
<option>liste4</option>
<option>liste5</option>
</select>

Image

balise HTML
<select size=".." name="..">
<option [selected]>...</option>
...
</select>
відображає у списку тексти, що містяться між тегами <option>...</option>
attributs
ті самі, що й для випадаючого списку, який відображає лише один елемент. Цей елемент управління відрізняється від попереднього випадаючого списку лише атрибутом size>1.

2.7.1.8. Список із можливістю множинного вибору

liste à sélection unique
<select size="3" name="lst2" multiple>
<option selected>список1</option>
<option>liste2</option>
<option selected>список3</option>
<option>liste4</option>
<option>liste5</option>
</select>

Image

balise HTML
<select size=".." name=".." multiple>
<option [selected]>...</option>
...
</select>
відображає у списку тексти, що містяться між тегами <option>...</option>
attributs
multiple: дозволяє вибрати кілька елементів зі списку. У наведеному вище прикладі вибрано обидва елементи: liste1 та liste3.

2.7.1.9. Кнопка типу button

bouton de type button
<input type="button" value="Очистити" name="cmdEffacer" onclick="effacer()">

Image

balise HTML
<input type="button" value="..." name="..." onclick="effacer()" ....>
attributs
type="button": визначає елемент управління «кнопка». Існують ще два типи кнопок: submit та reset.
value="Очистити": текст, що відображається на кнопці
onclick="функція()" : дозволяє визначити функцію, яка має виконуватися, коли користувач натискає на кнопку. Ця функція є частиною скриптів, визначених у відображеному веб-документі. Наведений вище синтаксис відповідає синтаксису javascript. Якщо скрипти написані на VBScript, слід вказати onclick="функція" без дужок. Синтаксис залишається таким самим, якщо потрібно передати параметри до функції: onclick="функція(val1, val2,...)"
У нашому прикладі клік на кнопку Effacer викликає таку функцію JavaScript effacer:
    <script language="JavaScript">
        function effacer(){
          alert("Vous avez cliqué sur le bouton Effacer");
      }//видалити
        </script>
Функція effacer виводить таке повідомлення:

2.7.1.10. Кнопка типу «submit»

bouton de type submit
<input type="submit" value="Надіслати" name="cmdRenvoyer">

Image

balise HTML
<input type="submit" value="Надіслати" name="cmdRenvoyer">
attributs
type="submit": визначає кнопку як кнопку відправлення даних форми на веб-сервер. Коли клієнт натисне на цю кнопку, браузер надішле дані форми на URL, визначений в атрибуті action тегу <form>, відповідно до методу, визначеного атрибутом method цього ж тегу.
value="Відправити": текст, що відображається на кнопці

2.7.1.11. Кнопка типу «reset»

bouton de type reset
<input type="reset" value="Скинути" name="cmdRétablir">

Image

balise HTML
<input type="reset" value="Скинути" name="cmdRétablir">
attributs
type="reset": визначає кнопку як кнопку скидання форми. Коли клієнт натисне на цю кнопку, браузер поверне форму до того стану, в якому він її отримав.
value="Скинути" : текст, що відображається на кнопці

2.7.1.12. Приховане поле

champ caché
<input type="hidden" name="secret" value="uneValeur">
balise HTML
<input type="hidden" name="..." value="...">
attributs
type="hidden": вказує, що це приховане поле. Приховане поле є частиною форми, але не відображається користувачеві. Однак, якщо користувач попросить свій браузер показати вихідний код, він побачить тег <input type="hidden" value="..."> і, отже, значення прихованого поля.
value="uneValeur": значення прихованого поля.
У чому полягає користь прихованого поля? Воно дозволяє веб-серверу зберігати інформацію під час послідовних запитів клієнта. Розглянемо приклад веб-додатку для покупок. Клієнт купує перший товар art1 у кількості q1 на першій сторінці каталогу, а потім переходить на нову сторінку каталогу. Щоб запам’ятати, що клієнт придбав q1 товарів art1, сервер може помістити ці дві інформації в приховане поле веб-форми на новій сторінці. На цій новій сторінці клієнт купує товари q2 та art2. Коли дані цієї другої форми будуть надіслані на сервер (submit), сервер отримає не тільки інформацію (q2, art2), а й (q1, art1), яка також є частиною форми як приховане поле, яке користувач не може змінювати. Потім веб-сервер помістить у нове приховане поле дані (q1,art1) та (q2,art2) і надішле нову сторінку каталогу. І так далі.

2.7.2. Відправлення веб-клієнтом значень форми на веб-сервер

У попередньому розділі ми зазначили, що веб-клієнт має два методи для надсилання на веб-сервер значень форми, яку він відобразив: методи GET та POST. Розглянемо на прикладі різницю між цими двома методами. Сторінка, яку ми розглядали раніше, є статичною. Щоб отримати доступ до заголовків HTTP, надісланих браузером, який запитує цей документ, ми перетворюємо її на динамічну сторінку для веб-сервера .NET (IIS або Cassini). Тут мова йде не про технологію .NET, яка буде розглянута в наступному розділі, а про обмін даними між клієнтом і сервером. Код сторінки ASP.NET такий:

<%@ Page Language="vb" CodeBehind="params.aspx.vb" AutoEventWireup="false" Inherits="ConsoleApplication1.params" %>
<script runat="server">

    Private Sub Page_Init(Byval Sender as Object, Byval e as System.EventArgs)
       ' зберегти запит
    saveRequest
  end sub
  Private Sub saveRequest
       ' зберігає поточний запит у request.txt у папці сторінки
    dim requestFileName as String=Me.MapPath(Me.TemplateSourceDirectory)+"\request.txt"
    Me.Request.SaveAs(requestFileName,true)
  end sub
</script>

<html>
    <head>
        <title>balises</title>
        <script language="JavaScript">
        function effacer(){
          alert("Vous avez cliqué sur le bouton Effacer");
      }//видалити
        </script>
    </head>
    <body background="/images/standard.jpg">
....
    </body>
</html>

До вмісту HTML досліджуваної сторінки ми додаємо фрагмент коду у форматі VB.NET. Ми не будемо коментувати цей код, окрім того, що при кожному виклику вищезазначеного документа веб-сервер зберігатиме запит веб-клієнта у файлі [request.txt] у папці викликуваного документа.

2.7.2.1. Метод GET

Проведемо перший тест, у якому в коді HTML документа тег FORM визначено таким чином:


        <form method="get">

Попередній документ (HTML + код VB) називається [params.aspx]. Він розміщений у дереві каталогів веб-сервера .NET (IIS/Cassini) і викликається за URL-адресою http://localhost/aspnet/chap1/params.aspx:

Image

Браузер щойно надіслав запит, і ми знаємо, що він було збережено у файлі [request.txt]. Давайте подивимося на його вміст:

GET /aspnet/chap1/params.aspx HTTP/1.1
Connection: keep-alive
Keep-Alive: 300
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113

Ми бачимо елементи, які вже зустрічалися у клієнта [curl]. Інші з’являються вперше:

Connection: keep-alive
клієнт просить сервер не закривати з’єднання після його відповіді. Це дозволить йому використовувати те саме з’єднання для наступного запиту. З’єднання не залишається відкритим нескінченно. Сервер закриє його після занадто тривалого періоду бездіяльності.
Keep-Alive
тривалість у секундах, протягом якої з’єднання [Keep-Alive] залишатиметься відкритим
Accept-Charset
Категорія символів, з якими клієнт може працювати
Accept-Language
Список мов, яким віддає перевагу клієнт.

Ми заповнюємо форму наступним чином:

Image

Ми використовуємо кнопку [Envoyer], розташовану вище. Її код HTML такий:

<form method="get">
    ...
    <input type="submit" value="Envoyer">
    ...
</form>

При натисканні кнопки типу [Submit] браузер надсилає параметри форми (тег <form>) на URL, вказаний в атрибуті [action] тегу <form action="URL">, якщо він існує. Якщо цей атрибут відсутній, параметри форми надсилаються на URL, який видав форму. Саме так і відбувається в даному випадку. Отже, натискання кнопки [Envoyer] має призвести до надсилання браузером запиту до URL [http://localhost/aspnet/chap1/params.aspx] із передачею параметрів форми. Оскільки сторінка [params.aspx] запам’ятовує отриманий запит, ми повинні дізнатися, як клієнт передав ці параметри. Спробуємо. Натискаємо кнопку [Envoyer]. Отримуємо таку відповідь від браузера:

Image

Це початкова сторінка, але можна помітити, що значення URL у полі [Adresse] браузера змінилося. Воно стало таким:

http://localhost/aspnet/chap1/params.aspx?R1=Так&C1=один&C2=два&txtSaisie=веб-програмування&txtMdp=це+таємниця&areaSaisie=основи+0D%0Aвеб-програмування&cmbValeurs=вибір3&lst1=список3&lst2=список1&lst2=список3&cmdRenvoyer=Надіслати&secret=uneValeur

Можна побачити, що вибір, зроблений у формі, відображається у URL. Давайте розглянемо вміст файлу [request.txt], який зберіг запит клієнта:

GET /aspnet/chap1/params.aspx?R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecret&areaSaisie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&cmdRenvoyer=Envoyer&secret=uneValeur HTTP/1.1
Connection: keep-alive
Keep-Alive: 300
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
Referer: http://localhost/aspnet/chap1/params.aspx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113

Ми бачимо запит HTTP, який досить схожий на той, що спочатку надсилав браузер, коли запитував документ без передачі параметрів. Є дві відмінності:

GET URL HTTP/1.1
Параметри форми були додані після URL документа у вигляді ?param1=val1&param2=val2&...
Referer
за допомогою цього заголовка HTTP клієнт вказує URL документа, який він переглядав під час надсилання запиту

Давайте детальніше розглянемо, як параметри були передані в запиті GET URL?param1=значення1&param2=значення2&... HTTP/1.1, де parami — це імена елементів управління веб-форми, а «значення» — відповідні їм значення. Нижче наведено таблицю з трьома стовпцями:

  • 1-й стовпець: містить визначення елемента управління HTML із прикладу
  • 2-й стовпець: відображення цього елемента управління в браузері
  • стовпець 3: містить значення, яке браузер надсилає на сервер для елемента управління зі стовпця 1 у тому вигляді, в якому воно міститься у запиті GET з прикладу
елемент управління HTML
візуальна частина
повернуте значення (значення)
<input type="radio" value="Так" name="R1">Так
<input type="radio" name="R1" value="ні" checked>Ні
R1=Так
- значення атрибута value радіо-кнопки, яку вибрав користувач.
<input type="checkbox" name="C1" value="один">1
<input type="checkbox" name="C2" value="два" checked>2
<input type="checkbox" name="C3" value="три">3
C1=один
C2=два
- значення атрибутів value полів, позначених користувачем
<input type="text" name="txtSaisie" size="20" value="кілька слів">
txtSaisie=веб-програмування
- текст, введений користувачем у поле введення. Пробіли замінено на знак +
<input type="password" name="txtMdp" size="20" value="unMotDePasse">
txtMdp=цесекрет
- текст, введений користувачем у поле введення
<textarea rows="2" name="areaSaisie" cols="20">
рядок1
рядок 2
рядок3
</textarea>
areaSaisie=основи+%0D%0A
веб-програмування+
- текст, введений користувачем у поле введення. %OD%OA — це позначка кінця рядка. Пробіли замінено на знак +
<select size="1" name="cmbValeurs">
<option>вибір1</option>
<option selected>варіант2</option>
<option>варіант3</option>
</select>
cmbValeurs=варіант3
- значення, обране користувачем у списку з одним варіантом вибору
<select size="3" name="lst1">
<option selected>список1</option>
<option>список2</option>
<option>список3</option>
<option>список4</option>
<option>список5</option>
</select>
lst1=список3
- значення, вибране користувачем зі списку з одним вибором
<select size="3" name="lst2" multiple>
<option selected>список1</option>
<option>список2</option>
<option selected>список3</option>
<option>список4</option>
<option>список5</option>
</select>
lst2=список1
lst2=список3
- значення, вибрані користувачем зі списку з можливістю множинного вибору
<input type="submit" value="Надіслати" name="cmdRenvoyer">
 
cmdRenvoyer=Надіслати
- ім'я та атрибут value кнопки, яка використовувалася для надсилання даних форми на сервер
<input type="hidden" name="secret" value="uneValeur">
 
secret=значення
- атрибут value прихованого поля

Можна запитати, що сервер зробив із параметрами, які йому передали. Насправді нічого. Після отримання команди

GET /aspnet/chap1/params.aspx?R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecret&areaSaisie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&cmdRenvoyer=Envoyer&secret=uneValeur HTTP/1.1

веб-сервер передав параметри URL у документ http://localhost/aspnet/chap1/params.aspx, а c.a.d — у документ, який ми створили спочатку. Ми не написали жодного коду для отримання та обробки параметрів, які надсилає нам клієнт. Тому все відбувається так, ніби запит клієнта був просто таким:

GET /aspnet/chap1/params.aspx

Саме з цієї причини у відповідь на натискання нашої кнопки [Envoyer] ми отримали ту саму сторінку, що й спочатку при запиті URL [http://localhost/aspnet/chap1/params.aspx] без параметрів.

2.7.2.2. Метод POST

Документ HTML тепер налаштований таким чином, що браузер використовує метод POST для надсилання значень форми на веб-сервер:

    <form method="POST" >

Ми запитуємо новий документ за допомогою URL [http://localhost/aspnet/chap1/params.aspx], заповнюємо форму так само, як для методу GET, і передаємо параметри на сервер за допомогою кнопки [Envoyer]. Ми отримуємо від сервера таку сторінку відповіді:

Image

Отже, ми отримуємо той самий результат, що й у разі використання методів GET та c.a.d — початкову сторінку. Можна помітити одну відмінність: у полі [Adresse] браузера передані параметри не відображаються. Тепер розглянемо запит, надісланий клієнтом і збережений у файлі [request.txt]:

POST /aspnet/chap1/params.aspx HTTP/1.1
Connection: keep-alive
Keep-Alive: 300
Content-Length: 210
Content-Type: application/x-www-form-urlencoded
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
Referer: http://localhost/aspnet/chap1/params.aspx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113

R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecrey&areaSaisie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&cmdRenvoyer=Envoyer&secret=uneValeur

У запиті клієнта HTTP з’являються нові елементи:

POST URL HTTP/1.1
запит GET замінено на запит POST. Параметри більше не містяться в першому рядку запиту. Можна помітити, що тепер вони розміщені після запиту HTTP, після порожнього рядка. Їхнє кодування ідентичне тому, яке вони мали в запиті GET.
Content-Length
кількість «відправлених» символів, c.a.d. Кількість символів, яку веб-сервер повинен прочитати після отримання заголовків HTTP, щоб отримати документ, який надсилає йому клієнт. У даному випадку цим документом є список значень форми.
Content-type
вказує тип документа, який клієнт надішле після заголовків HTTP. Тип [application/x-www-form-urlencoded] вказує, що це документ, який містить значення форми.

Існує два методи передачі даних на веб-сервер: GET та POST. Чи є один із цих методів кращим за інший? Ми бачили, що якщо значення форми надсилалися браузером за допомогою методу GET, браузер відображав у своєму полі Adresse запитуване значення URL у формі URL?param1=val1&param2=val2&.... Це можна розглядати як перевагу або недолік:

  • перевагою, якщо ми хочемо дозволити користувачеві додати цей налаштований URL до своїх улюблених посилань
  • недолік, якщо ми не хочемо, щоб користувач мав доступ до певної інформації у формі, наприклад, до прихованих полів

Надалі ми будемо використовувати у своїх формах майже виключно метод POST.

2.8. Conclusion

У цьому розділі було представлено різні базові концепції веб-розробки:

  • різні доступні інструменти та технології (Java, ASP, asp.net, PHP, Perl, VBScript, JavaScript)
  • обмін даними між клієнтом і сервером за допомогою протоколу HTTP
  • розробка документа за допомогою мови HTML
  • створення форм для введення даних

На прикладі ми побачили, як клієнт може надсилати інформацію на веб-сервер. Ми не розглядали, як сервер може

  • отримувати цю інформацію
  • обробити її
  • надіслати клієнту динамічну відповідь, що залежить від результату обробки

Це сфера веб-програмування, яку ми розглянемо в наступному розділі, де буде представлено технологію ASP.NET.