Skip to content

2. Temel Bilgiler

Bu bölümde, web programlamanın temellerini ele alıyoruz. Bu bölümün temel amacı, belirli bir dil ve ortamda uygulamaya geçmeden önce web programlamanın temel ilkelerini tanıtmaktır. Web geliştirme felsefesini yavaş yavaş "içselleştirmek" için denemeniz tavsiye edilen çok sayıda örnek sunulmaktadır.

2.1. Bir Web uygulamasının bileşenleri

Image

Numara
Rol
Yaygın örnekler
1
OS Sunucu
Linux, Windows
2
Web Sunucusu
Apache (Linux, Windows)
IIS (NT), PWS (Win9x)
3
Sunucu tarafında çalıştırılan komut dosyaları. Bunlar, sunucu modülleri
modülleri veya sunucu dışındaki programlar tarafından çalıştırılabilir (CGI).
PERL (Apache, IIS, PWS)
VBSCRIPT (IIS, PWS)
JAVASCRIPT (IIS, PWS)
PHP (Apache, IIS, PWS)
JAVA (Apache, IIS, PWS)
C#, VB.NET (IIS)
4
Veritabanı - Bu, onu kullanan programla aynı makinede
kullanan programla aynı makinede veya İnternet üzerinden başka bir makinede bulunabilir.
Oracle (Linux, Windows)
MySQL (Linux, Windows)
Access (Windows)
SQL Sunucusu (Windows)
5
OS İstemci
Linux, Windows
6
Web Tarayıcısı
Netscape, Internet Explorer
7
Tarayıcı içinde istemci tarafında çalıştırılan komut dosyaları.
Bu komut dosyaları, istemci bilgisayarın disklerine erişemez.
VBscript (IE)
Javascript (IE, Netscape)
Perl betiği (IE)
Applet'ler JAVA

2.2. Form içeren bir web uygulamasında veri alışverişi

Image

İstemci Makinesi Sunucu Makinesi

Numara
Rol
1
Tarayıcı, URL için ilk kez (http://machine/url)'i istiyor. Hiçbir parametre aktarılmadı.
2
Web sunucusu, bu URL'e ait web sayfasını tarayıcıya gönderir. Bu sayfa statik olabilir veya veritabanı içeriğini (SB, SC) kullanmış olabilecek bir sunucu komut dosyası (SA) tarafından dinamik olarak oluşturulabilir. Burada komut dosyası, URL'in herhangi bir parametre verilmeden istendiğini algılayacak ve başlangıç sayfası olan WEB'i oluşturacaktır.
Tarayıcı sayfayı alır ve görüntüler (CA). Tarayıcı tarafındaki komut dosyaları (CB), sunucu tarafından gönderilen başlangıç sayfasını değiştirmiş olabilir. Ardından, kullanıcı (CD) ile komut dosyaları (CB) arasındaki etkileşimler sonucunda web sayfası değiştirilecektir. Özellikle formlar doldurulacaktır.
3
Kullanıcı, web sunucusuna gönderilmesi gereken form verilerini onaylar. Tarayıcı, duruma göre ilk URL'i veya başka bir komut dosyasını yeniden ister ve aynı anda form değerlerini sunucuya iletir. Bunu yapmak için GET ve POST adlı iki yöntemi kullanabilir. İstemciden gelen isteği aldığında, sunucu istenen URL ile ilişkili komut dosyasını (SA) çalıştırır; bu komut dosyası parametreleri algılar ve işler.
4
Sunucu, program tarafından oluşturulan WEB sayfasını (SA, SB, SC) gönderir. Bu adım, önceki 2. adımla aynıdır. Artık veri alışverişi 2. ve 3. adımlara göre gerçekleştirilir.

2.3. Bazı kaynaklar

Aşağıda, web geliştirme için gerekli bazı araçları kurmanıza ve kullanmanıza yardımcı olacak kaynakların bir listesi bulunmaktadır. Ek bölümde ise bu araçların kurulumuna ilişkin bir kılavuz yer almaktadır.

Serveur Apache
http://www.apache.org
- Apache, Kurulum ve Uygulama, O'Reilly
Serveur IIS, PWS
http://www.microsoft.com
PERL
http://www.activestate.com
- Perl Programlama, Larry Wall, O'Reilly
- Perl ile Uygulamalar, Neuss ve Vromans, O'Reilly
- Active Perl ile birlikte gelen HTML belgeleri
PHP
http://www.php.net
- PHP ile Web Programlama, Lacroix, Eyrolles
- PHP kullanım kılavuzu, PHP web sitesinden indirilebilir
VBSCRIPT, ASP
http://msdn.microsoft.com/scripting/vbscript/download/vbsdoc.exe
http://msdn.microsoft.com/scripting/default.htm?/scripting/vbscript
- WEB ile WinNT Altındaki Veritabanı Arasındaki Arayüz, Alex Homer, Eyrolles
JAVASCRIPT
http://msdn.microsoft.com/scripting/jscript/download/jsdoc.exe
http://developer.netscape.com/docs/manuals/index.html
HTML
http://developer.netscape.com/docs/manuals/index.html
JAVA
http://www.sun.com
- JAVA Servlets, Jason Hunter, O'Reilly
- Java ile Ağ Programlama, Elliotte Rusty Harold, O'Reilly
- JDBC ve Java, George Reese, O'Reilly
Base de données
http://www.mysql.com
http://www.oracle.com
- MySQL kılavuzu, MySQL web sitesinde mevcuttur
- Linux üzerinde Oracle 8i, Gilles Briard, Eyrolles
- NT altında Oracle 8i, Gilles Briard, Eyrolles

2.4. Kısaltmalar

Bundan sonra, bir dizi aracın kurulduğunu varsayacağız ve aşağıdaki notasyonları kullanacağız:

sembol
anlam
<apache>
Apache sunucusunun dizin ağacının kökü
<apache-DocumentRoot>
Apache tarafından sunulan web sayfalarının kök dizini. Web sayfaları bu kök dizinin altında bulunmalıdır. Dolayısıyla, URL http://localhost/page1.htm adresi, <apache-DocumentRoot>\page1.htm dosyasına karşılık gelir.
<apache-cgi-bin>
cgi-bin takma adıyla ilişkili dizin ağacının kök dizinidir ve buraya Apache için CGI komut dosyaları yerleştirilebilir. Böylece, URL http://localhost/cgi-bin/test1.pl adresi, <apache-cgi-bin>\test1.pl dosyasına karşılık gelir.
<pws-DocumentRoot>
PWS tarafından sunulan web sayfalarının kök dizini. Web sayfaları bu kök dizin altında bulunmalıdır. Dolayısıyla, URL http://localhost/page1.htm, <pws-DocumentRoot>\page1.htm dosyasına karşılık gelir.
<perl>
Perl dil ağacının kökü. perl.exe yürütülebilir dosyası genellikle <perl>\bin. içinde bulunur
<php>
PHP dil ağacının kökü. php.exe yürütülebilir dosyası genellikle <php>. içinde bulunur
<java>
Java dizin ağacının kökü. Java ile ilişkili yürütülebilir dosyalar <java>\bin. içinde bulunur
<tomcat>
Tomcat sunucusunun kök dizininde bulunur. Servlet örnekleri <tomcat>\webapps\examples\servlets'te, sayfa örnekleri ise JSP'te ve <tomcat>\webbapps\examples\jsp'te bulunur

Bu araçların her biri için, kurulumlarına ilişkin yardım içeren ek bölüme başvurulabilir.

2.5. Statik Web Sayfaları, Dinamik Web Sayfaları

Statik bir sayfa, HTML dosyasıyla temsil edilir. Dinamik bir sayfa ise web sunucusu tarafından "anında" oluşturulur. Bu paragrafta, web kavramının evrenselliğini göstermek amacıyla farklı web sunucuları ve farklı programlama dilleriyle çeşitli testler sunuyoruz.

2.5.1. HTML statik sayfası (HyperText İşaretleme Dili)

Aşağıdaki HTML kodunu ele alalım:

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

ve şu web sayfasını oluşturur:

Testler

Image

  • Apache sunucusunu başlatın

  • essai1.html komut dosyasını <apache-DocumentRoot> klasörüne yerleştirin

  • URL dosyasını (http://localhost/essai1.html) bir tarayıcıyla görüntüleyin

  • Apache sunucusunu durdurun

  • PWS sunucusunu başlatın

  • essai1.html komut dosyasını <pws-DocumentRoot> dosyasına ekleyin

  • URL http://localhost/essai1.html sayfasını bir tarayıcıyla görüntüleyin

2.5.2. Bir ASP sayfası (Active Server Pages)

essai2.asp komut dosyası:

<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>

aşağıdaki web sayfasını oluşturur:

Image

Test

  • PWS sunucusunu başlatın

  • essai2.asp komut dosyasını <pws-DocumentRoot> içine yerleştirin

  • Bir tarayıcıyla URL http://localhost/essai2.asp adresine erişin

2.5.3. PERL komut dosyası (Practical Extracting and Reporting Language)

essai3.pl komut dosyası:

#!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
;

İlk satır, perl.exe yürütülebilir dosyasının yoludur. Gerekirse bu yolun değiştirilmesi gerekir. Bir web sunucusu tarafından çalıştırıldığında, komut dosyası aşağıdaki sayfayı oluşturur:

Image

Test

  • Web sunucusu: Apache

- Bilgi amaçlı olarak, Apache sürümüne göre <apache>\confs dizininde bulunan Apache sürümüne göre srm.conf veya httpd.conf yapılandırma dosyasını inceleyin ve essai3.pl dosyasını yerleştireceğiniz <apache-cgi-bin> dizinini belirlemek için cgi-bin ile ilgili satırı arayın.

  • essai3.pl betiğini <apache-cgi-bin> dizinine yerleştirin

  • http://localhost/cgi-bin/essai3.pl URL'sini girin

perl sayfasının yüklenmesi, asp sayfasına göre daha uzun sürer. Bunun nedeni, Perl betiğinin bir Perl yorumlayıcısı tarafından çalıştırılması ve bu yorumlayıcının betiği çalıştırabilmesi için önceden yüklenmesi gerekmesidir. Yorumlayıcı bellekte sürekli olarak kalmaz.

2.5.4. Bir PHP betiği (Kişisel Ana Sayfa)

essai4.php betiği

<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>

Yukarıdaki komut dosyası aşağıdaki web sayfasını oluşturur:

Testler

Image

Image

  • <Apache>\confs içindeki Apache yapılandırma dosyası srm.conf veya httpd.conf'i inceleyin

  • Bilgi amaçlı olarak, php dosyasındaki yapılandırma satırlarını kontrol edin

  • Apache sunucusunu başlatın

  • essai4.php dosyasını <apache-DocumentRoot> klasörüne yerleştirin

  • URL'i http://localhost/essai4.php adresinden isteyin

  • PWS sunucusunu başlatın

  • Bilgi amaçlı olarak, PWS'in PHP ayarlarını kontrol edin

  • essai4.php'i <pws-DocumentRoot>\php'e ekleyin

  • URL'e http://localhost/essai4.php adresini isteyin

2.5.5. Bir JSP betiği (Java Server Pages)

heure.jsp betiği

<%  //saati gösteren Java programı %>

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

<% 
     // saati hesaplamak için JAVA kodu
  Calendar calendrier=Calendar.getInstance();
  int heures=calendrier.get(Calendar.HOUR_OF_DAY);
  int minutes=calendrier.get(Calendar.MINUTE);
  int secondes=calendrier.get(Calendar.SECOND);
   // saat, dakika ve saniye küresel değişkenlerdir
   // bu değişkenler HTML kodunda kullanılabilir
%>

<% // HTML kodu %>
<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>

Web sunucusu tarafından çalıştırıldığında, bu komut dosyası aşağıdaki sayfayı oluşturur:

Image

Testler

  • heure.jsp betiğini <tomcat>\jakarta-tomcat\webapps\examples\jsp (Tomcat 3.x) veya <tomcat>\webapps\examples\jsp (Tomcat 4.x) dizinine yerleştirin
  • Tomcat sunucusunu başlatın
  • URL dosyasını http://localhost:8080/examples/jsp/heure.jsp adresinden isteyin

2.5.6. Sonuç

Yukarıdaki örnekler şunu göstermiştir:

  • bir HTML sayfası bir program tarafından dinamik olarak oluşturulabilir. Web programlamanın tüm anlamı budur.
  • Kullanılan diller ve web sunucuları çeşitlilik gösterebilir. Şu anda aşağıdaki başlıca eğilimler gözlemlenmektedir:
    • Apache/PHP (Windows, Linux) ve IIS/PHP (Windows) ikilileri
    • Windows platformlarında, IIS sunucusunu bir .NET diliyle (C#, VB.NET, ...) birleştiren ASP.NET teknolojisi
    • farklı sunucularda (Tomcat, Apache, IIS) ve farklı platformlarda (Windows, Linux) çalışan Java servletleri ve JSP sayfaları teknolojisi. Bu belgede özellikle bu son teknoloji üzerinde durulacaktır.

2.6. Tarayıcı Tarafı Komut Dosyaları

Bir HTML sayfası, tarayıcı tarafından çalıştırılacak komut dosyaları içerebilir. Tarayıcı tarafında kullanılan birçok komut dosyası dili vardır. Bunlardan bazıları şunlardır:

Dil
Kullanılabilen tarayıcılar
Vbscript
IE
Javascript
IE, Netscape
PerlScript
IE
Java
IE, Netscape

Birkaç örnek verelim.

2.6.1. Tarayıcı tarafında bir VBScript komut dosyası içeren bir web sayfası

vbs1.html sayfası

<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>

Yukarıdaki HTML sayfası, sadece HTML kodunu değil, aynı zamanda bu sayfayı yükleyen tarayıcı tarafından çalıştırılmak üzere tasarlanmış bir programı da içerir. Kod şu şekildedir:

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

<script></script> etiketleri, HTML sayfasındaki komut dosyalarını sınırlandırmak için kullanılır. Bu komut dosyaları farklı dillerde yazılabilir ve kullanılan dili belirten, <script> etiketindeki language seçeneğidir. Burada bu seçenek VBScript'tir. Bu dili ayrıntılı olarak ele almayacağız. Yukarıdaki komut dosyası, bir mesaj görüntüleyen réagir adlı bir işlev tanımlar. Bu işlev ne zaman çağrılır? Bunu bize aşağıdaki HTML kod satırı gösterir:

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

onclick özniteliği, kullanıcı OK düğmesine tıkladığında çağrılacak fonksiyonun adını belirtir. Tarayıcı bu sayfayı yükledikten ve kullanıcı OK düğmesine tıkladığında, şu sayfa görüntülenir:

Image

Testler

Yalnızca IE tarayıcısı VBScript komut dosyalarını çalıştırabilir. Netscape'in bunu yapabilmesi için eklentilere ihtiyacı vardır. Aşağıdaki testler yapılabilir:

  • Apache sunucusu

  • <apache-DocumentRoot> içindeki vbs1.html komut dosyası

  • IE tarayıcısıyla http://localhost/vbs1.html adresine erişmek

  • PWS sunucusu

  • vbs1.html komut dosyası, <pws-DocumentRoot> içinde

  • IE tarayıcısıyla http://localhost/vbs1.html URL'sini çağırın

2.6.2. Tarayıcı tarafında bir JavaScript komut dosyası içeren bir web sayfası

Sayfa: 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>

Burada, önceki sayfayla aynı bir şey var; tek fark, VBScript dilinin yerine Javascript dilinin kullanılmış olmasıdır. Bu dilin avantajı, hem IE hem de Netscape tarayıcıları tarafından kabul edilmesidir. Bu kodun çalıştırılması aynı sonuçları verir:

Image

Testler

  • Apache sunucusu

  • js1.html komut dosyası, <apache-DocumentRoot> içinde

  • IE veya Netscape tarayıcısıyla http://localhost/js1.html URL'sini çağırma

  • PWS sunucusu

  • <pws-DocumentRoot> içindeki js1.html betiği

  • IE veya Netscape tarayıcısıyla http://localhost/js1.html URL'sini çağırın

2.7. İstemci-sunucu iletişimi

Bir web uygulamasının aktörlerini gösteren başlangıç şemamıza geri dönelim:

Burada, istemci makine ile sunucu makine arasındaki iletişimlere odaklanacağız. Bu iletişimler bir ağ üzerinden gerçekleşir ve iki uzak makine arasındaki iletişimin genel yapısını hatırlamakta fayda var.

2.7.1. OSI modeli

OSI (Açık Sistemler Arabağlantı Referans Modeli) olarak adlandırılan ve ISO (Uluslararası Standartlar Örgütü) tarafından tanımlanan açık ağ modeli, makineler arasındaki iletişimin yedi katmanlı bir modelle temsil edilebildiği ideal bir ağı tanımlar:

Her katman, alt katmandan hizmet alır ve üst katmana kendi hizmetlerini sunar. A ve B adlı farklı makinelerde bulunan iki uygulamanın birbiriyle iletişim kurmak istediğini varsayalım: bu iletişim, Application katmanında gerçekleşir. Ağın işleyişinin tüm ayrıntılarını bilmelerine gerek yoktur: her uygulama, iletmek istediği bilgiyi bir alt katmana, yani Présentation katmanına aktarır. Dolayısıyla uygulamanın, yalnızca Présentation katmanıyla arayüz oluşturma kurallarını bilmesi yeterlidir. Bilgi Présentation katmanına ulaştığında, başka kurallara göre Session katmanına aktarılır ve bu süreç, bilgi fiziksel ortama ulaşana ve hedef makineye fiziksel olarak iletilene kadar devam eder. Orada, gönderen makinede geçirdiği işlemin tersi bir işleme tabi tutulur.

Her katmanda, bilgiyi göndermekle görevli gönderen işlem, bilgiyi kendisiyle aynı katmana ait diğer makinedeki bir alıcı işleme gönderir. Bunu, katman protokolü olarak adlandırılan belirli kurallara göre yapar. Dolayısıyla, nihai iletişim şeması şu şekildedir:

Farklı katmanların rolleri şöyledir:

Physique
Fiziksel bir ortam üzerinden bitlerin iletilmesini sağlar. Bu katmanda, terminal veya bilgisayar gibi veri işleme uç ekipmanları (E.T.T.D.) ile modülatör/demodülatör, çoklayıcı, yoğunlaştırıcı gibi veri devre sonlandırma ekipmanları (E.T.C.D.) bulunur. Bu seviyede dikkat edilmesi gereken noktalar şunlardır:
. bilginin kodlama şeklinin seçimi (analog veya dijital)
. iletim modunun seçimi (senkron veya asenkron).
Liaison de données
Fiziksel katmanın fiziksel özelliklerini gizler. İletim hatalarını algılar ve düzeltir.
Réseau
Ağa gönderilen bilgilerin izlemesi gereken yolu yönetir. Buna routage denir: bir bilginin alıcısına ulaşması için izlemesi gereken yolu belirlemek.
Transport
Önceki katmanlar yalnızca makineler arası iletişime izin verirken, bu katman iki uygulama arasındaki iletişimi mümkün kılar. Bu katman tarafından sağlanan bir hizmet, çoklama olabilir: taşıma katmanı, birden fazla uygulamaya ait bilgileri iletmek için aynı ağ bağlantısını (makineden makineye) kullanabilir.
Session
Bu katmanda, bir uygulamanın uzak bir makinede bir çalışma oturumu açmasına ve sürdürmesine olanak tanıyan hizmetler bulunur.
Présentation
Bu katman, farklı makinelerdeki verilerin temsilini standartlaştırmayı amaçlar. Böylece, A makinesinden gelen veriler, ağa gönderilmeden önce A makinesinin Présentation katmanı tarafından standart bir biçime göre "düzenlenir". Veriler, alıcı makine B’nin Présentation katmanına ulaştığında, bu katman verileri standart formatları sayesinde tanıyacak ve makine B’deki uygulamanın tanıyabilmesi için veriler farklı bir şekilde biçimlendirilecektir.
Application
Bu aşamada, genellikle e-posta veya dosya aktarımı gibi kullanıcıya yakın uygulamalar bulunur.

2.7.2. TCP/IP modeli

OSI modeli ideal bir modeldir. TCP/IP protokol dizisi, aşağıdaki şekilde buna yakındır:

  • ağ arayüzü (bilgisayarın ağ kartı), OSI modelinin 1. ve 2. katmanlarının işlevlerini yerine getirir
  • IP katmanı (İnternet Protokolü), 3. katmanın (ağ) işlevlerini yerine getirir
  • TCP katmanı (Aktarım Kontrol Protokolü) veya UDP katmanı (Kullanıcı Datagram Protokolü), 4. katmanın (taşıma) işlevlerini yerine getirir. TCP protokolü, makineler arasında alışverişi yapılan veri paketlerinin hedeflerine güvenli bir şekilde ulaşmasını sağlar. Aksi takdirde, kaybolan paketleri geri gönderir. UDP protokolü bu işi yapmaz ve bu görevi uygulama geliştiricisi üstlenir. Bu nedenle, %100 güvenilir bir ağ olmayan internette en çok kullanılan protokol TCP'tir. Bu durumda TCP-IP ağından söz edilir.
  • Uygulama katmanı, OSI modelinin 5. ila 7. katmanlarının işlevlerini kapsar.

Web uygulamaları Application katmanında yer alır ve bu nedenle TCP-IP protokollerine dayanır. İstemci ve sunucu makinelerinin Application katmanları, hedeflerine iletilmek üzere modelin 1. ila 4. katmanlarına devredilen mesajları birbirleriyle paylaşır. Anlaşabilmeleri için, her iki makinenin uygulama katmanlarının aynı dili veya protokolü "konuşması" gerekir. Web uygulamalarının kullandığı protokol HTTP (HyperText Aktarım Protokolü) olarak adlandırılır. Bu, metin tabanlı bir protokoldür; makineler birbirlerini anlamak için ağ üzerinden metin satırları alışverişinde bulunurlar. Bu iletişim standartlaştırılmıştır; yani istemcinin sunucuya tam olarak ne istediğini belirtmek için belirli sayıda mesajı vardır ve sunucunun da istemciye yanıtını vermek için belirli sayıda mesajı vardır. Bu mesaj alışverişi şu şekildedir:

İstemci --> Sunucu

İstemci, web sunucusuna istekte bulunduğunda,

  1. ne istediğini belirtmek için HTTP biçiminde metin satırları
  2. isteklerini belirtmek için boş bir satır
  3. isteğe bağlı olarak bir belge

Sunucu --> İstemci

Sunucu, istemciye yanıt verirken

  1. ne gönderdiğini belirtmek için HTTP biçiminde metin satırları
  2. boş bir satır
  3. isteğe bağlı olarak bir belge

Dolayısıyla, veri alışverişi her iki yönde de aynı biçime sahiptir. Her iki durumda da bir belge gönderilebilir; ancak bir istemcinin sunucuya belge göndermesi nadirdir. Ancak HTTP protokolü bunu öngörmektedir. Bu sayede, örneğin bir internet servis sağlayıcısının aboneleri, bu sağlayıcıda barındırılan kişisel sitelerine çeşitli belgeleri indirebilirler. Alışverişi yapılan belgeler herhangi bir türde olabilir. Resimler içeren bir web sayfasını talep eden bir tarayıcıyı ele alalım:

  1. tarayıcı web sunucusuna bağlanır ve istediği sayfayı talep eder. Talep edilen kaynaklar, URL (Uniform Resource Locator) ile benzersiz bir şekilde tanımlanır. Tarayıcı yalnızca HTTP başlıkları gönderir, belge göndermez.
  2. Sunucu buna yanıt verir. Öncelikle, hangi tür yanıt göndereceğini belirten HTTP başlıklarını gönderir. İstenen sayfa mevcut değilse bu bir hata olabilir. Sayfa mevcutsa, sunucu yanıtının HTTP başlıklarında, bu başlıkların ardından bir HTML (HyperText İşaretleme Dili) belgesi göndereceğini belirtir. Bu belge, HTML biçiminde bir dizi metin satırından oluşur. Bir HTML metni, tarayıcıya metni nasıl görüntüleyeceği konusunda talimatlar veren etiketler (işaretleyiciler) içerir.
  3. İstemci, sunucunun HTTP başlıklarından, bir HTML belgesi alacağını anlar. Müşteri bu belgeyi analiz eder ve belki de içinde resim referansları olduğunu fark eder. Bu resimler HTML belgesinde bulunmamaktadır. Bu nedenle, ihtiyaç duyduğu ilk resmi istemek üzere aynı web sunucusuna yeni bir istek gönderir. Bu istek, istenen kaynak farklı olması dışında 1. adımda yapılan istekle aynıdır. Sunucu, bu isteği işleyerek müşteriye istenen görüntüyü gönderir. Bu sefer, yanıtındaki HTTP başlıkları, gönderilen belgenin bir görüntü olduğunu ve HTML belgesi olmadığını belirtecektir.
  4. İstemci, gönderilen görüntüyü alır. İstemci (genellikle bir tarayıcı), sayfanın tamamını görüntüleyebilmesi için gerekli tüm belgelere sahip olana kadar 3. ve 4. adımlar tekrarlanır.

2.7.3. HTTP protokolü

Örnekler üzerinden HTTP protokolünü inceleyelim. Bir tarayıcı ile bir web sunucusu arasında ne tür veriler alışverişi yapılır?

2.7.3.1. Bir HTTP sunucusunun yanıtı

Burada bir web sunucusunun istemcilerin isteklerine nasıl yanıt verdiğini inceleyeceğiz. Web hizmeti veya HTTP hizmeti, genellikle 80 numaralı bağlantı noktasında çalışan bir TCP-IP hizmetidir. Başka bir bağlantı noktasında da çalışabilir. Bu durumda, istemci tarayıcısı, gönderdiği URL isteğinde bu bağlantı noktasını belirtmek zorunda kalır. Bir URL isteği genel olarak şu şekildedir:

protokol://[:port] makinesi/yol/bilgi

burada

protokol
web hizmeti için http'dir. Bir tarayıcı, ftp, news, telnet gibi hizmetler için de istemci olarak kullanılabilir.
makine
web hizmetinin çalıştığı makinenin adı
bağlantı noktası
web hizmetinin bağlantı noktası. 80 ise, bağlantı noktası numarası atlanabilir. Bu en yaygın durumdur
yol
istenen kaynağa giden yol
bilgiler
istemcinin isteğini netleştirmek için sunucuya verilen ek bilgiler

Bir kullanıcı URL dosyasının yüklenmesini istediğinde tarayıcı ne yapar?

  1. URL dosyasının machine[:port] bölümünde belirtilen makine ve bağlantı noktasıyla TCP-IP iletişim kanalı açar. Bir TCP-IP bağlantısı açmak, iki makine arasında bir iletişim "kanalı" oluşturmak anlamına gelir. Bu kanal oluşturulduktan sonra, iki makine arasında alışverişi yapılan tüm bilgiler bu kanal üzerinden aktarılır. Bu TCP-IP kanalının oluşturulması, henüz HTTP web protokolünü gerektirmez.
  2. TCP-IP kanalı oluşturulduktan sonra, istemci web sunucusuna isteğini iletecek ve bunu HTTP biçiminde metin satırları (komutlar) göndererek yapacaktır. İstemci, URL'in yol/bilgi kısmını sunucuya gönderecektir
  3. sunucu da aynı şekilde ve aynı kanaldan yanıt verecektir
  4. İki taraftan biri kanalı kapatma kararını verecektir. Bu, kullanılan HTTP protokolüne bağlıdır. HTTP 1.0 protokolünde, sunucu her yanıtından sonra bağlantıyı kapatır. Bu durum, bir web sayfasını oluşturan farklı belgeleri almak için birden fazla istek göndermesi gereken bir istemcinin, her istek için yeni bir bağlantı açmasını gerektirir; bu da bir maliyet oluşturur. HTTP/1.1 protokolünde ise istemci, sunucuya bağlantıyı kendisi kapatmasını söyleyene kadar açık tutmasını isteyebilir. Böylece, bir web sayfasındaki tüm belgeleri tek bir bağlantı ile alabilir ve son belgeyi aldıktan sonra bağlantıyı kendisi kapatabilir. Sunucu bu kapatma işlemini algılayacak ve bağlantıyı kendisi de kapatacaktır.

Bir istemci ile web sunucusu arasındaki veri alışverişini incelemek için, genel amaçlı bir TCP istemcisi kullanacağız. Bu program, HTTP protokolünde olduğu gibi metin satırlarına dayalı bir iletişim protokolüne sahip herhangi bir hizmetin istemcisi olarak kullanılabilir. Bu metin satırları kullanıcı tarafından klavye üzerinden girilecektir. Bunun için kullanıcının, erişmek istediği hizmetin iletişim protokolünü bilmesi gerekir. Sunucunun yanıtı daha sonra ekranda görüntülenir. Program Java ile yazılmıştır ve ekte yer almaktadır. Burada Windows ortamında bir DOS penceresinde kullanıyoruz ve şu şekilde çalıştırıyoruz:

java clientTCPgenerique machine port

ile

machine
bağlanılacak hizmetin çalıştığı makinenin adı
port
hizmetin sunulduğu bağlantı noktası

Bu iki bilgiyle program, belirtilen makine ve bağlantı noktası üzerinden TCP-IP bağlantısını açacaktır. Bu bağlantı, istemci ile web sunucusu arasında metin satırlarının alışverişi için kullanılacaktır. İstemciden gelen satırlar, kullanıcı tarafından klavyeyle yazılır ve sunucuya gönderilir. Sunucu tarafından yanıt olarak geri gönderilen metin satırları ekranda görüntülenir. Böylece, klavyeyi kullanan kullanıcı ile web sunucusu arasında doğrudan bir diyalog kurulabilir. Daha önce sunulan örnekler üzerinde bunu deneyelim. Aşağıdaki statik HTML sayfasını oluşturmuştuk:

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

ve bunu bir tarayıcıda görüntülediğimizde:

Image

Görüldüğü gibi, istenen URL şudur: http://localhost:81/essais/essai1.html. Dolayısıyla web servisinin sunucusu localhost (=yerel sunucu) ve bağlantı noktası 81'dir. Bu web sayfasındaki HTML metnini görüntülemek istersek (Görünüm/Kaynak), başlangıçta oluşturulan HTML metnini buluruz:

Image

Şimdi, aynı URL metnini istemek için genel amaçlı TCP istemcimizi kullanalım:


Dos>java clientTCPgenerique localhost 81

Commandes :
GET /essais/essai1.html HTTP/1.0

<-- HTTP/1.1 200 OK
<-- Date: Mon, 08 Jul 2002 08:07:46 GMT
<-- Server: Apache/1.3.24 (Win32) PHP/4.2.0
<-- Last-Modified: Mon, 08 Jul 2002 08:00:30 GMT
<-- ETag: "0-a1-3d29469e"
<-- Accept-Ranges: bytes
<-- Content-Length: 161
<-- Connection: close
<-- Content-Type: text/html
<--
<-- <html>
<--   <head>
<--     <title>essai 1 : une page statique</title>
<--    </head>
<--    <body>
<--      <center>
<--      <h1>Une page statique...</h1>
<--    </body>
<-- </html>

java clientTCPgenerique localhost 81 komutuyla istemci başlatıldığında, program ile aynı makinede (localhost) ve 81 numaralı bağlantı noktasında çalışan web sunucusu arasında bir bağlantı kuruldu. HTTP biçimindeki istemci-sunucu iletişimi başlayabilir. Bu iletişimin üç bileşeni olduğunu hatırlatmak isteriz:

  1. HTTP başlıkları
  2. boş satır
  3. isteğe bağlı veriler

Örneğimizde, istemci yalnızca bir istek gönderir:

GET /essais/essai1.html HTTP/1.0

Bu satır üç bileşenden oluşur:

GET
HTTP komutu, bir kaynağı talep eder. Başka komutlar da vardır:
HEAD, bir kaynağı ister ancak bunu sunucunun yanıtındaki HTTP başlıklarıyla sınırlar. Kaynağın kendisi gönderilmez.
PUT, istemcinin sunucuya bir belge göndermesini sağlar
/essais/essai1.html
istenen kaynak
HTTP/1.0
Kullanılan HTTP protokol seviyesi. Burada 1.0. Bu, sunucunun yanıtını gönderir göndermez bağlantıyı kapatacağı anlamına gelir

HTTP başlıklarının ardından her zaman boş bir satır gelmelidir. Müşteri burada bunu yapmıştır. Müşteri veya sunucu, alışverişin HTTP kısmının bittiğini bu şekilde anlar. Burada istemci için işlem tamamlanmıştır. Gönderecek bir belgesi yoktur. Ardından, örneğimizde <-- işaretiyle başlayan tüm satırlardan oluşan sunucu yanıtı başlar. Önce bir dizi HTTP başlığı gönderir ve ardından bir boş satır gelir:

<-- HTTP/1.1 200 OK
<-- Date: Mon, 08 Jul 2002 08:07:46 GMT
<-- Server: Apache/1.3.24 (Win32) PHP/4.2.0
<-- Last-Modified: Mon, 08 Jul 2002 08:00:30 GMT
<-- ETag: "0-a1-3d29469e"
<-- Accept-Ranges: bytes
<-- Content-Length: 161
<-- Connection: close
<-- Content-Type: text/html
<--
HTTP/1.1 200 OK
sunucu şunu söylüyor
  • HTTP protokolünün 1.1 sürümünü desteklediğini
  • istenen kaynağa sahip olduğunu (kod 200, mesaj OK)
Date: ...
yanıtın tarihi/saati
Server: 
sunucunun kimliği. Burada bir Apache sunucusu söz konusudur
Last-Modified:
istemci tarafından talep edilen kaynağın son değiştirilme tarihi
ETag:
...
Accept-Ranges: bytes
Gönderilen verilerin ölçü birimi. Burada bayt (byte)
Content-Length: 161
HTTP başlıklarından sonra gönderilecek belgenin bayt sayısı. Bu sayı aslında essai1.html dosyasının bayt cinsinden boyutudur:
E:\data\serge\web\essais>dir essai1.html

08/07/2002  10:00                  161 essai1.html
Connection: close
sunucu, belge gönderildikten sonra bağlantıyı keseceğini söylüyor
Content-type: text/html
sunucu, HTML (html) biçiminde metin (text) göndereceğini bildiriyor.

İstemci bu başlıkları alır ve artık bir HTML belgesini temsil eden 161 bayt alacağını bilir. Sunucu, başlıkların sonunu belirten boş satırın hemen ardından bu 161 baytı gönderir:

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

Burada, başlangıçta oluşturulan HTML dosyasını görüyoruz. İstemcimiz bir tarayıcı olsaydı, bu metin satırlarını aldıktan sonra bunları yorumlayarak klavyeyi kullanan kullanıcıya aşağıdaki sayfayı gösterirdi:

Image

Aynı kaynağı istemek için genel amaçlı TCP istemcimizi bir kez daha kullanalım, ancak bu sefer yalnızca yanıt başlıklarını isteyen HEAD komutunu kullanarak:


Dos>java.bat clientTCPgenerique localhost 81
Commandes :
HEAD /essais/essai1.html HTTP/1.1
Host: localhost:81

<-- HTTP/1.1 200 OK
<-- Date: Mon, 08 Jul 2002 09:07:25 GMT
<-- Server: Apache/1.3.24 (Win32) PHP/4.2.0
<-- Last-Modified: Mon, 08 Jul 2002 08:00:30 GMT
<-- ETag: "0-a1-3d29469e"
<-- Accept-Ranges: bytes
<-- Content-Length: 161
<-- Content-Type: text/html
<--

HTML belgesi olmadan da önceki ile aynı sonucu elde ediyoruz. Müşterinin HEAD talebinde, HTTP protokolünün 1.1 sürümünü kullandığını belirttiğini not edelim. Bu durum, müşterinin sorgulamak istediği machine:port çiftini belirten ikinci bir HTTP başlığı göndermesini gerektirir: Host: localhost:81.

Şimdi hem bir tarayıcı hem de genel amaçlı TCP istemcisiyle bir resim isteyelim. Öncelikle bir tarayıcıyla:

Image

univ01.gif dosyası 3167 bayt büyüklüğündedir:

E:\data\serge\web\images>dir univ01.gif
14/04/2000  13:37                3 167 univ01.gif

Şimdi genel amaçlı TCP istemcisini kullanalım:


E:\data\serge\JAVA\SOCKETS\client générique>java clientTCPgenerique localhost 81
Commandes :
HEAD /images/univ01.gif HTTP/1.1
host: localhost:81

<-- HTTP/1.1 200 OK
<-- Date: Tue, 09 Jul 2002 13:53:24 GMT
<-- Server: Apache/1.3.24 (Win32) PHP/4.2.0
<-- Last-Modified: Fri, 14 Apr 2000 11:37:42 GMT
<-- ETag: "0-c5f-38f70306"
<-- Accept-Ranges: bytes
<-- Content-Length: 3167
<-- Content-Type: image/gif
<--

Sunucunun yanıtında aşağıdaki noktalara dikkat edilmelidir:

HEAD
  • Kaynağın yalnızca HTTP başlıklarını istiyoruz. Zira bir resim, metin dosyası değil ikili bir dosyadır ve ekranda metin olarak görüntülenmesi okunabilir bir sonuç vermez.
Content-Length: 3167
  • bu, univ01.gif dosyasının boyutudur
Content-Type: image/gif
  • sunucu, istemcisine image/gif, c.a.d türünde bir belge göndereceğini bildirir. GIF formatında bir resim. Eğer resim JPEG formatında olsaydı, belge türü image/jpeg olurdu. Belge türleri standartlaştırılmıştır ve MIME (Multi-purpose Mail Internet Extension) türleri olarak adlandırılır.

2.7.3.2. Bir HTTP istemcisinin isteği

Şimdi şu soruyu soralım: Bir web sunucusuyla “iletişim kuran” bir program yazmak istiyorsak, belirli bir kaynağı elde etmek için programın web sunucusuna hangi komutları göndermesi gerekir? Önceki örneklerde bu sorunun cevabının bir kısmını bulduk. Üç komutla karşılaştık:

GET ressource protocole
  • belirli bir QZXW2HTML protokol sürümüne göre belirli bir kaynağı istemek için. Sunucu, HTTP biçiminde bir yanıt gönderir; bunu bir boş satır ve ardından istenen kaynak izler
HEAD ressource protocole
  • aynı şekilde, ancak burada yanıt sadece HTTP başlıklarıyla ve boş satırla sınırlıdır
host: machine:port
  • sorgulanan web sunucusunun makinesini ve bağlantı noktasını belirtmek için (HTTP 1.1 protokolü)

Başka komutlar da mevcuttur. Bunları keşfetmek için şimdi genel bir TCP sunucusu kullanacağız. Bu, Java ile yazılmış bir programdır ve onu da ekte bulabilirsiniz. Şu komutla çalıştırılır: java serveurTCPgenerique portEcoute; burada portEcoute, istemcilerin bağlanması gereken bağlantı noktasıdır. serveurTCPgenerique programı

  • müşteriler tarafından gönderilen komutları ekrana yansıtır
  • onlara yanıt olarak bir kullanıcının klavyeden girdiği metin satırlarını gönderir. Dolayısıyla sunucu rolünü üstlenen bu kullanıcıdır. Örneğimizde, klavyeyi kullanan kullanıcı bir web hizmeti rolünü üstlenecektir.

Şimdi, genel sunucumuzu 88 numaralı bağlantı noktasında çalıştırarak bir web sunucusunu simüle edelim:


Dos> java serveurTCPgenerique 88
Serveur générique lancé sur le port 88

Şimdi bir tarayıcı açalım ve URL adresindeki http://localhost:88/exemple.html sayfasını isteyelim. Tarayıcı, localhost makinesinin 88 bağlantı noktasına bağlanacak ve ardından /exemple.html sayfasını isteyecektir:

Image

Şimdi, istemcinin sunucuya gönderdiği verileri gösteren sunucu penceremize bakalım (basitlik amacıyla, serveurTCPgenerique programının çalışmasına özgü bazı satırlar atlanmıştır):


Dos>java serveurTCPgenerique 88
Serveur générique lancé sur le port 88
...
<-- GET /exemple.html HTTP/1.1
<-- Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, */*
<-- Accept-Language: fr
<-- Accept-Encoding: gzip, deflate
<-- User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705; .NET CLR 1.0.2 914)
<-- Host: localhost:88
<-- Connection: Keep-Alive
<--

<-- işaretiyle başlayan satırlar, istemci tarafından gönderilen satırlardır. Böylece, daha önce karşılaşmadığımız HTTP başlıklarını görüyoruz:

Accept:
  • tarayıcının işleyebildiği belge türlerinin listesi MIME.
Accept-language:
  • belgeler için tercih edilen kabul edilen dil.
Accept-Encoding:
  • Tarayıcının işleyebildiği belgelerin kodlama türü
User-Agent:
  • istemcinin kimliği
Connection:
  • Close: Sunucu, yanıtını verdikten sonra bağlantıyı kapatacaktır
  • Keep-Alive: Sunucudan yanıt alındıktan sonra bağlantı açık kalacaktır. Bu, tarayıcının sayfayı oluşturmak için gerekli diğer belgeleri, yeni bir bağlantı kurmaya gerek kalmadan isteyebilmesini sağlayacaktır.

Tarayıcı tarafından gönderilen HTTP başlıkları, beklendiği gibi boş bir satırla sona erer.

Müşterimize bir yanıt hazırlayalım. Burada klavyeyi kullanan kullanıcı asıl sunucudur ve yanıtı elle hazırlayabilir. Önceki örnekte bir web sunucusu tarafından verilen yanıtı hatırlayalım:

<-- HTTP/1.1 200 OK
<-- Date: Mon, 08 Jul 2002 08:07:46 GMT
<-- Server: Apache/1.3.24 (Win32) PHP/4.2.0
<-- Last-Modified: Mon, 08 Jul 2002 08:00:30 GMT
<-- ETag: "0-a1-3d29469e"
<-- Accept-Ranges: bytes
<-- Content-Length: 161
<-- Connection: close
<-- Content-Type: text/html
<--
<-- <html>
<--   <head>
<--     <title>essai 1 : une page statique</title>
<--    </head>
<--    <body>
<--      <center>
<--      <h1>Une page statique...</h1>
<--    </body>
<-- </html>

Benzer bir yanıtı elle (klavyeyle) oluşturmaya çalışalım. --> : ile başlayan satırlar müşteriye gönderilir:

...
<-- Host: localhost:88
<-- Connection: Keep-Alive
<--
--> : HTTP/1.1 200 OK
--> : Server: serveur tcp generique
--> : Connection: close
--> : Content-Type: text/html
--> :
--> : <html>
--> :   <head><title>Serveur generique</title></head>
--> :   <body>
--> :     <center>
--> :       <h2>Reponse du serveur generique</h2>
--> :     </center>
--> :    </body>
--> : </html>
fin

fin komutu, serveurTCPgenerique programının çalışmasına özgüdür. Bu komut, programın yürütülmesini durdurur ve sunucu ile istemci arasındaki bağlantıyı sonlandırır. Yanıtımızda aşağıdaki HTTP başlıklarıyla sınırlı kaldık:

HTTP/1.1 200 OK
--> : Server: serveur tcp generique
--> : Connection: close
--> : Content-Type: text/html
--> :

Göndereceğimiz dosyanın boyutunu (Content-Length) belirtmiyoruz, ancak dosyayı gönderdikten sonra bağlantıyı kapatacağımızı (Connection: close) söylüyoruz. Bu, tarayıcı için yeterlidir. Bağlantının kapandığını görünce, tarayıcı sunucudan gelen yanıtın tamamlandığını anlayacak ve kendisine gönderilen HTML sayfasını görüntüleyecektir. Bu sayfa şöyledir:

--> : <html>
--> :   <head><title>Serveur generique</title></head>
--> :   <body>
--> :     <center>
--> :       <h2>Reponse du serveur generique</h2>
--> :     </center>
--> :    </body>
--> : </html>

Tarayıcı daha sonra şu sayfayı görüntüler:

Image

Yukarıdaki örnekte, tarayıcının ne aldığını görmek için View/Source komutunu çalıştırırsak şu sonucu elde ederiz:

Image

yani genel sunucudan gönderdiğimizin aynısı.

2.8. HTML dili

Bir web tarayıcısı çeşitli belgeleri görüntüleyebilir; en yaygın olanı HTML (HyperText İşaretleme Dili) belgesidir. Bu, <balise>texte</balise> biçimindeki etiketlerle biçimlendirilmiş bir metindir. Örneğin, <B>important</B> etiketi, önemli metni kalın olarak görüntüler. Yalnızca bir satır görüntüleyen <hr> etiketi gibi tek başına kullanılan etiketler de mevcuttur. HTML metninde bulunabilecek etiketleri burada tek tek ele almayacağız. Tek bir satır HTML kodu yazmadan bir web sayfası oluşturmaya olanak tanıyan çok sayıda WYSIWYG yazılımı mevcuttur. Bu araçlar, fare ve önceden tanımlanmış denetimler kullanılarak yapılan bir sayfa düzeninin HTML kodunu otomatik olarak oluşturur. Böylece sayfaya (fareyle) bir tablo ekleyebilir ve ardından yazılım tarafından oluşturulan HTML koduna bakarak bir web sayfasında tablo tanımlamak için kullanılacak etiketleri öğrenebilirsiniz. İşin sırrı bundan ibarettir. Ayrıca, dinamik web uygulamalarının web istemcilerine gönderilecek HTML kodunu kendileri oluşturması gerektiğinden, HTML dilini bilmek zorunludur. Bu kod program tarafından oluşturulur ve elbette, istemcinin istediği web sayfasını alabilmesi için neyin oluşturulması gerektiğini bilmek gerekir.

Özetle, web programlamaya başlamak için HTML dilini tamamen bilmek gerekmez. Ancak bu bilgi gereklidir ve Word, FrontPage, DreamWeaver ve onlarca diğer web sayfası oluşturma yazılımı kullanılarak edinilebilir. HTML dilinin inceliklerini keşfetmenin bir başka yolu da, internette gezinerek ilginç ve sizin için henüz bilinmeyen özellikler barındıran sayfaların kaynak kodlarını incelemektir.

2.8.1. Bir örnek

Internet Explorer ile birlikte gelen ücretsiz bir araç olan FrontPage Express ile oluşturulan aşağıdaki örneği ele alalım. Burada Frontpage tarafından oluşturulan kod sadeleştirilmiştir. Bu örnek, bir web belgesinde bulunabilecek bazı öğeleri göstermektedir; örneğin:

  • bir tablo
  • bir resim
  • bir bağlantı

Image

Bir HTML belgesi genel olarak şu şekildedir:

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

Belgenin tamamı <html>...</html> etiketleri ile çevrelenmiştir. Belge iki bölümden oluşur:

  1. <head>...</head>: Bu, belgenin görüntülenmeyen kısmıdır. Bu kısım, belgeyi görüntüleyecek tarayıcıya bilgi sağlar. Burada genellikle, tarayıcının başlık çubuğunda görüntülenecek metni belirleyen <title>...</title> etiketleri bulunur. Ayrıca, belgenin anahtar kelimelerini tanımlayan ve daha sonra arama motorları tarafından kullanılan diğer etiketler de bulunabilir. Bu bölümde, çoğunlukla javascript veya vbscript ile yazılmış ve tarayıcı tarafından çalıştırılacak komut dosyaları da bulunabilir.
  2. <body öznitelikleri>...</body>: Bu, tarayıcı tarafından görüntülenecek kısımdır. Bu kısımda yer alan etiketler, tarayıcıya belgenin "istenen" görsel biçimini belirtir. Her tarayıcı bu etiketleri kendine özgü bir şekilde yorumlar. Bu nedenle, iki farklı tarayıcı aynı web belgesini farklı şekilde görüntüleyebilir. Bu durum genellikle web tasarımcıları için bir baş ağrısıdır.

Örnek belgemizin HTML kodu şöyledir:

<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>

Kodda sadece bizi ilgilendiren noktalar vurgulanmıştır:

Etiket
etiketler ve örnekler HTML
titre du document
<title>balises</title>
balises, belgeyi görüntüleyen tarayıcının başlık çubuğunda görünecektir
barre horizontale
<hr>: yatay bir çizgi görüntüler
tableau
<table öznitelikleri>....</table>: tabloyu tanımlamak için
<tr öznitelikler>...</tr> : bir satır tanımlamak için
<td öznitelikler>...</td> : bir hücre tanımlamak için
örnekler:
<table border="1">...</table> : border özniteliği, tablonun kenarlığının kalınlığını belirler
<td valign="middle" align="center" width="150">hücre(1,2)</td> : içeriği hücre(1,2) olacak bir hücre tanımlar. Bu içerik dikey olarak (valign="middle") ve yatay olarak (align="center") ortalanır. Hücrenin genişliği 150 piksel olacaktır (width="150")
image
<img border="0" src="/images/univ01.gif" width="80" height="95"> : kenarlığı olmayan (border="0"), yüksekliği 95 piksel (height="95"), genişliği 80 piksel (width="80") olan ve kaynak dosyası web sunucusunda /images/univ01.gif adresinde bulunan (src="/images/univ01.gif") bir resim tanımlar. Bu bağlantı, URL http://localhost:81/html/balises.htm ile elde edilen bir web belgesinde yer almaktadır. Ayrıca, tarayıcı burada referans verilen görüntüyü almak için http://localhost:81/images/univ01.gif adresindeki URL dosyasını isteyecektir.
lien
<a href="http://istia.univ-angers.fr">burada</a>: ici metninin URL http://istia.univ-angers.fr adresine bir bağlantı olarak işlev görmesini sağlar.
fond de page
<body background="/images/standard.jpg"> : sayfa arka planı olarak kullanılacak resmin, web sunucusundaki /images/standard.jpg adresinde bulunduğunu belirtir. Örneğimizde, tarayıcı bu arka plan resmini almak için http://localhost:81/images/standard.jpg adresindeki URL dosyasını isteyecektir.

Bu basit örnekte görüldüğü gibi, belgenin tamamını oluşturmak için tarayıcının sunucuya üç istek göndermesi gerekir:

  1. http://localhost:81/html/balises.htm adresine, belgenin HTML kaynağını almak için
  2. http://localhost:81/images/univ01.gif adresinden univ01.gif resmini almak için
  3. http://localhost:81/images/standard.jpg, standard.jpg arka plan görüntüsünü almak için

Aşağıdaki örnek, yine FrontPage ile oluşturulmuş bir web formunu göstermektedir.

Image

FrontPage tarafından oluşturulan ve biraz sadeleştirilmiş HTML kodu şöyledir:

<html>

  <head>
      <title>balises</title>
    <script language="JavaScript">
        function effacer(){
          alert("Vous avez cliqué sur le bouton Effacer");
      }//sil
        </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 etiketiyle görsel kontrol eşleşmesi şu şekildedir:

Denetim
HTML etiketi
formulaire
<form method="POST" >
champ de saisie
<input type="text" name="txtSaisie" size="20" value="birkaç kelime">
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">
satır1
satır2
satır3
</textarea>
boutons radio
<input type="radio" value="Evet" name="R1">Evet
<input type="radio" name="R1" value="hayır" checked>Hayır
cases à cocher
<input type="checkbox" name="C1" value="bir">1
<input type="checkbox" name="C2" value="iki" checked>2
<input type="checkbox" name="C3" value="üç">3
Combo
<select size="1" name="cmbValeurs">
<option>seçenek1</option>
<option selected>seçenek2</option>
<option>seçenek3</option>
</select>
liste à sélection unique
<select size="3" name="lst1">
<option selected>liste1</option>
<option>liste2</option>
<option>liste3</option>
<option>liste4</option>
<option>liste5</option>
</select>
liste à sélection multiple
<select size="3" name="lst2" multiple>
<option>liste1</option>
<option>liste2</option>
<option selected>liste3</option>
<option>liste4</option>
<option>liste5</option>
</select>
bouton de type submit
<input type="submit" value="Gönder" name="cmdRenvoyer">
bouton de type reset
<input type="reset" value="Sıfırla" name="cmdRétablir">
bouton de type button
<input type="button" value="Sil" name="cmdEffacer" onclick="effacer()">

Bu farklı denetimleri tek tek inceleyelim.

2.8.1.1. Form

formulaire
<form method="POST" >
balise HTML
<form name="..." method="..." action="...">...</form>
attributs
name="frmexemple": formun adı
method="..." : tarayıcının, formda toplanan değerleri web sunucusuna göndermek için kullandığı yöntem
action="..." : Formda toplanan değerlerin gönderileceği adres.
Bir web formu, <form>...</form> etiketleriyle çevrelenir. Formun bir adı olabilir (name="xx"). Formda bulunan tüm denetimler için durum böyledir. Bu ad, web belgesinde form öğelerine başvurması gereken komut dosyaları varsa yararlıdır. Bir formun amacı, kullanıcının klavye/fare ile girdiği bilgileri toplamak ve bunları bir web sunucusundaki URL adresine göndermektir. Hangi adrese? action="URL" özniteliğinde belirtilen adrese. Bu öznitelik yoksa, bilgiler formun bulunduğu belgenin sunucusuna gönderilir. Yukarıdaki örnekte durum budur. Şimdiye kadar, web istemcisini her zaman bir web sunucusundan bilgi “isteyen” bir varlık olarak gördük, asla ona bilgi “veren” bir varlık olarak değil. Bir web istemcisi, web sunucusuna (formda bulunan) bilgileri nasıl verir? Buna biraz ileride ayrıntılı olarak değineceğiz. POST ve GET adlı iki farklı yöntem kullanabilir. method="méthode" özniteliği, yöntemi GET veya POST olan <form> etiketindeki bu öznitelik, tarayıcıya, formda toplanan bilgileri action="URL" özniteliğiyle belirtilen URL adresine göndermek için hangi yöntemi kullanması gerektiğini bildirir. method özniteliği belirtilmediğinde, varsayılan olarak GET yöntemi kullanılır.

2.8.1.2. Giriş alanı

Image

Image

champ de saisie
<input type="text" name="txtSaisie" size="20" value="birkaç kelime">
<input type="password" name="txtMdp" size="20" value="unMotDePasse">
balise HTML
<input type="..." name="..." size=".." value="..">
input etiketi çeşitli denetimler için mevcuttur. Bu farklı denetimleri birbirinden ayıran şey type özniteliğidir.
attributs
type="text": bunun bir giriş alanı olduğunu belirtir
type="password": giriş alanındaki karakterler * karakterleriyle değiştirilir. Normal giriş alanından tek farkı budur. Bu kontrol türü, şifre girişi için uygundur.
size="20": alanda görünen karakter sayısı - daha fazla karakter girilmesini engellemez
name="txtSaisie" : kontrolün adı
value="birkaç kelime" : giriş alanında görüntülenecek metin.

2.8.1.3. Çok satırlı giriş alanı

Image

champ de saisie multilignes
<textarea rows="2" name="areaSaisie" cols="20">
ligne1
ligne2
ligne3
</textarea>
balise HTML
<textarea ...>metin</textarea>
içinde başlangıçta metin bulunan çok satırlı bir giriş alanı görüntüler
attributs
rows="2": satır sayısı
cols="'20" : sütun sayısı
name="areaSaisie": denetimin adı

2.8.1.4. Radyo düğmeleri

Image

boutons radio
<input type="radio" value="Evet" name="R1">Evet
<input type="radio" name="R1" value="hayır" checked>Hayır
balise HTML
<input type="radio" attribut2="valeur2" ....>metin
yanında metin bulunan bir radyo düğmesi görüntüler.
attributs
name="radio": kontrolün adı. Aynı adı taşıyan radyo düğmeleri, birbirini dışlayan bir düğme grubu oluşturur: bunlardan yalnızca biri seçilebilir.
value="değer" : radyo düğmesine atanan değer. Bu değer, radyo düğmesinin yanında görüntülenen metinle karıştırılmamalıdır. Metin yalnızca görüntüleme amaçlıdır.
checked: Bu anahtar kelime varsa, radyo düğmesi işaretlenir; yoksa işaretlenmez.

2.8.1.5. Onay kutuları

cases à cocher
<input type="checkbox" name="C1" value="bir">1
<input type="checkbox" name="C2" value="iki" checked>2
<input type="checkbox" name="C3" value="üç">3

Image

balise HTML
<input type="checkbox" attribut2="valeur2" ....>metin
yanında metin bulunan bir onay kutusu görüntüler.
attributs
name="C1": denetimin adı. Onay kutuları aynı adı taşıyabilir veya taşımayabilir. Aynı adı taşıyan onay kutuları, birbiriyle ilişkili bir grup oluşturur.
value="değer" : onay kutusuna atanan değer. Bu değer, radyo düğmesinin yanında görüntülenen metinle karıştırılmamalıdır. Metin yalnızca görüntüleme amaçlıdır.
checked: Bu anahtar kelime varsa, radyo düğmesi işaretlenir; yoksa işaretlenmez.

2.8.1.6. Açılır liste (combo)

Combo
<select size="1" name="cmbValeurs">
<option>choix1</option>
<option selected>seçim2</option>
<option>choix3</option>
</select>

Image

balise HTML
<select size=".." name="..">
<option [selected]>...</option>
...
</select>
<option>...</option> etiketleri arasında yer alan metinleri bir liste halinde görüntüler
attributs
name="cmbValeurs" : kontrolün adı.
size="1": görünür liste öğelerinin sayısı. size="1", listeyi bir açılır listeyle eşdeğer hale getirir.
selected: Bir liste öğesi için bu anahtar kelime varsa, söz konusu öğe listede seçili olarak görünür. Yukarıdaki örneğimizde, choix2 liste öğesi, kombo kutusu ilk kez görüntülendiğinde seçili öğe olarak görünür.

2.8.1.7. Tek seçimli liste

liste à sélection unique
<select size="3" name="lst1">
<option selected>liste1</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> etiketleri arasındaki metinleri bir listede görüntüler
attributs
etiketleri arasında yer alan metinleri bir liste halinde görüntüler; bu, yalnızca bir öğe görüntüleyen açılır listeyle aynıdır. Bu denetim, önceki açılır listeden yalnızca size>1 özniteliği ile ayrılır.

2.8.1.8. Çoklu seçim listesi

liste à sélection unique
<select size="3" name="lst2" multiple>
<option selected>liste1</option>
<option>liste2</option>
<option selected>liste3</option>
<option>liste4</option>
<option>liste5</option>
</select>

Image

balise HTML
<select size=".." name=".." multiple>
<option [selected]>...</option>
...
</select>
<option>...</option> etiketleri arasındaki metinleri bir listede görüntüler
attributs
multiple: listeden birden fazla öğenin seçilmesine olanak tanır. Yukarıdaki örnekte, liste1 ve liste3 öğelerinin her ikisi de seçilmiştir.

2.8.1.9. button türü düğme

bouton de type button
<input type="button" value="Sil" name="cmdEffacer" onclick="effacer()">

Image

balise HTML
<input type="button" value="..." name="..." onclick="effacer()" ....>
attributs
type="button": bir düğme kontrolü tanımlar. İki farklı düğme türü daha vardır: submit ve reset.
value="Sil" : düğme üzerinde görüntülenen metin
onclick="fonksiyon()" : kullanıcı düğmeye tıkladığında çalıştırılacak bir fonksiyon tanımlamaya olanak tanır. Bu fonksiyon, görüntülenen web belgesinde tanımlanan komut dosyalarının bir parçasıdır. Yukarıdaki sözdizimi, javascript sözdizimidir. Komut dosyaları vbscript ile yazılmışsa, onclick="fonksiyon" şeklinde, parantezler olmadan yazılmalıdır. İşleve parametreler aktarılması gerekiyorsa sözdizimi aynı kalır: onclick="fonksiyon(val1, val2,...)"
Örneğimizde, Effacer düğmesine tıklandığında aşağıdaki effacer JavaScript işlevi çağrılır:
    <script language="JavaScript">
        function effacer(){
          alert("Vous avez cliqué sur le bouton Effacer");
      }//sil
        </script>
effacer işlevi şu mesajı görüntüler:

2.8.1.10. Gönder düğmesi

bouton de type submit
<input type="submit" value="Gönder" name="cmdRenvoyer">

Image

balise HTML
<input type="submit" value="Gönder" name="cmdRenvoyer">
attributs
type="submit": Düğmeyi, form verilerini web sunucusuna gönderen bir düğme olarak tanımlar. Kullanıcı bu düğmeye tıkladığında, tarayıcı form verilerini <form> etiketinin action özniteliğinde tanımlanan URL adresine, aynı etiketin method özniteliğinde tanımlanan yönteme göre gönderir.
value="Gönder" : düğme üzerinde görüntülenen metin

2.8.1.11. Sıfırlama düğmesi

bouton de type reset
<input type="reset" value="Sıfırla" name="cmdRétablir">

Image

balise HTML
<input type="reset" value="Sıfırla" name="cmdRétablir">
attributs
type="reset": Düğmeyi form sıfırlama düğmesi olarak tanımlar. Kullanıcı bu düğmeye tıkladığında, tarayıcı formu aldığı duruma geri döndürür.
value="Sıfırla" : düğme üzerinde görüntülenen metin

2.8.1.12. Gizli alan

champ caché
<input type="hidden" name="secret" value="uneValeur">
balise HTML
<input type="hidden" name="..." value="...">
attributs
type="hidden": bunun gizli bir alan olduğunu belirtir. Gizli bir alan, formun bir parçasıdır ancak kullanıcıya gösterilmez. Ancak, kullanıcı tarayıcısından kaynak kodunu görüntülemesini isterse, <input type="hidden" value="..."> etiketini ve dolayısıyla gizli alanın değerini görebilir.
value="birDeğer" : gizli alanın değeri.
Gizli alanın amacı nedir? Bu, web sunucusunun bir kullanıcının istekleri boyunca bilgileri saklamasına olanak tanır. Bir web alışveriş uygulamasını ele alalım. Müşteri, bir kataloğun ilk sayfasında art1 adlı üründen q1 adet satın alır ve ardından kataloğun başka bir sayfasına geçer. Müşterinin q1 ve art1 numaralı ürünleri satın aldığını hatırlamak için sunucu, bu iki bilgiyi yeni sayfanın web formundaki gizli bir alana yerleştirebilir. Bu yeni sayfada müşteri, q2 ve art2 ürünlerini satın alır. Bu ikinci formun verileri sunucuya gönderildiğinde (submit), sunucu sadece (q2, art2) bilgilerini almakla kalmayacak, aynı zamanda kullanıcı tarafından değiştirilemeyen gizli bir alan olarak formun bir parçası olan (q1, art1) bilgilerini de alacaktır. Web sunucusu daha sonra (q1,art1) ve (q2,art2) bilgilerini yeni bir gizli alana yerleştirecek ve yeni bir katalog sayfası gönderecektir. Ve bu şekilde devam eder.

2.8.2. Bir web istemcisi tarafından web sunucusuna form değerlerinin gönderilmesi

Önceki çalışmada, web istemcisinin görüntülediği bir formun değerlerini bir web sunucusuna göndermek için iki yönteme sahip olduğunu belirtmiştik: GET ve POST yöntemleri. Bir örnek üzerinden bu iki yöntem arasındaki farkı inceleyelim. Önceki örneği tekrar ele alalım ve şu şekilde işleyelim:

  1. Bir tarayıcı, örnekteki URL formunu bir web sunucusundan ister
  2. formu aldıktan sonra, formu dolduruyoruz
  3. submit türündeki Envoyer düğmesine tıklayarak form değerlerini web sunucusuna göndermeden önce, web sunucusunu durdurup daha önce kullanılmış olan genel TCP sunucusuyla değiştiriyoruz. Bu sunucunun, web istemcisinden gelen metin satırlarını ekranda görüntülediğini hatırlayalım. Böylece tarayıcının tam olarak ne gönderdiğini görebileceğiz.

Form şu şekilde doldurulur:

Image

Bu belge için kullanılan URL şöyledir:

Image

2.8.2.1. GET yöntemi

HTML belgesi, tarayıcının form değerlerini web sunucusuna göndermek için GET yöntemini kullanacak şekilde programlanmıştır. Bu nedenle şunu yazdık:

    <form method="GET" >

Web sunucusunu durduruyoruz ve 81 numaralı bağlantı noktasında genel amaçlı TCP sunucumuzu başlatıyoruz:

E:\data\serge\JAVA\SOCKETS\serveur générique>java serveurTCPgenerique 81
Serveur générique lancé sur le port 81

Şimdi tarayıcımıza geri dönüp Envoyer düğmesini kullanarak form verilerini web sunucusuna gönderiyoruz:

Image

İşte genel TCP sunucusunun aldığı veriler:

<-- GET /html/balises.htm?R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecret&area
Saisie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&
cmdRenvoyer=Envoyer&secret=uneValeur HTTP/1.1
<-- Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd
.ms-powerpoint, application/vnd.ms-excel, */*
<-- Referer: http://localhost:81/html/balises.htm
<-- Accept-Language: fr
<-- Accept-Encoding: gzip, deflate
<-- User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)
<-- Host: localhost:81
<-- Connection: Keep-Alive
<--

Her şey, tarayıcı tarafından gönderilen ilk başlıkta (HTTP) yer almaktadır:

<-- GET /html/balises.htm?R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecret&area
Saisie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&
cmdRenvoyer=Envoyer&secret=uneValeur HTTP/1.1

Görüldüğü gibi, bu şimdiye kadar karşılaşılanlardan çok daha karmaşıktır. Burada GET URL HTTP/1.1 sözdizimini görüyoruz, ancak bu, GET URL?param1=değer1&param2=değer2&... HTTP/1.1 burada parami, web formundaki denetimlerin adları; değerler ise bunlara atanan değerlerdir. Bunları daha yakından inceleyelim. Aşağıda üç sütunlu bir tablo sunuyoruz:

  • 1. sütun: Örnekteki HTML kontrolünün tanımını içerir
  • 2. sütun: Bu kontrolün bir tarayıcıda nasıl görüntülendiğini gösterir
  • 3. sütun: Örnekteki GET isteğinde olduğu şekliyle, 1. sütundaki kontrol için tarayıcı tarafından sunucuya gönderilen değeri gösterir
HTML kontrolü
görsel
geri gönderilen değer(ler)
<input type="radio" value="Evet" name="R1">Evet
<input type="radio" name="R1" value="hayır" checked>Hayır
R1=Evet
- kullanıcı tarafından işaretlenen radyo düğmesinin value özniteliğinin değeri.
<input type="checkbox" name="C1" value="bir">1
<input type="checkbox" name="C2" value="iki" checked>2
<input type="checkbox" name="C3" value="üç">3
C1=bir
C2=iki
- kullanıcı tarafından işaretlenen kutuların value öznitelik değerleri
<input type="text" name="txtSaisie" size="20" value="birkaç kelime">
txtSaisie=web+programlama
- kullanıcı tarafından giriş alanına yazılan metin. Boşluklar + işaretiyle değiştirilmiştir
<input type="password" name="txtMdp" size="20" value="unMotDePasse">
txtMdp=bu bir sır
- Kullanıcının giriş alanına yazdığı metin
<textarea rows="2" name="areaSaisie" cols="20">
satır1
satır2
satır3
</textarea>
giriş alanı=web+programlamanın+temelleri%0D%0A
web+programlama
- kullanıcı tarafından giriş alanına yazılan metin. %OD%OA satır sonu işaretidir. Boşluklar + işaretiyle değiştirilmiştir
<select size="1" name="cmbValeurs">
<option>seçim1</option>
<seçili seçenek>seçenek2</option>
<option>seçenek3</option>
</select>
cmbDeğerler=seçim3
- tek seçimli listeden kullanıcı tarafından seçilen değer
<select size="3" name="lst1">
<option selected>liste1</option>
<option>liste2</option>
<option>liste3</option>
<option>liste4</option>
<option>liste5</option>
</select>
lst1=liste3
- tek seçimli listeden kullanıcı tarafından seçilen değer
<select size="3" name="lst2" multiple>
<option selected>liste1</option>
<option>liste2</option>
<option selected>liste3</option>
<option>liste4</option>
<option>liste5</option>
</select>
lst2=liste1
lst2=liste3
- kullanıcı tarafından çoklu seçim listesinden seçilen değerler
<input type="submit" value="Gönder" name="cmdRenvoyer">
 
cmdRenvoyer=Gönder
- form verilerini sunucuya göndermek için kullanılan düğmenin adı ve value özniteliği
<input type="hidden" name="secret" value="uneValeur">
 
secret=birDeğer
- gizli alanın value özniteliği

Aynı işlemi tekrar yapalım, ancak bu sefer yanıtı oluşturmak için web sunucusunu kullanalım ve yanıtın ne olduğunu görelim. Web sunucusu tarafından gönderilen sayfa şöyledir:

Image

Bu, form doldurulmadan önce başlangıçta alınan sayfayla tamamen aynıdır. Bunun nedenini anlamak için, kullanıcı Envoyer düğmesine bastığında tarayıcı tarafından istenen URL'e tekrar bakmak gerekir:

<-- GET /html/balises.htm?R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecret&area
Saisie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&
cmdRenvoyer=Envoyer&secret=uneValeur HTTP/1.1

İstenen URL, /html/balises.htm'tir. Ayrıca, bu URL'e formdaki değerler aktarılır. Şu anda, statik bir sayfa olan /html/balises.htm adresindeki URL bu değerleri kullanmıyor. Dolayısıyla, önceki GET şu adrese eşdeğerdir:

<-- GET /html/balises.htm HTTP/1.1

ile eşdeğerdir ve bu nedenle sunucu bize tekrar başlangıç sayfasını geri gönderdi. Tarayıcının, talep edilen URL sayfasını eksiksiz olarak görüntülediği dikkatinizi çekecektir:

Image

2.8.2.2. POST yöntemi

HTML belgesi, tarayıcının artık form değerlerini web sunucusuna göndermek için POST yöntemini kullanması üzere programlanmıştır:

    <form method="POST" >

Web sunucusunu durduruyoruz ve 81 numaralı bağlantı noktasında genel amaçlı TCP sunucusunu (daha önce karşılaştığımız, ancak bu durum için biraz değiştirilmiş olan) başlatıyoruz:

E:\data\serge\JAVA\SOCKETS\serveur générique>java serveurTCPgenerique2 81
Serveur générique lancé sur le port 81

Şimdi tarayıcımıza geri dönüp “Gönder” düğmesini kullanarak form verilerini web sunucusuna gönderiyoruz:

Image

İşte genel TCP sunucusunun aldığı veriler:

<-- POST /html/balises.htm HTTP/1.1
<-- Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd
.ms-powerpoint, application/vnd.ms-excel, */*
<-- Referer: http://localhost:81/html/balises.htm
<-- Accept-Language: fr
<-- Content-Type: application/x-www-form-urlencoded
<-- Accept-Encoding: gzip, deflate
<-- User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)
<-- Host: localhost:81
<-- Content-Length: 210
<-- Connection: Keep-Alive
<-- Cache-Control: no-cache
<--
<-- 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

Daha önce bildiklerimize kıyasla, tarayıcı isteğinde şu değişiklikleri gözlemliyoruz:

  1. Başlangıçtaki HTTP başlığı artık GET değil, POST olarak görünüyor. Sözdizimi şöyledir: POST URL HTTP/1.1; burada URL, tarayıcı tarafından istenen URL'tir. Aynı zamanda, POST, tarayıcının sunucuya ileteceği veriler olduğu anlamına gelir.
  2. Content-Type: application/x-www-form-urlencoded satırı, tarayıcının hangi tür verileri göndereceğini belirtir. Bunlar, URL kodlamasına tabi tutulmuş form verileridir (x-www-form). Bu kodlama, sunucunun verileri yanlış yorumlamasını önlemek amacıyla iletilen verilerdeki bazı karakterlerin dönüştürülmesini sağlar. Böylece, boşluk karakteri + ile, satır sonu işareti ise %OD%OA... ile değiştirilir. Genel olarak, verilerde bulunan ve sunucu tarafından yanlış yorumlanabilecek tüm karakterler (&, +, %, ...) %XX şeklinde dönüştürülür; burada XX, karakterlerin onaltılık kodudur.
  3. Content-Length: 210 satırı, başlıkların sonunu belirten boş satırdan sonra, HTTP başlıklarının tamamlanmasının ardından istemcinin sunucuya kaç karakter göndereceğini belirtir.
  4. Veriler (210 karakter): R1=Evet&C1=bir&C2=iki&txtSaisie=web+programlama&txtMdp=bu+gizlidir&areaSaisie=temeller+%0D%0Aweb+programlama&cmbValeurs=seçim3&lst1=liste3&lst2=liste1&lst2=liste3&cmdRenvoyer=Gönder&secret=uneValeur

POST tarafından iletilen verilerin, GET tarafından iletilen verilerle aynı formatta olduğu görülmektedir.

Bir yöntem diğerinden daha mı iyidir? Gördüğümüz gibi, bir formun değerleri tarayıcı tarafından GET yöntemiyle gönderildiğinde, tarayıcının Adresse alanında, istenen URL değerini URL?param1=val1&param2=val2&... biçiminde görüntülediğini gördük. Bunu bir avantaj ya da dezavantaj olarak görebiliriz:

  • kullanıcının bu ayarlanmış URL bağlantısını sık kullanılanlarına eklemesine izin vermek istiyorsak bir avantaj
  • kullanıcıların, örneğin gizli alanlar gibi formdaki belirli bilgilere erişmesini istemiyorsak, bu bir dezavantajdır

Bundan sonra, formlarımızda neredeyse tamamen POST yöntemini kullanacağız.

2.8.2.3. Bir web formundaki değerlerin alınması

POST veya GET yoluyla parametreler de gönderen bir istemci tarafından talep edilen statik bir sayfa, bu parametreleri hiçbir şekilde alamaz. Bunu yalnızca bir program yapabilir ve bu program, müşteriye bir yanıt oluşturmakla görevlendirilir; bu yanıt dinamik olacak ve genellikle alınan parametrelere bağlı olacaktır. Bu, web programlamasının alanına girer; bu konuyu, bir sonraki bölümde web programlama için Java teknolojileri olan servletler ve JSP sayfalarının tanıtımıyla daha ayrıntılı olarak ele alacağız.