Skip to content

3. Java ile web geliştirmenin temelleri

Şimdi dinamik web uygulamaları geliştirmeye geçiyoruz, c.a.d. Bu uygulamalarda, kullanıcıya gönderilen sayfalar HTML programlar tarafından oluşturulur.

3.1. Eclipse'te bir web projesi oluşturma

Eclipse/Tomcat ile ilk web uygulamamızı geliştireceğiz. Eclipse kullanmadan web uygulaması oluştururken izlediğimiz yaklaşıma benzer bir yol izleyeceğiz. Eclipse'i başlattıktan sonra yeni bir proje oluşturuyoruz:

Image

ve bunu dinamik bir web projesi olarak tanımlıyoruz:

Image

Oluşturma sihirbazının ilk sayfasında, projenin adını [1] ve konumunu [2] olarak belirleyeceğiz:

Image

Sihirbazın ikinci sayfasında varsayılan değerleri kabul ediyoruz:

Image

Sihirbazın son sayfasında, uygulamanın bağlamını ([3]) tanımlamamız istenir:

Image

Sihirbaz onaylandıktan sonra, Eclipse gereksiz ağ erişimlerini önlemek amacıyla önbelleğe almak istediği bazı belgeleri almak için siteye bağlanır. Ardından bir lisans onay talebi istenir:

Image

Bunu kabul ediyoruz. Eclipse, web projesini oluşturur. Projeyi görüntülemek için, klasik bir Java projesinde kullanılan ortamdan farklı olan ve “perspektif” olarak adlandırılan bir ortam kullanır:

Image

Bir web projesiyle ilişkili perspektif, J2EE perspektifidir. Görmek için bunu kabul ediyoruz... Elde edilen sonuç şöyledir:

Image

J2EE perspektifi, basit web projeleri için aslında gereksiz derecede karmaşıktır. Bu durumda, Java perspektifi yeterlidir. Buna ulaşmak için [Window -> Open perspective -> Java] seçeneğini kullanıyoruz:

Image

src: Uygulamanın sınıflarının Java kodunu ve uygulamanın Classpath dizininde bulunması gereken dosyaları içerecektir.

build/classes (gösterilmemiştir): derlenmiş sınıfların .class dosyalarını ve src dizininde bulunan .java uzantılı dosyalar dışındaki tüm dosyaların bir kopyasını içerecektir. Bir web uygulaması sıklıkla "kaynak" dosyaları olarak adlandırılan dosyaları kullanır; bu dosyaların uygulamanın Classpath dizininde, yani c.a.d'te bulunması gerekir. Uygulama bir sınıfa başvurduğunda (derleme sırasında veya çalışma zamanında), JVM tarafından taranan tüm klasörler. Eclipse, build/classes klasörünün web uygulamasının bir parçası olmasını sağlar. "Kaynak" dosyaları src klasörüne yerleştirilir; Eclipse bunları otomatik olarak build/classes klasörüne kopyalayacaktır.

WebContent: Uygulamanın Classpath klasöründe bulunması gerekmeyen web uygulaması kaynaklarını içerecektir.

WEB-INF/lib: Web uygulamasının ihtiyaç duyduğu .jar dosyalarını içerecektir.

[personne] uygulamasını yapılandıran [WEB-INF/web.xml] dosyasının içeriğine bir göz atalım:


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>    personne</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Bu tür bir yapılandırmayla, 2.3.4. paragrafında ana sayfaların oluşturulmasını incelerken daha önce karşılaşmıştık. Bu dosya, bir dizi ana sayfayı tanımlamaktan başka bir şey yapmaz. Biz sadece ilkini saklıyoruz. [web.xml] dosyası şu şekilde olur:


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>personne</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

Yukarıdaki XML dosyasının içeriği, <web-app> açılış etiketinin [xsi:schemaLocation] özniteliğiyle belirtilen dosyada tanımlanan sözdizimi kurallarına uymalıdır. Bu dosya burada [http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd]'tir. Bu, bir tarayıcıyla doğrudan çağrılabilen bir XML dosyasıdır. Tarayıcı yeterince güncelse, bir XML dosyasını görüntüleyebilir:

Image

Eclipse, <web-app> açılış etiketinin [xsi:schemaLocation] özniteliğinde belirtilen .xsd dosyasını kullanarak XML belgesinin geçerliliğini doğrulamaya çalışacaktır. Bunun için bir ağ erişimi gerçekleştirecektir. Bilgisayarınız özel bir ağda bulunuyorsa, Eclipse'e özel ağdan çıkmak için kullanılacak makineyi (HTTP adlı proxy) belirtmeniz gerekir. Bu, [Window -> Preferences -> Internet] seçeneği ile yapılır:

Image

Özel bir ağda iseniz (1) seçeneğini işaretleyin. (2) seçeneğinde, HTTP proxy'sini destekleyen makinenin adını, (3) seçeneğinde ise bu proxy'nin dinleme bağlantı noktasını belirtin. Son olarak (4) numaralı alana, çalıştığınız makineyle aynı özel ağda bulunan ve proxy üzerinden bağlanmaması gereken makineleri belirtin.

Şimdi ana sayfanın [index.html] dosyasını oluşturacağız.

3.2. Ana sayfanın oluşturulması

[WebContent] klasörüne sağ tıklayıp [New -> Other] seçeneğini seçiyoruz:

Image

[HTML] tipini seçiyoruz ve [Next]'i şu şekilde değiştiriyoruz ->

Image

Yukarıda, (1) veya (2) numaralı adımda üst klasör olan [WebContent]'i seçip, (3) numaralı adımda oluşturulacak dosyanın adını belirtiyoruz. Bunu yaptıktan sonra, sihirbazın bir sonraki sayfasına geçiyoruz:

Image

(1) seçeneğiyle, (2) ile önceden doldurulmuş bir HTML dosyası oluşturabiliriz. (1) seçeneğinin işaretini kaldırırsak, boş bir HTML dosyası oluşturulur. Bir kod şablonundan yararlanmak için (1) seçeneğini işaretli bırakıyoruz. Sihirbazı [Finish] ile tamamlıyoruz. Böylece [index.html] dosyası oluşturulur:

Image

ve içeriği şu şekildedir:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

Bu dosyayı şu şekilde değiştiriyoruz:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Application personne</title>
</head>
<body>
Application personne active...
<br>
<br>
Vous êtes sur la page d'accueil
</body>
</html>

3.3. Ana sayfa testi

Eğer yoksa, [Servers] görünümünü [Window - > Show View -> Other -> Servers] seçeneğiyle açalım ve ardından Tomcat 5.5 sunucusuna sağ tıklayalım:

Image

Yukarıdaki [Add and Remove Objects] seçeneği, Tomcat sunucusuna web uygulamaları eklemeye/kaldırmaya olanak tanır:

Image

Eclipse'te tanınan web projeleri (1) numaralı yerde gösterilir. Bunları (2) numaralı seçenekle Tomcat sunucusuna kaydedebilirsiniz. Tomcat sunucusuna kaydedilen web uygulamaları (4) numaralı yerde görünür. Bunları (3) numaralı seçenekle kayıttan silebilirsiniz. [personne] projesini kaydedelim:

Image

ardından [Finish] ile kayıt sihirbazını tamamlayalım. [Servers] görünümü, [personne] projesinin Tomcat'e kaydedildiğini göstermektedir:

Image

Şimdi Tomcat sunucusunu başlatalım:

Web tarayıcısını açalım:

Image

ardından [http://localhost:8080/personne] URL'sini girelim. Bu URL, web uygulamasının kök dizinine aittir. Herhangi bir belge talep edilmez. Bu durumda, uygulamanın ana sayfası görüntülenir. Ana sayfa yoksa bir hata bildirilir. Burada ana sayfa mevcuttur. Bu, daha önce oluşturduğumuz [index.html] dosyasıdır. Elde edilen sonuç şöyledir:

Image

Bu, beklenen sonuçla uyumludur. Şimdi Eclipse dışındaki bir tarayıcı açıp aynı URL’yi gidelim:

Image

Dolayısıyla, [personne] web uygulaması Eclipse dışında da tanınmaktadır.

3.4. HTML formunun oluşturulması

Şimdi [personne] klasöründe [formulaire.html] adlı statik bir HTML belgesi oluşturuyoruz:

Image

Bunu oluşturmak için, sayfa 33'teki 3.2 numaralı paragrafta açıklanan prosedürü izleyeceğiz. İçeriği şu şekilde olacaktır:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Personne - formulaire</title>
</head>
<body>
  <center>
    <h2>Personne - formulaire</h2>
    <hr>
    <form action="" method="post">
    <table>
      <tr>
        <td>Nom</td>
        <td><input name="txtNom" value="" type="text" size="20"></td>
      </tr>
      <tr>
        <td>Age</td>
        <td><input name="txtAge" value="" type="text" size="3"></td>
      </tr>
    </table>
    <table>
      <tr>
        <td><input type="submit" value="Envoyer"></td>
        <td><input type="reset" value="Retablir"></td>
        <td><input type="button" value="Effacer"></td>
      </tr>
    </table>
    </form>
  </center>
</body>
</html>

Yukarıdaki HTML kodu, aşağıdaki forma karşılık gelir:

Image

tür HTML
ad
kod HTML
rol
1
<input type="text">
txtNom
satır 14
ad girişi
2
<input type= "text ">
txtAge
18. satır
yaş girişi
3
<input type= "submit ">
 
23. satır
girdilen değerlerin /personne1/main URL'sine sunucuya gönderilmesi
4
<input type="reset">
 
24. satır
sayfayı tarayıcı tarafından ilk alındığı duruma geri döndürmek için
5
<input type="button">
 
satır 25
[1] ve [2] giriş alanlarının içeriğini silmek için

Belgeyi <personne>/WebContent klasörüne kaydedelim. Gerekirse Tomcat'i başlatalım. Bir tarayıcıyla URL http://localhost:8080/personne/formulaire.html adresini açalım:

Image

Bu temel uygulamanın istemci/sunucu mimarisi şu şekildedir:

Image

Web sunucusu, kullanıcı ile web uygulaması arasında yer alır ve burada gösterilmemiştir. [formulaire.html], istemciden gelen her isteğe aynı içeriği sunan statik bir belgedir. Web programlamasının amacı, istemcinin isteğine uygun içerik üretmektir. Bu içerik, program tarafından oluşturulur. İlk çözüm, statik HTML dosyası yerine bir JSP (Java Sunucu Sayfası) sayfası kullanmaktır. Şimdi bunu inceleyeceğiz.

3.5. JSP sayfasının oluşturulması


[ref1] okuma bölümleri: bölüm 1, bölüm 2: 2.2, 2.2.1, 2.2.2, 2.2.3, 2.2.4


Önceki istemci/sunucu mimarisi şu şekilde dönüştürülür:

Image

JSP sayfası, parametreleri ayarlanmış bir HTML sayfasıdır. Sayfanın bazı öğeleri, yalnızca yürütme anında değer alır. Bu değerler program tarafından hesaplanır. Dolayısıyla dinamik bir sayfayla karşı karşıyayız: sayfaya yapılan ardışık istekler farklı yanıtlara yol açabilir. Burada "yanıt" terimiyle, istemci tarayıcısı tarafından görüntülenen HTML sayfasını kastediyoruz. Sonuçta, tarayıcının aldığı her zaman bir HTML belgesidir. Bu HTML belgesi, web sunucusu tarafından JSP sayfasından oluşturulur. Bu sayfa şablon görevi görür. Sayfanın dinamik öğeleri, HTML belgesinin oluşturulduğu andaki geçerli değerleriyle değiştirilir.

Bir JSP sayfası oluşturmak için, [WebContent] klasörüne sağ tıklayıp [New -> Other] seçeneğini seçiyoruz:

Image

[JSP] türünü seçip [Next]'i oluşturuyoruz ->

Image

Yukarıda, (1) veya (2) numaralı adımda [WebContent] üst klasörünü seçip, (3) numaralı adımda oluşturulacak dosyanın adını belirtiyoruz. Bunu yaptıktan sonra, sihirbazın bir sonraki sayfasına geçiyoruz:

Image

(1) seçeneğiyle, (2) ile önceden doldurulmuş bir JSP dosyası oluşturabiliriz. (1) seçeneğinin işaretini kaldırırsak, boş bir JSP dosyası oluşturulur. Bir kod iskeletinden yararlanmak için (1) seçeneğini işaretli bırakıyoruz. Sihirbazı [Finish] ile tamamlıyoruz. Böylece [formulaire.jsp] dosyası oluşturulur:

Image

ve içeriği şu şekildedir:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

</body>
</html>
  1. satır, JSP sayfasıyla uğraştığımızı gösterir. Yukarıdaki metni şu şekilde dönüştürüyoruz:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
    // parametreler alınır
  String nom=request.getParameter("txtNom");
  if(nom==null) nom="inconnu";
  String age=request.getParameter("txtAge");
  if(age==null) age="xxx";  
%>

<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title>Personne - formulaire</title>
  </head>
  <body>
      <center>
        <h2>Personne - formulaire</h2>
      <hr>
      <form action="" method="post">
          <table>
            <tr>
              <td>Nom</td>
            <td><input name="txtNom" value="<%= nom %>" type="text" size="20"></td>
          </tr>
          <tr>
              <td>Age</td>
            <td><input name="txtAge" value="<%= age %>" type="text" size="3"></td>
          </tr>
        </table>
        <table>
            <tr>
              <td><input type="submit" value="Envoyer"></td>
            <td><input type="reset" value="Rétablir"></td>
            <td><input type="button" value="Effacer"></td>
          </tr>
        </table>
      </form>
    </center>
  </body>
</html>

Başlangıçta statik olan belge, Java kodunun eklenmesiyle artık dinamik hale gelmiştir. Bu tür belgeler için her zaman şu şekilde ilerleyeceğiz:

  • belgenin en başına, belgenin görüntülenmesi için gerekli parametreleri almak üzere Java kodu ekleriz. Bu parametreler genellikle request nesnesinde bulunur. Bu nesne, istemcinin isteğini temsil eder. Bu istek, onu zenginleştirmiş olabilecek birkaç servlet ve JSP sayfalarından geçebilir. Burada ise bize doğrudan tarayıcıdan ulaşacaktır.
  • HTML kodu hemen ardından gelir. Bu kod, çoğunlukla <%= değişken %> etiketleri aracılığıyla Java kodunda önceden hesaplanmış değişkenleri görüntülemekle yetinir. Burada = işaretinin % işaretine bitişik olduğu unutulmamalıdır. Bu, sık karşılaşılan bir hata nedenidir.

Yukarıdaki dinamik belge ne işe yarar?

  • 6-9. satırlar: İstekten [txtNom] ve [txtAge] adlı iki parametreyi alır ve bunların değerlerini [nom] (6. satır) ve [age] (8. satır) değişkenlerine atar. Parametreleri bulamazsa, ilgili değişkenlere varsayılan değerler atar.
  • Aşağıdaki HTML kodunda (25. ve 29. satırlar) iki [nom, age] değişkeninin değerini görüntüler.

İlk testi yapalım. Gerekirse Tomcat'i başlatıp, ardından bir tarayıcıyla URL adresindeki http://localhost:8080/personne/formulaire.jsp sayfasını açalım:

Image

formulaire.jsp belgesi, herhangi bir parametre aktarılmadan çağrıldı. Dolayısıyla varsayılan değerler görüntülendi. Şimdi URL dosyasını çağıralımhttp://localhost:8080/personne/formulaire.jsp?txtNom=martin&txtAge=14:

Image

Bu sefer, formulaire.jsp belgesine, beklenen txtNom ve txtAge parametrelerini aktardık. Böylece bunları görüntüledi. Bir web belgesine parametre aktarmak için iki yöntem olduğunu biliyoruz: GET ve POST. Her iki durumda da aktarılan parametreler, önceden tanımlanmış request nesnesinde bulunur. Burada ise parametreler GET yöntemi ile aktarılmıştır.

3.6. Bir servlet oluşturma


[ref1] ile ilgili okuma: bölüm 1, bölüm 2: 2.1, 2.1.1, 2.1.2, 2.3.1


Önceki sürümde, istemcinin isteği bir JSP sayfası tarafından işleniyordu. Bu sayfaya ilk çağrı yapıldığında, web sunucusu (burada Tomcat) bu sayfadan bir Java sınıfı oluşturur ve bunu derler. Sonuçta istemcinin isteğini işleyen, bu derleme işleminin sonucudur. JSP sayfasından oluşturulan sınıf, [javax.Servlet] arayüzünü uyguladığı için bir servlettir:

Image

İstemcinin isteği, bu arayüzü uygulayan herhangi bir sınıf tarafından işlenebilir. Şimdi böyle bir sınıf oluşturuyoruz: ServletFormulaire. Önceki istemci/sunucu mimarisi şu şekilde dönüştürülür:

Image

JSP sayfası tabanlı mimaride, müşteriye gönderilen HTML belgesi, şablon görevi gören JSP sayfasından web sunucusu tarafından oluşturulmuştur. Burada ise istemciye gönderilen HTML belgesi tamamen servlet tarafından oluşturulacaktır.

3.6.1. Servlet'in oluşturulması

Eclipse'te, [src] klasörüne sağ tıklayıp sınıf oluşturma seçeneğini seçelim:

Image

ardından oluşturulacak sınıfın özelliklerini tanımlayalım:

Image

(1) numaralı alana paket adını, (2) numaralı alana oluşturulacak sınıfın adını girin. Bu sınıf, (3) numaralı alanda belirtilen sınıftan türetilmelidir. Bu sınıfın tam adını kendiniz yazmanıza gerek yoktur. (4) numaralı düğme, web uygulamasının Classpath klasöründe bulunan sınıflara erişim sağlar:

Image

(1) numaralı alana aranan sınıfın adı yazılır. (2) numaralı alanda, (1) numaralı alana yazılan dizeyi içeren Classpath sınıfları görüntülenir.

Oluşturma sihirbazının onaylanmasının ardından, [personne] web projesi şu şekilde değiştirilir:

Image

[ServletFormulaire] sınıfı, aşağıdaki kod şablonuyla oluşturulmuştur:

Image

Yukarıdaki ekran görüntüsü, Eclipse'in sınıfın tanımlandığı satırda bir [warning] hatası bildirdiğini göstermektedir. Bu [warning] hatasını gösteren simgeye (lamba) tıklayalım:

Image

(1) numaralı öğeye tıkladıktan sonra, (2) numaralı alanda [warning] hatasını gidermek için çözümler sunulur. Bunlardan birini seçtiğinizde, (3) numaralı alanda seçiminizin yol açacağı kod değişikliği görüntülenir.

Java 1.5, Java dilinde değişiklikler getirmiştir ve önceki bir sürümde doğru olan bir kod, artık [warnings] hatasına neden olabilir. Bu hatalar, sınıfın derlenmesini engelleyebilecek hataları belirtmez. Bunlar, geliştiricinin dikkatini iyileştirilebilecek kod noktalarına çekmek için vardır. Buradaki [warning] hatası, bir sınıfın sürüm numarasına sahip olması gerektiğini belirtir. Bu numara, nesnelerin serileştirilmesi/deserileştirilmesi için kullanılır (c.a.d). Bellekteki bir Java nesnesi .class, bir yazma akışında sırayla gönderilen bir bit dizisine dönüştürülmesi gerektiğinde veya tersi olarak, bellekteki bir Java nesnesi .class, bir okuma akışında sırayla okunan bir bit dizisinden oluşturulması gerektiğinde. Tüm bunlar şu anki ilgi alanlarımızdan oldukça uzaktır. Bu nedenle, [Add @SuppressWarnings ...] çözümünü seçerek derleyiciden bu uyarıyı göz ardı etmesini isteyeceğiz. Kod şu şekilde olur:

Image

Artık [warning] yok. Eklenen satır, Java 1.5 ile ortaya çıkan bir kavram olan "annotation" (açıklama) olarak adlandırılır. Bu kodu daha sonra tamamlayacağız.

3.6.2. Bir Eclipse projesinin sınıf yolu

Bir Java uygulamasının Classpath'i, derleyici uygulamayı derlerken veya archives.jar uygulamayı çalıştırırken taranan klasörler ve JVM'in bütünüdür. Bu iki Classpath her zaman aynı değildir; çünkü bazı sınıflar yalnızca yürütme sırasında kullanılır, derleme sırasında ise kullanılmaz. Hem Java derleyicisi hem de JVM, derlenecek veya çalıştırılacak uygulamanın Classpath'sini belirtmeye yarayan bir argümana sahiptir. Kullanıcı için az çok şeffaf bir şekilde, Eclipse bu argümanın oluşturulmasını ve JVM'e aktarılmasını sağlar.

Bir Eclipse projesinin Classpath öğelerini nasıl öğrenebiliriz? [<projet> / Build Path / Configure Build Path] seçeneği ile:

Image

Böylece aşağıdaki yapılandırma sihirbazı karşımıza çıkar:

Image

(1) numaralı [Libraries] sekmesi, uygulamanın Classpath'sinin bir parçası olan .jar arşivlerinin listesini tanımlamaya olanak tanır. Dolayısıyla, uygulama bir sınıf talep ettiğinde bu arşivler JVM tarafından taranır. [2] ve [3] düğmeleri, Classpath'e arşivler eklemeye yarar. [2] düğmesi, Eclipse tarafından yönetilen proje klasörlerinde bulunan arşivleri seçmeye yararken, [3] düğmesi ise bilgisayarın dosya sistemindeki herhangi bir arşivi seçmeye yarar.

Yukarıda üç kütüphane (Libraries) görülmektedir:

  • [JRE System Library]: Eclipse Java projeleri için temel kütüphane:

Image

  • [Tomcat v5.5 runtime]: Tomcat sunucusu tarafından sağlanan kütüphane. Web geliştirme için gerekli sınıfları içerir. Bu kütüphane, Tomcat sunucusuyla ilişkilendirilmiş tüm Eclipse web projelerine dahil edilir.

Image

[servlet-api.jar] arşivi, şu anda oluşturmakta olduğumuz [ServletFormulaire] sınıfının üst sınıfı olan [javax.servlet.http.HttpServlet] sınıfını içerir. Bu arşiv, uygulamanın Classpath klasöründe bulunduğu için, aşağıda gösterilen sihirbarda üst sınıf olarak önerilebildi.

Image

Aksi takdirde, [2] için önerilenler arasında görünmezdi. Dolayısıyla, bu sihirbazda bir üst sınıfa referans vermek istendiğinde ve bu sınıf önerilmezse, ya sınıfın adında bir hata yapılmıştır ya da onu içeren arşiv, uygulamanın Classpath dosyasında bulunmamaktadır.

  • [Web App Libraries], projenin [WEB-INF/lib] klasöründe bulunan arşivleri bir araya getirir. Burada bu klasör boştur:

Image

Eclipse projesinin Classpath arşivleri, proje gezgininde mevcuttur. Örneğin, [personne] web projesi için:

Image

Proje gezgini, bu arşivlerin içeriğine erişmemizi sağlar:

Image

Yukarıda görüldüğü gibi, [javax.servlet.http.HttpServlet] sınıfını içeren arşiv [servlet-api.jar]'tir.

3.6.3. Servlet'in yapılandırılması


[ref1] okuma listesi: bölüm 2: 2.3, 2.3.1, 2.3.2, 2.3.3, 2.3.4


[WEB-INF/web.xml] dosyası, web uygulamasını yapılandırmak için kullanılır:

Image

[personne] projesi için bu dosya şu anda aşağıdaki gibidir (bkz. sayfa 32):


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>personne</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

Bu dosya yalnızca bir ana sayfa dosyasının varlığını belirtir (8. satır). Bunu, aşağıdakileri bildirecek şekilde güncelliyoruz:

  • [ServletFormulaire] servletinin varlığını
  • bu servlet tarafından işlenen URL dosyaları
  • servletin başlatma parametreleri

Uygulamamızdaki web.xml dosyası şu şekilde olacaktır:


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>personne</display-name>
    <servlet>
        <servlet-name>formulairepersonne</servlet-name>
        <servlet-class>
            istia.st.servlets.personne.ServletFormulaire
        </servlet-class>
        <init-param>
            <param-name>defaultNom</param-name>
            <param-value>inconnu</param-value>
        </init-param>
        <init-param>
            <param-name>defaultAge</param-name>
            <param-value>XXX</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>formulairepersonne</servlet-name>
        <url-pattern>/formulaire</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

Bu yapılandırma dosyasının ana noktaları şunlardır:

  • 7-24. satırlar, [ServletFormulaire] servletinin varlığıyla ilgilidir
  • 7-20. satırlar: Bir servletin yapılandırması, <servlet> ve </servlet> etiketleri arasında yapılır. Bir uygulama birden fazla servlet içerebilir ve dolayısıyla aynı sayıda <servlet>...</servlet> yapılandırma bölümü barındırabilir.
  • 8. satır: <servlet-name> etiketi, servlet'e bir ad atar; bu ad herhangi bir şey olabilir
  • 9-11. satırlar: <servlet-class> etiketi, servlete karşılık gelen sınıfın tam adını belirtir. Tomcat, bu sınıfı [personne] web projesindeki Classpath klasöründe arayacaktır. Sınıfı [build/classes] klasöründe bulacaktır:

Image

  • 12-15. satırlar: <init-param> etiketi, servlete yapılandırma parametrelerini aktarmak için kullanılır. Bu parametreler genellikle servletin init yönteminde okunur, çünkü servletin yapılandırma parametreleri ilk yüklendiği anda bilinmesi gerekir.
  • 13-14. satırlar: <param-name> etiketi parametrenin adını, <param-value> etiketi ise değerini belirler.
  • 12-15. satırlar [defaultNom,"inconnu"] parametresini, 16-19. satırlar ise [defaultAge,"XXX"] parametresini tanımlar
  • 21-24. satırlar: <servlet-mapping> etiketi, bir servleti (servlet-name) bir URL modeline (url-pattern) ilişkilendirmek için kullanılır. Buradaki şablon basittir. Buna göre, bir URL her /formüler biçiminde olduğunda, formulairepersonne servleti (c.a.d) kullanılmalıdır. [istia.st.servlets.ServletFormulaire] sınıfı (satır 8-11). Dolayısıyla, [formulairepersonne] servleti tarafından kabul edilen tek bir URL vardır.

3.6.4. [ServletFormulaire] servletinin kodu

[ServletFormulaire] servletinin kodu şu şekilde olacaktır:

package istia.st.servlets.personne;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class ServletFormulaire extends HttpServlet {

     // örnek parametreleri
    private String defaultNom = null;
    private String defaultAge = null;

     // başlatma
    public void init() {
         // servletin başlatma parametreleri alınır
        ServletConfig config = getServletConfig();
        defaultNom = config.getInitParameter("defaultNom");
        if (defaultNom == null)
            defaultNom = "NNNNNNNNNNNNNNN";
        defaultAge = config.getInitParameter("defaultAge");
        if (defaultAge == null)
            defaultAge = "AAA";
    }

     // GET
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

         // form parametrelerini alıyoruz
        String nom = request.getParameter("txtNom");
        if (nom == null) {
            nom = defaultNom;
        }
        String age = request.getParameter("txtAge");
        if (age == null) {
            age = defaultAge;
        }
         // form görüntülenir
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println(
                "<html>"+
                  "<head>"+
                    "<title>Personne - formulaire</title>"+
                  "</head>"+
                  "<body>"+
                    "<center>"+
                      "<h2>Personne - formulaire</h2>"+
                      "<hr>"+
                      "<form action='' method='post'>"+
                        "<table>"+
                          "<tr>"+
                            "<td>Nom</td>"+
                            "<td><input name='txtNom' value='"+nom+"' type='text' size='20'></td>"+
                          "</tr>"+
                          "<tr>"+
                            "<td>Age</td>"+
                            "<td><input name='txtAge' value='"+ age +"' type='text' size='3'></td>"+
                          "</tr>"+
                        "</table>"+
                        "<table>"+
                          "<tr>"+
                            "<td><input type='submit' value='Envoyer'></td>"+
                            "<td><input type='reset' value='Rétablir'></td>"+
                            "<td><input type='button' value='Effacer'></td>"+
                          "</tr>"+
                        "</table>"+
                      "</form>"+
                    "</center>"+
                  "</body>"+
                "</html>"
      );
    }

     // POST
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
         // kontrol GET'e devredilir
        doGet(request, response);
    }
}

Servleti incelediğimizde, ilgili JSP sayfasından çok daha karmaşık olduğu görülür. Bu genel bir durumdur: bir servlet, HTML kodunu oluşturmak için uygun değildir. Bunun için tasarlanmış olanlar JSP sayfalarıdır. Bu konuya daha sonra tekrar değineceğiz. Yukarıdaki servletin bazı önemli noktalarını açıklayalım:

  • Bir servlet ilk kez çağrıldığında, init yöntemi (20. satır) çağrılır. Bu, yöntemin çağrıldığı tek durumdur.
  • Servlet, HTTP veya GET yöntemi ile çağrılmışsa, istemcinin isteğini işlemek için doGet yöntemi (32. satır) çağrılır.
  • Servlet, HTTP POST yöntemi ile çağrılmışsa, istemcinin isteğini işlemek için doPost yöntemi (satır 82) çağrılır.

Burada init yöntemi, [web.xml] içinde "defaultNom" ve "defaultAge" adlı başlatma parametrelerinin değerlerini almak için kullanılır. Servletin ilk yüklenmesi sırasında çalıştırılan init yöntemi, [web.xml] dosyasının içeriğini almak için uygun yerdir.

  • 22. satır: Web projesinin [config] yapılandırması alınır. Bu nesne, uygulamanın [WEB-INF/web.xml] dosyasının içeriğini yansıtır.
  • 23. satır: Bu yapılandırmada, "defaultNom" adlı parametrenin String türündeki değeri alınır. Bu parametrenin değeri bir kişinin adı olacaktır. Eğer bu parametre mevcut değilse, null değeri alınır.
  • 24-25. satırlar: "defaultNom" adlı parametre mevcut değilse, [defaultNom] değişkenine varsayılan bir değer atanır.
  • 26-29. satırlar: "defaultAge" adlı parametre için de aynı işlem yapılır.

doPost yöntemi, doGet yöntemine yönlendirir. Bu, müşterinin parametrelerini ister POST ister GET yoluyla gönderebileceği anlamına gelir.

doGet yöntemi:

  • 32. satır: Yöntem, request ve response olmak üzere iki parametre alır. request, müşterinin isteğinin tamamını temsil eden bir nesnedir. Bu nesne, bir arayüz olan HttpServletRequest türündedir. response ise yine bir arayüz olan HttpServletResponse türündedir. response nesnesi, müşteriye bir yanıt göndermek için kullanılır.
  • request.getParameter("param"), istemcinin isteğinden "param" adlı parametrenin değerini almak için kullanılır. 36. satırda "txtNom" parametresinin değeri, 40. satırda ise "txtAge" parametresinin değeri alınır. Bu parametreler istekte bulunmuyorsa, parametre değeri olarak null değeri alınır.
  • 37-39. satırlar: "txtNom" parametresi istekte bulunmuyorsa, "nom" değişkenine init yönteminde başlatılan varsayılan ad olan "defaultNom" atanır. Aynı işlem, 41-43. satırlarda yaş için de yapılır.
  • 45. satır: response.setContentType(String), HTTP Content-type başlığının değerini belirlemek için kullanılır. Bu başlık, istemciye alacağı belgenin türünü bildirir. text/html türü, bir HTML belgesini belirtir.
  • 46. satır: response.getWriter() işlevi, istemciye yönelik bir yazma akışı elde etmek için kullanılır
  • 47-78. satırlar: 46. satırda elde edilen yazma akışına, müşteriye gönderilecek HTML belgesini yazıyoruz.

Bu servletin derlenmesi, [personne] projesinin [build/classes] klasöründe bir .class dosyası oluşturacaktır:

Image

Okuyucunun, servlet'ler hakkında Java yardım belgesine başvurması önerilir. Bunun için Tomcat'ten yararlanılabilir. Tomcat 5'in giriş sayfasında, [Documentation] bağlantısı bulunmaktadır:

Image

Bu bağlantı, okuyucunun keşfetmesi için bir sayfaya yönlendirir. Servlet belgelerine giden bağlantı şöyledir:

Image

3.6.5. Servlet testi

Teste hazırız. Gerekirse Tomcat sunucusunu başlatalım.

Image

Ardından bir tarayıcıdan URL [http://localhost:8080/personne/formulaire] adresini isteyelim. Burada, [/personne] bağlamındaki [/formulaire] URL'sini istiyoruz. Bu bağlamdaki [web.xml] dosyası, [/formulaire] URL'sinin [formulairepersonne] adlı servlet tarafından işlendiğini belirtir. Aynı dosyada, bu servletin [istia.st.servlets.ServletFormulaire] sınıfı olduğu belirtilmektedir. Dolayısıyla Tomcat, istemci isteğinin işlenmesini bu sınıfa devredecektir. Sınıf henüz yüklenmemişse, yüklenecektir. Daha sonraki istekler için bellekte kalacaktır.

Eclipse’in dahili tarayıcısıyla şu sonuç elde edilir:

Image

Ad ve yaş için, [web.xml] dosyasında kayıtlı olan varsayılan değerleri alıyoruz. Şimdi URL ve [http://localhost:8080/personne/formulaire?txtNom=tintin&txtAge=30]'i isteyelim:

Image

Bu sefer, istekte geçirilen parametreleri alıyoruz. Bu iki sonucu anlamayan okuyucuların, [ServletFormulaire] servlet kodunu tekrar okumaları önerilir.

3.6.6. Web uygulaması bağlamının otomatik olarak yeniden yüklenmesi

Tomcat'i başlatalım:

Image

ardından servlet kodunu şu şekilde değiştirelim:

     // GET
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

         // form parametreleri alınır
        String nom = request.getParameter("txtNom");
        if (nom == null) {
            nom = "--"+defaultNom+"--";
        }
        String age = request.getParameter("txtAge");
        if (age == null) {
            age = defaultAge;
        }
...
  • 8. satır değiştirildi

Yeni sınıfı kaydedelim. Bu kaydetme işlemi, Eclipse tarafından [ServletFormulaire] sınıfının otomatik olarak yeniden derlenmesine neden olacak ve Tomcat bunu algılayacaktır. Ardından, değişiklikleri yansıtmak için [personne] web uygulaması bağlamını yeniden yükleyecektir. Bu işlem, [console] görünümündeki günlüklerde şu şekilde görünür:

Image

Tomcat'i yeniden başlatmadan [http://localhost:8080/personne/formulaire] URL'sini isteyelim:

Image

Yapılan değişiklik başarıyla yansıtılmıştır.

Şimdi, [web.xml] dosyasını şu şekilde değiştirelim:


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>personne</display-name>
    <servlet>
        <servlet-name>formulairepersonne</servlet-name>
...
        <init-param>
            <param-name>defaultNom</param-name>
            <param-value>INCONNU</param-value>
        </init-param>
...
    </servlet>
...
</web-app>
  • 12. satır değiştirildi

Bu işlem tamamlandıktan sonra, yeni [web.xml] dosyasını kaydedelim. [console] görünümünde, uygulama bağlamının yeniden yüklendiğini belirten herhangi bir günlük kaydı yok. Tomcat'i yeniden başlatmadan [http://localhost:8080/personne/formulaire] URL'sini isteyelim:

Image

Yapılan değişiklik dikkate alınmadı. Tomcat'i yeniden başlatalım: [clic droit sur serveur -> Restart -> Start]:

Image

ardından [http://localhost:8080/personne/formulaire] URL'sini tekrar isteyelim:

Image

Bu sefer [web.xml]'te yapılan değişiklik görülebilir.

Dolayısıyla, [web.xml]'te yapılan bir değişiklik, yeni yapılandırma dosyasını dikkate alacak şekilde uygulamanın otomatik olarak yeniden yüklenmesine neden olmaz. Web uygulamasının yeniden yüklenmesini zorlamak için, daha önce yaptığımız gibi Tomcat'i yeniden başlatabiliriz, ancak bu oldukça yavaş bir işlemdir. Tomcat’ta dağıtılmış uygulamaları yönetmek için [manager] aracını kullanmak daha tercih edilebilir bir yöntemdir. Bunun mümkün olabilmesi için, Eclipse içinde Tomcat’ın 2.5. paragrafta gösterildiği şekilde yapılandırılmış olması gerekir.

Öncelikle, Eclipse’in dahili tarayıcısıyla [http://localhost:8080] URL’sini açalım ve 2.5. paragrafın sonunda açıklandığı gibi [Tomcat Manager] bağlantısını takip edelim:

Image

İkinci bir tarayıcı açalım: [clic droit sur le navigateur -> New Editor]:

Bu ikinci tarayıcıda, [http://localhost:8080/formulaire] URL'sini çağıralım:

Image

[web.xml] dosyasını aşağıdaki şekilde değiştirelim ve kaydedelim:


<!--   ServletFormulaire -->
    <servlet>
        <servlet-name>formulairepersonne</servlet-name>
        <servlet-class>
            istia.st.servlets.personne.ServletFormulaire
        </servlet-class>
        <init-param>
            <param-name>defaultNom</param-name>
            <param-value>YYY</param-value>
        </init-param>
        <init-param>
            <param-name>defaultAge</param-name>
            <param-value>XXX</param-value>
        </init-param>
    </servlet>

Ardından [http://localhost:8080/formulaire] URL'sini tekrar isteyelim. Değişikliğin yansıtılmadığını görebiliriz. Şimdi ilk tarayıcıya gidip [personne] uygulamasını yeniden yükleyelim:

Image

Ardından ikinci tarayıcıyla [http://localhost:8080/formulaire] URL'sini tekrar çağıralım:

Image

[web.xml]'teki değişiklik dikkate alındı. Pratikte, bu tür durumları yönetmek için Tomcat'taki [manager] uygulamasını bir tarayıcıda açık tutmak yararlıdır.

3.7. Servlet ve JSP sayfalarının birlikte çalışması


Okuma listesi [ref1]: 2. bölüm: 2.3.7


İncelediğimiz iki mimariye geri dönelim:

Image

Bu iki mimariden hiçbiri tatmin edici değildir. Her ikisi de iki teknolojiyi bir araya getirme dezavantajına sahiptir: web uygulamasının mantığını oluşturan Java programlama teknolojisi ile tarayıcıda bilgilerin sunumunu sağlayan HTML kodlama teknolojisi.

  • [1] tabanlı çözümün, JSP sayfası içinde HTML kodu ile Java kodunu bir arada kullanma dezavantajı vardır. Ele aldığımız temel örnekte bunu görmedik. Ancak [formulaire.jsp], istemcinin isteğindeki [txtNom, txtAge] parametrelerinin geçerliliğini kontrol etmek zorunda olsaydı, sayfaya Java kodu eklemek zorunda kalırdık. Bu durum çok kısa sürede yönetilemez hale gelir.
  • Servlet tabanlı [2] çözümü de aynı sorunu barındırıyor. Sınıfta yalnızca Java kodu bulunmasına rağmen, bu sınıfın bir HTML belgesi oluşturması gerekiyor. Yine burada, HTML belgesi basit olmadığı sürece, bu belgenin oluşturulması karmaşık hale gelir ve bakımı neredeyse imkansızdır.

Aşağıdaki mimariyi benimseyerek Java ve HTML teknolojilerinin birbirine karışmasını önleyeceğiz:

Image

  • Kullanıcı isteğini servlete gönderir. Servlet bu isteği işler ve JSP [formulaire.jsp] sayfasının dinamik parametre değerlerini oluşturur; bu değerler, istemciye HTML yanıtını oluşturmak için kullanılır. Bu değerler, JSP sayfasının şablonunu oluşturur.
  • İşini tamamladıktan sonra, servlet, JSP ve [formulaire.jsp] sayfalarından müşteriye HTML yanıtını oluşturmasını isteyecektir. Aynı zamanda, JSP sayfasının bu yanıtı oluşturmak için ihtiyaç duyduğu öğeleri, yani sayfa modelini oluşturan öğeleri de ona sağlayacaktır.

Şimdi bu yeni mimariyi inceleyeceğiz.

3.7.1. [ServletFormulaire2] servleti

Yukarıdaki mimaride, servletin adı [ServletFormulaire2] olacaktır. Bu servlet, daha önce olduğu gibi [personne] projesinde oluşturulacak ve gelecekteki tüm servletler de aynı şekilde bu projeye eklenecektir:

Image

[ServletFormulaire2], öncelikle Eclipse içinde [ServletFormulaire]'in kopyalanıp yapıştırılmasıyla elde edilir:

  • [ServletFormulaire.java]'i seçin -> sağ tıklayın -> Kopyala
  • [istia.st.servlets.personne]'i seçin -> sağ tıklayın -> Yapıştır -> adını [ServletFormulaire2.java] olarak değiştirin

Ardından, [ServletFormulaire2] kodunu şu şekilde değiştiriyoruz:

package istia.st.servlets.personne;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class ServletFormulaire2 extends HttpServlet {

     // örnek parametreleri
    private String defaultNom = null;

    private String defaultAge = null;

     // başlatma
    public void init() {
         // servletin başlatma parametreleri alınır
        ServletConfig config = getServletConfig();
        defaultNom = config.getInitParameter("defaultNom");
        if (defaultNom == null)
            defaultNom = "NNNNNNNNNNNNNNN";
        defaultAge = config.getInitParameter("defaultAge");
        if (defaultAge == null)
            defaultAge = "AAA";
    }

     // GET
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

         // form parametrelerini alıyoruz
        String nom = request.getParameter("txtNom");
        if (nom == null) {
            nom = defaultNom;
        }
        String age = request.getParameter("txtAge");
        if (age == null) {
            age = defaultAge;
        }
         // form görüntülenir
        request.setAttribute("nom", nom);
        request.setAttribute("age", age);
        getServletContext().getRequestDispatcher("/formulaire2.jsp").forward(request, response);
    }

     // POST
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
         // kontrol GET'e devredilir
        doGet(request, response);
    }
}

Yalnızca HTTP yanıtının oluşturulmasıyla ilgili kısım değişmiştir (44-46. satırlar):

  • 46. satır: Yanıtın oluşturulması, JSP formulaire2.jsp sayfasına devredilmiştir. Henüz incelenmemiş olan bu sayfa, istemcinin isteğinden alınan parametreleri, bir adı (satır 35-38) ve bir yaşı (satır 39-42) görüntülemekle görevlendirilecektir.
  • Bu iki değer, anahtarlarla ilişkilendirilmiş olarak [request] isteğinin özniteliklerine yerleştirilir. Bir isteğin öznitelikleri bir sözlük gibi yönetilir.
  • 44. satır: isim, "isim" anahtarıyla ilişkilendirilerek sorguya eklenir
  • satır 45: yaş, "yaş" anahtarıyla ilişkilendirilerek sorguya eklenir
  • satır 46: JSP [formulaire2.jsp] sayfasının görüntülenmesini ister. Buna şu parametreler aktarılır:
  • istemcinin [request] sorgusu; bu sayede JSP sayfası, servlet tarafından az önce başlatılan bu sorgunun özniteliklerine erişebilir
  • [response] yanıtı; bu da JSP sayfasının müşteriye HTTP yanıtını oluşturmasına olanak tanıyacaktır

[ServletFormulaire2] sınıfı yazıldıktan sonra, derlenmiş kodu [build/classes]'te görünür:

Image

3.7.2. JSP sayfası [formulaire2.jsp]

JSP formulaire2.jsp sayfası, [formulaire.jsp] sayfasının kopyalanıp yapıştırılmasıyla elde edilir

Image

ve ardından şu şekilde dönüştürülmüştür:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
    // görüntüleme için gerekli değerler alınır
  String nom=(String)request.getAttribute("nom");
  String age=(String)request.getAttribute("age");  
%>

<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title>Personne - formulaire2</title>
  </head>
  <body>
      <center>
        <h2>Personne - formulaire2</h2>
      <hr>
      <form action="" method="post">
          <table>
            <tr>
              <td>Nom</td>
            <td><input name="txtNom" value="<%= nom %>" type="text" size="20"></td>
          </tr>
          <tr>
              <td>Age</td>
            <td><input name="txtAge" value="<%= age %>" type="text" size="3"></td>
          </tr>
        </table>
        <table>
            <tr>
              <td><input type="submit" value="Envoyer"></td>
            <td><input type="reset" value="Rétablir"></td>
            <td><input type="button" value="Effacer"></td>
          </tr>
        </table>
      </form>
    </center>
  </body>
</html>

[formulaire.jsp]'e kıyasla yalnızca 4-8. satırlar değişmiştir:

  • 6. satır: [request] isteğinde "nom" adlı özniteliğin değerini alır; bu öznitelik, [ServletFormulaire2] servlet'i tarafından oluşturulmuştur.
  • 7. satır: "age" özniteliği için de aynısını yapar

3.7.3. Uygulamanın yapılandırılması

[web.xml] yapılandırma dosyası şu şekilde değiştirilir:


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>personne</display-name>
    <!--  ServletFormulaire -->
    <servlet>
        <servlet-name>formulairepersonne</servlet-name>
        <servlet-class>
            istia.st.servlets.personne.ServletFormulaire
        </servlet-class>
        <init-param>
            <param-name>defaultNom</param-name>
            <param-value>inconnu</param-value>
        </init-param>
        <init-param>
            <param-name>defaultAge</param-name>
            <param-value>XXXX</param-value>
        </init-param>
    </servlet>
     <!--  ServletFormulaire 2-->
    <servlet>
        <servlet-name>formulairepersonne2</servlet-name>
        <servlet-class>
            istia.st.servlets.personne.ServletFormulaire2
        </servlet-class>
        <init-param>
            <param-name>defaultNom</param-name>
            <param-value>inconnu</param-value>
        </init-param>
        <init-param>
            <param-name>defaultAge</param-name>
            <param-value>XXX</param-value>
        </init-param>
    </servlet>
    <!--  Eşleme ServletFormulaire -->
    <servlet-mapping>
        <servlet-name>formulairepersonne</servlet-name>
        <url-pattern>/formulaire</url-pattern>
    </servlet-mapping>
     <!--  Eşleme ServletFormulaire 2-->
    <servlet-mapping>
        <servlet-name>formulairepersonne2</servlet-name>
        <url-pattern>/formulaire2</url-pattern>
    </servlet-mapping>
    <!--  ana sayfalar -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

Mevcut yapı korunmuş ve aşağıdakiler eklenmiştir:

  • 22-36. satırlar: yeni ServletFormulaire2 servletini tanımlamak için bir <servlet> bölümü
  • 42-46. satırlar: URL /formulaire2 ile ilişkilendirmek için bir <servlet-mapping> bölümü

Gerekirse Tomcat sunucusunu başlatın veya yeniden başlatın. URL'i çağırıyoruz

http://localhost:8080/personne/formulaire2?txtNom=milou&txtAge=10:

Image

Daha önce elde ettiğimiz sonuçla aynı sonucu elde ediyoruz, ancak uygulamamızın yapısı artık daha net: uygulama mantığını içeren ve müşteriye yanıtın gönderilmesini JSP sayfasına devreden bir servlet. Bundan sonra her zaman bu şekilde ilerleyeceğiz.