Skip to content

9. MVC [personne] web uygulaması – sürüm 4

Bu sürüm, daha önce tanıtılan JSTL etiket kütüphanesini kullanmaktadır.

9.1. Eclipse Projesi

[/personne4] web uygulamasının Eclipse projesi [mvc-personne-04]'i oluşturmak için, sayfa 78'deki 6.2 numaralı paragrafta açıklanan prosedürü izleyerek [mvc-personne-03] projesini kopyalayacağız.

9.2. [personne4] web uygulamasının yapılandırılması

/personne4 uygulamasının web.xml dosyası şu şekildedir:


<?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>mvc-personne-04</display-name>
    ...

Bu dosya, web uygulamasının görüntüleme adının [mvc-personne-04] olarak değiştiği 6. satır dışında önceki sürümdekiyle aynıdır.

[index.jsp] ana sayfası şu şekilde değişir:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<c:redirect url="/main"/>
  • 5. satır: [index.jsp] sayfası, kullanıcıyı [/main] URL'sine yönlendirir; bu URL, [/personne4] uygulamasının [ServletPersonne] denetleyicisine götürür. <c:redirect> etiketi, JSTL / Core kütüphanesine aittir. Bu etiketin özelliği, [url] özniteliğindeki URL’yi şu şekilde tamamlamasıdır:
  • [/contexte] önekini; burada [contexte], uygulamanın bağlamıdır (bu örnekte [personne4]).
  • isteği yapan tarayıcı bir oturum çerezi göndermediyse [?jsessionid=id_session] soneki. [jsessionid] kimliği, web sunucusu tarafından istemcilere gönderilen oturum jetonunun kimliğini belirtir. Bu, web sunucusuna bağlıdır. Burada, Tomcat sunucusuna ait olanıdır. [id_session] ise oturum jetonunun kendisidir.

Dolayısıyla, 5. satırdaki [index.jsp]'in gerçek yönlendirme URL'si, [/personne4/main?jsessionid=XX]'tir; burada XX oturum jetonudur. Aşağıdaki sayfa, başlangıçta [http://localhost:8080/personne4] URL'sini talep ettikten sonra elde edilen sonuçtur:

Image

<c:redirect> etiketi ile oturum jetonu arasındaki bağlantı oldukça inceliklidir. Bu konuyu burada incelemek için henüz erken, ancak ileride bu konuya tekrar değineceğiz.

9.3. Görünüm kodları

9.3.1. [formulaire] görünümü

Bu görünümde herhangi bir değişiklik yapılmamıştır:

Image

Aşağıdaki JSP [formulaire.jsp] sayfası tarafından oluşturulur:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<html>
  <head>
    <title>Personne - formulaire</title>
    <script language="javascript">
...
      </script>
  </head>
  <body>
    <center>
      <h2>Personne - formulaire</h2>
      <hr>
      <form name="frmPersonne" 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>
          <tr>
        </table>
        <table>
          <tr>
            <td><input type="submit" value="Submit"></td>
            <td><input type="button" value="[Envoyer]" onclick="envoyer()"></td>
            <td><input type="reset" value="Rétablir"></td>
            <td><input type="button" value="[Effacer]" onclick="effacer()"></td>
          </tr>
        </table>
        <input type="hidden" name="action" value="validationFormulaire">
      </form>
    </center>
  </body>
</html>

Yenilikler:

  • 4. satır: JSTL / Core etiket kütüphanesinin tanımlanması
  • 21. ve 25. satırlar: Sayfa şablonunda [nom, age] özniteliklerinin alınması. Bu özniteliklerin, JSP sayfasının [request] isteğinde, [session] oturumunda ve [application] uygulamasında sırayla aranacağını hatırlatmak isteriz. Bizim durumumuzda, denetleyici bunları oturuma yerleştirecektir.
  • Önceki işlem nedeniyle, JSP sayfasının başında sayfa şablonunu almak için artık Java kodu bulunmamaktadır.

9.3.2. [reponse] görünümü

Bu görünümde herhangi bir değişiklik yoktur:

JSP [reponse.jsp] adlı yeni sayfa ş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">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Personne - réponse</h2>
    <hr>
    <table>
        <tr>
          <td>Nom</td>
        <td>${nom}</td>
      </tr>
        <tr>
          <td>Age</td>
        <td>${age}</td>
      </tr>
    </table>      
    <br>
    <form name="frmPersonne" method="post">
      <input type="hidden" name="action" value="retourFormulaire">
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>

Yenilikler:

  • 4. satır: JSTL / Core etiket kütüphanesinin tanımlanması
  • 16., 20. ve 28. satırlar: Sayfa şablonunda [nom, age, lienRetourFormulaire] özniteliklerinin alınması. Artık bunu almak için sayfanın başında JSP Java kodu bulunmamaktadır.

9.3.3. [erreurs] görünümü

Bu görünümde herhangi bir değişiklik yapılmamıştır:

JSP [erreurs.jsp] adlı yeni sayfa ş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">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Les erreurs suivantes se sont produites</h2>
    <ul>
            <c:forEach var="erreur" items="${erreurs}">
                <li>${erreur}</li>
            </c:forEach>
    </ul>
    <br>
    <form name="frmPersonne" method="post">
      <input type="hidden" name="action" value="retourFormulaire">
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>

Yenilikler:

  • 4. satır: JSTL / Core etiket kütüphanesinin tanımlanması
  • 13-15. satırlar: JSTL kullanılarak hata listesinin görüntülenmesi
  • Sayfanın başında, sayfa şablonunu almak için JSP Java kodu artık bulunmamaktadır.

9.4. Görünüm testleri

Yukarıdaki görünümlerin testlerini gerçekleştirmek için, Eclipse projesindeki /WebContent/JSP klasörüne JSP sayfalarını kopyalıyoruz:

Image

Ardından, JSP klasöründeki sayfalar şu şekilde değiştirilir:

[formulaire.jsp]:


...
<%
  // -- test: sayfa şablonu oluşturuluyor
  session.setAttribute("nom","tintin");
  session.setAttribute("age","30");
%>

<html>
  <head>

Sayfanın ihtiyaç duyduğu şablonu oluşturmak için 4-5. satırlar eklenmiştir.

[reponse.jsp]:


...
<%
  // -- test: sayfa şablonu oluşturulur
  request.setAttribute("nom","milou");
  request.setAttribute("age","10");
  request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>


<html>
  <head>

...

Sayfanın ihtiyaç duyduğu şablonu oluşturmak için 4-6. satırlar eklenmiştir.

[erreurs.jsp] :



<%
  // -- test: sayfa şablonu oluşturuluyor
  ArrayList<String> erreurs1=new ArrayList<String>();
  erreurs1.add("erreur1");
  erreurs1.add("erreur2");
  request.setAttribute("erreurs",erreurs1);
  request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>

<html>
  <head>

Sayfanın ihtiyaç duyduğu şablonu oluşturmak için 4-8. satırlar eklenmiştir.

Henüz yapmadıysanız Tomcat'i başlatın ve ardından aşağıdaki URL'leri isteyin:

 

Beklediğimiz görünümleri elde ediyoruz.

9.5. [ServletPersonne] denetleyicisi

[/personne3] web uygulamasının [ServletPersonne] denetleyicisi aşağıdaki eylemleri işleyecektir:

No
istek
kaynak
işlem
1
[GET /personne4/main]
kullanıcı tarafından girilen URL
- boş [formulaire] görünümünü gönder
2
[POST /personne4/main]
parametrelerle [txtNom,
txtAge,
action=validationFormulaire]
gönderildi
düğmeye tıklandığında
[Envoyer] düğmesine tıklama
[formulaire]
- [txtNom, txtAge] parametrelerinin değerlerini kontrol edin
- değerler yanlışsa, [erreurs(erreurs)] görünümünü gönderin
- değerler doğruysa, [reponse(nom,age)] görünümünü gönderin
3
[POST /personne4/main]
parametrelerle birlikte
[action=retourFormulaire]
gönderildi
[Forma geri dön] bağlantısına tıklayın
form] bağlantısına tıklayın
[réponse] ve [erreurs].
- En son girilen değerlerle önceden doldurulmuş [formulaire] görünümünü gönderin

[ServletPersonne] denetleyicisinin iskeleti, önceki sürümünkiyle aynıdır. [doInit, doValidationFormulaire, doRetourFormulaire] yöntemlerinde yapılan değişiklikleri gözden geçiriyoruz; [init, doGet, doPost] yöntemlerinde ise herhangi bir değişiklik yapılmamıştır.

9.5.1. [doInit] yöntemi

Bu yöntem, 1 numaralı [GET /personne4/main] isteğini işler. Kod şöyledir:

1
2
3
4
5
6
     // boş formun görüntülenmesi
    void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
}

Yenilikler:

  • 3. satır: [formulaire] görünümü görüntülenir. Bu görünüm, şablonunda "ad" ve "yaş" özniteliklerini bekler. Kontrolör bu öznitelikleri şablona eklemediği için görünümde bu öznitelikler bulunmayacaktır. Bu durumda, JSTL kütüphanesi bu öznitelikler için null işaretçilerini alacaktır. Bu durum hata oluşturmaz ve [formulaire] görünümündeki ${nom} ve ${age} öğeleri için boş değerler görüntülenir. Bu durum bizim için uygundur. Böylece, [formulaire] görünümünün şablonunu başlatmak zorunda kalmıyoruz.

9.5.2. [doValidationFormulaire] yöntemi

Bu yöntem, gönderilen öğeler arasında [POST /personne4/main] numaralı isteği [action, txtNom, txtAge] ile birlikte işler. Kod şu şekildedir:

     // formun doğrulanması
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
                 // parametreleri alıyoruz
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // ve oturumda saklanıyor
        HttpSession session = request.getSession(true);        
        session.setAttribute("nom", nom);
        session.setAttribute("age", age);
         // parametrelerin doğrulanması
...
         // parametreler doğru - yanıt sayfası gönderiliyor
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request,
                response);
        return;
    }

Yenilikler:

  • 15. satır: [doValidationFormulaire] yöntemi, yanıt olarak [réponse] görünümünü gönderir. Bu görünümün şablonunda [nom, age, lienRetourFormulaire] öğeleri bulunur. [lienRetourFormulaire], sorgu aracılığıyla 14. satırdaki şablona eklenir. [nom,age] öğeleri ise oturum aracılığıyla şablonun 8-10. satırlarına eklenir. Önceki sürümde, [nom, age] öğeleri de [réponse] görünümünü gönderirken isteğe eklenmişti, çünkü bu görünüm bu öğeleri orada bekliyordu. Burada, JSTL kütüphanesi ile, model öğelerini bulmak için farklı bağlamların (istek, oturum, uygulama) taranacağı bilinmektedir. Kontrolör bunları oturuma eklediği için (8-10. satırlar), bu öğeler oturumda bulunacaktır.

9.5.3. [doRetourFormulaire] yöntemi

Bu yöntem, gönderilen öğeler arasında [action=retourFormulaire] bulunan 3 numaralı [POST /personne4/main] isteğini işler. Kod şu şekildedir:

1
2
3
4
5
6
7
     // önceden doldurulmuş form görüntüleniyor
    void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
         // form görüntüleniyor
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
    }

Yenilikler:

  • 4. satır: [formulaire] görünümü görüntülenir. Bu görünüm, şablonunda "ad" ve "yaş" özniteliklerini bekler. [doValidationFormulaire] yöntemi bu öznitelikleri oturuma eklediği ve bu yöntemin mutlaka [doRetourFormulaire] yönteminden önce yürütüldüğü için, model bu öznitelikleri oturumda bulacaktır. Dolayısıyla, 4. satırda görüntülenmeden önce [formulaire] modelini başlatmaya gerek yoktur. Böylece, [doInit] ve [doRetourFormulaire] yöntemleri aynı hale gelir ve [retourFormulaire] eylemini silip yerine [init] eylemini koyabiliriz. Böylece [doRetourFormulaire] yöntemi de ortadan kalkacaktır.

9.6. Tests

Bu yeni sürümde yalnızca görünümler değişmektedir. [ServletPersonne] denetleyicisi ise değişmemektedir. JSTL'in kullanılması, JSP sayfalarında denetleyici tarafından oluşturulan şablonu daha kolay bir şekilde kullanmamızı sağlamıştır.

Eclipse projesini [personne-mvc-04]'e entegre ettikten sonra Tomcat'i başlatın veya yeniden başlatın. [http://localhost:8080/personne4] URL'sini çağırın.