Skip to content

6. MVC web uygulaması [personne] – sürüm 2

Şimdi, önceki [/personne1] uygulamasının, [/personne2, /personne3, ...] adını vereceğimiz varyantlarını sunacağız. Bu varyantlar, uygulamanın aşağıdaki gibi kalan ilk mimarisini değiştirmez:

Image

Bu varyantlar için açıklamalarımızı daha kısa tutacağız. Yalnızca önceki sürüme göre yapılan değişiklikleri sunacağız.

6.1. Introduction

Şimdi uygulamamıza bir oturum yönetimi özelliği eklemeyi planlıyoruz. Aşağıdaki noktaları hatırlayalım:

  • HTTP istemci-sunucu diyaloğu, birbirinden bağımsız bir dizi istek-yanıt sekansından oluşur
  • oturum, aynı kullanıcının farklı istek-yanıt dizileri arasında bir bellek görevi görür. N kullanıcı varsa, N oturum vardır.

Aşağıdaki ekran dizisi, uygulamanın işleyişinde artık neyin istenildiğini göstermektedir:


1. Alışveriş


demande
réponse

Yenilik, [erreurs] görünümüne eklenen forma geri dönüş bağlantısından kaynaklanmaktadır.


Değişim No. 2


demande
réponse

1 numaralı iletişimde, kullanıcı (ad, yaş) çifti için (xx, yy) değerlerini vermiştir. İletişim sırasında sunucu bu değerleri öğrenmiş olsa bile, iletişimin sonunda bunları "unutur". Oysa 2 numaralı iletişim sırasında, sunucunun yanıtında bu değerleri yeniden görüntüleyebildiği görülmektedir. Burada, web sunucusunun ardışık istemci-sunucu iletişimleri boyunca verileri hatırlamasını sağlayan kavram, oturum kavramıdır. Bu sorunu çözmek için başka çözümler de mümkündür.

1 numaralı iletişim sırasında sunucu, 2 numaralı iletişim sırasında bunları görüntüleyebilmek için müşterinin kendisine gönderdiği (ad, yaş) çiftini oturumda saklayacaktır.

İşte iki iletişim arasında oturumun uygulanmasına dair başka bir örnek:


1. İletişim


demande
réponse

Yenilik, yanıt sayfasına eklenen forma geri dönme bağlantısından kaynaklanıyor.


2. Değişim


demande
réponse

6.2. Eclipse Projesi

[/personne2] web uygulamasının Eclipse projesi [mvc-personne-02]'i oluşturmak için, mevcut yapıyı devralmak üzere [mvc-personne-01] Eclipse projesini kopyalayacağız. Bunun için aşağıdaki adımları izleyin:

[clic droit sur projet mvc-personne-01 -> Copy]:

Image

ardından [clic droit dans Package Explorer -> Paste]:

- [1]'te yeni projenin adını, [2]'te ise mevcut ancak boş bir klasörün adını belirtelim

Böylece [mvc-personne-02] projesi oluşturulur:

Image

Şu an için [mvc-personne-01] projesiyle aynıdır. Kullanabilmemiz için önce elle birkaç değişiklik yapmamız gerekecek. [Servers] görünümüne gidelim ve bu yeni uygulamayı Tomcat tarafından yönetilen uygulamalara eklemeyi deneyelim:

Görüldüğü üzere, [1]'te yeni proje [mvc-personne-02], Tomcat tarafından algılanmıyor. Tomcat'in bu projeyi algılaması için [mvc-personne-02] projesinin yapılandırma dosyasında bir değişiklik yapılması gerekiyor. [File / Open File] seçeneğini kullanarak [<mvc-personne-02>/.settings/.component] dosyasını açalım:


<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId">
<wb-module deploy-name="mvc-personne-01">
<wb-resource deploy-path="/" source-path="/WebContent"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
<property name="java-output-path" value="/build/classes/"/>
<property name="context-root" value="personne1"/>
</wb-module>
</project-modules>
  1. satır, Tomcat içinde dağıtılacak web modülünün adını belirtir. Bu ad, burada [mvc-personne-01] projesinin adıyla aynıdır. Bunu [mvc-personne-02] olarak değiştiriyoruz:

<wb-module deploy-name="mvc-personne-02">

Ayrıca, bu fırsatı değerlendirerek 7. satırda, [mvc-personne-02] uygulama bağlamının adını da değiştirebiliriz; bu ad, [mvc-personne-01] projesinin adıyla çakışmaktadır:


<property name="context-root" value="personne2"/>

Bu ikinci değişiklik doğrudan Eclipse içinde yapılabilirdi. Ancak, yapılandırma dosyasını kullanmadan ilk değişikliği nasıl yapabileceğimi bulamadım.

Bunu yaptıktan sonra, yeni [.content] dosyasını kaydedip, değişikliklerin uygulanması için Eclipse'ten çıkıp yeniden başlatıyoruz.

Eclipse yeniden başlatıldıktan sonra, daha önce başarısız olan işlemi tekrar deneyelim:

Bu sefer [mvc-personne-02] projesi doğru şekilde algılanıyor. Bu projeyi, Tomcat tarafından çalıştırılmak üzere yapılandırılmış projelere ekliyoruz:

Image

6.3. [personne2] web uygulamasının yapılandırılması

/personne2 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-02</display-name>
    <!--  ServletPersonne -->
    <servlet>
        <servlet-name>personne</servlet-name>
        <servlet-class>
            istia.st.servlets.personne.ServletPersonne
        </servlet-class>
        <init-param>
            <param-name>urlReponse</param-name>
            <param-value>
                /WEB-INF/vues/reponse.jsp
            </param-value>
        </init-param>
        <init-param>
            <param-name>urlErreurs</param-name>
            <param-value>
                /WEB-INF/vues/erreurs.jsp
            </param-value>
        </init-param>
        <init-param>
            <param-name>urlFormulaire</param-name>
            <param-value>
                /WEB-INF/vues/formulaire.jsp
            </param-value>
        </init-param>
        <init-param>
            <param-name>urlControleur</param-name>
            <param-value>
                main
            </param-value>
        </init-param>
        <init-param>
            <param-name>lienRetourFormulaire</param-name>
            <param-value>
                Retour au formulaire
            </param-value>
        </init-param>
    </servlet>
    <!--  Eşleme ServletPersonne-->
    <servlet-mapping>
        <servlet-name>personne</servlet-name>
        <url-pattern>/main</url-pattern>
    </servlet-mapping>
    <!--  ana sayfalar -->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Bu dosya, önceki sürümdekiyle aynıdır; ancak iki yeni başlatma parametresi bildirmiştir:

  • 6. satır: Web uygulamasının görüntüleme adı [mvc-personne-02] olarak değiştirilmiştir
  • 31-36. satırlar: [urlControleur] adlı yapılandırma parametresini tanımlar; bu, [main] URL'sidir ve [ServletPersonne] servletine yönlendirir
  • 37-42. satırlar: [lienRetourFormulaire] adlı bir yapılandırma parametresini tanımlar; bu, JSP, [erreurs.jsp] ve [reponse.jsp] sayfalarından forma geri dönme bağlantısının metnidir.

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


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
  response.sendRedirect("/personne2/main");
%>
  • 5. satır: [index.jsp] sayfası, müşteriyi [/personne2] uygulamasının [ServletPersonne] denetleyicisinin URL'sine yönlendirir.

6.4. Görünüm kodları

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

Bu görünüm, önceki sürümdekiyle aynıdır:

Image

Aşağıdaki JSP ve [formulaire.jsp] sayfaları 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">
<%
    // şablondaki veriler alınır
  String nom=(String)session.getAttribute("nom");
  String age=(String)session.getAttribute("age");
  String urlAction=(String)request.getAttribute("urlAction");
%>
    
<html>
    <head>
      <title>Personne - formulaire</title>
  </head>
  <body>
      <center>
        <h2>Personne - formulaire</h2>
      <hr>
      <form action="<%=urlAction%>" 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="Envoyer"></td>
            <td><input type="reset" value="Rétablir"></td>
            <td><input type="button" value="Effacer"></td>
          </tr>
        </table>
        <input type="hidden" name="action" value="validationFormulaire"> 
      </form>
    </center>
  </body>
</html>

Yenilikler:

  • 19. satırda, form artık [action] özniteliğine sahiptir; bu özniteliğin değeri, kullanıcı [Envoyer] türündeki düğmeye tıkladığında tarayıcının form değerlerini göndereceği URL'dir. [urlAction] değişkeninin değeri action="main" olacaktır. [formulaire] görünümü, kullanıcının aşağıdaki eylemlerinden sonra görüntülenir:
  • ilk istek: GET /personne2/main
  • [Retour au formulaire] bağlantısına tıklama: GET /personne2/main?action=retourFormulaire

[action] özniteliği, mutlak bir URL (/ ile başlayan) değil, göreceli bir URL (/ ile başlamayan) belirttiğinden, tarayıcı şu anda görüntülenen sayfanın URL'sinin ilk kısmını ([/personne2]) kullanacak ve buna göreceli URL'yi ekleyecektir. Dolayısıyla POST'in URL'si, denetleyicinin URL'si olan [/personne2/main] olacaktır. Bu POST isteğine, 23., 27. ve 38. satırlardaki [txtNom, txtAge, action] parametreleri eşlik edecektir.

  • 8. satır: Şablondaki [urlAction] öğesinin değeri alınır. Bu değer, geçerli isteğin özniteliklerinde aranır. Bu değer 19. satırda kullanılacaktır.
  • 6-7. satırlar: Modeldeki [nom, age] öğelerinin değerleri alınır. Bu değerler, önceki sürümde olduğu gibi sorgunun özniteliklerinde değil, oturumun özniteliklerinde aranır. Bu, [réponse] ve [erreurs] görünümlerinin bağlantısındaki [GET /personne2/main?action=retourFormulaire] sorgusunun gereksinimlerini karşılamak içindir. Bu iki görünümü görüntülemeden önce, denetleyici formda girilen verileri oturuma kaydeder; bu sayede kullanıcı, [réponse] ve [erreurs] görünümlerinin [Retour au formulaire] bağlantısını kullandığında bu verileri bulabilir.

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

Bu görünüm, formda girilen değerler geçerli olduğunda bunları görüntüler:

Önceki sürüme kıyasla, yenilik [Retour au formulaire] bağlantısından kaynaklanmaktadır. Görünüm, aşağıdaki JSP ve [reponse.jsp] sayfaları 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">


<%
    // model verilerini alıyoruz
  String nom=(String)request.getAttribute("nom");
  String age=(String)request.getAttribute("age");
  String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Personne - réponse</h2>
    <hr>
    <table>
        <tr>
          <td>Nom</td>
        <td><%= nom %>
      </tr>
        <tr>
          <td>Age</td>
        <td><%= age %>
      </tr>
    </table>      
    <br>
    <a href="?action=retourFormulaire"><%= lienRetourFormulaire %></a>
  </body>
</html>
  • 31. satır: forma geri dönme bağlantısı. Bu bağlantının iki bileşeni vardır:
    • hedef [href="?action=retourFormulaire"]. [réponse] görünümü, [formulaire.jsp] formunun POST görünümünden sonra, [/personne2/main] URL'sinde görüntülenir. Dolayısıyla, [réponse] görünümü görüntülendiğinde tarayıcıda bu son URL görüntülenir. [Retour au formulaire] bağlantısına tıklandığında, tarayıcı, bağlantının [href] özniteliğinde belirtilen URL'ye (burada "?action=retourFormulaire") bir GET isteği gönderir. [href]'te bir URL bulunmadığında, tarayıcı o anda görüntülenmekte olan görünümün URL'sini kullanır: c.a.d. [/personne2/main]. Sonuç olarak, [Retour au formulaire] bağlantısına tıklandığında tarayıcı, [/personne2/main?action=retourFormulaire] URL'sine bir GET isteği gönderir; c.a.d, uygulama denetleyicisinin URL'si, ne yapması gerektiğini belirtmek için [action] parametresiyle birlikte gönderilir.
    • Bağlantı metni. Bu metin, denetleyici tarafından sayfaya iletilen ve 10. satırda alınan şablonun bir parçası olacaktır.

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

Bu görünüm, formdaki giriş hatalarını bildirir:

Önceki sürüme kıyasla, yenilik [Retour au formulaire] bağlantısından kaynaklanmaktadır. Görünüm, aşağıdaki JSP [erreurs.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">
<%@ page import="java.util.ArrayList" %>

<%
// model verilerini alıyoruz
  ArrayList erreurs=(ArrayList)request.getAttribute("erreurs"); 
  String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Les erreurs suivantes se sont produites</h2>
    <ul>
        <%
          for(int i=0;i<erreurs.size();i++){
            out.println("<li>" + (String) erreurs.get(i) + "</li>\n");
        }//for
      %>
    </ul>
    <br>
    <a href="?action=retourFormulaire"><%= lienRetourFormulaire %></a>
  </body>
</html>

  • 26. satır: forma geri dönüş bağlantısı. Bu bağlantı, [réponse] görünümündeki bağlantı ile aynıdır. Okuyucunun, gerekirse bu görünüm için verilen açıklamaları tekrar okumasını öneririz.

6.5. Görünümlerin test edilmesi

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");
  request.setAttribute("urlAction","main");
%>

<%
    // şablondan veriler alınır
  String nom=(String)session.getAttribute("nom");
  String age=(String)session.getAttribute("age");
  String urlAction=(String)request.getAttribute("urlAction");
%>

Sayfa 11-13'ü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");
%>

<%
    // şablondan verileri alıyoruz
  String nom=(String)request.getAttribute("nom");
  String age=(String)request.getAttribute("age");
  String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>


4-6. satırlar, 11-13. satırlarda yer alan sayfanın ihtiyaç duyduğu şablonu oluşturmak için 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");
%>

<%
// şablondan veriler alınır
  ArrayList erreurs=(ArrayList)request.getAttribute("erreurs"); 
  String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>


4-8. satırlar, 13-14. satırlardaki sayfanın ihtiyaç duyduğu şablonu oluşturmak için eklenmiştir.

Henüz yapılmadıysa Tomcat'i başlatalım ve ardından aşağıdaki URL'leri çağıralım:

 

Beklediğimiz görünümleri alıyoruz.

6.6. [ServletPersonne] denetleyicisi

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

No
istek
kaynak
işlem
1
[GET /personne2/main]
kullanıcı tarafından girilen URL
- boş [formulaire] görünümünü gönder
2
[POST /personne2/main]
parametrelerle [txtNom,
txtAge, eylem] gönderildikten sonra
düğmeye tıklayın
[Envoyer] düğmesine tıklayın
[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
[GET /kişi2/ana?
action=retourFormulaire]
[Forma Geri Dön] bağlantısına tıklayın
] bağlantısına tıklayın
yanıt] ve [erreurs].
- en son girilen değerlerle önceden doldurulmuş [formulaire] görünümünü gönder

Böylece işlenecek yeni bir eylemimiz var: [GET /personne2/main?action=retourFormulaire].

6.6.1. Denetleyicinin iskeleti

[ServletPersonne] denetleyicisinin iskeleti, önceki sürümünkiyle neredeyse aynıdır:

package istia.st.servlets.personne;

...
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class ServletPersonne extends HttpServlet {
    ...

     // başlatma
    @SuppressWarnings("unchecked")
    public void init() throws ServletException {
        ...
    }

    @SuppressWarnings("unchecked")
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
...
    }

     // boş formun görüntülenmesi
    void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        ...
    }

     // önceden doldurulmuş formun görüntülenmesi
    void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        ...
    }

     // formun doğrulanması
    void doValidationFormulaire(HttpServletRequest request,
    ...
    }

     // gönderme
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    ...
    }
}

Yenilikler:

  • 4. satır: Oturum kullanımı nedeniyle [HttpSession] paketinin içe aktarılması gerekiyor
  • 28-30. satırlar: Yeni [doRetourFormulaire] yöntemi, yeni eylemi işler: [GET /personne2/main?action=retourFormulaire].

6.6.2. [init] denetleyicisinin başlatılması

[init] yöntemi, önceki sürümdekiyle aynıdır. Bu yöntem, [web.xml] dosyasında [paramètres] tablosunda bildirilen öğelerin mevcut olup olmadığını kontrol eder:

1
2
3
4
5
6
public class ServletPersonne extends HttpServlet {
     // örnek parametreleri
    private String urlErreurs = null;
    private ArrayList erreursInitialisation = new ArrayList<String>();
    private String[] paramètres={"urlFormulaire","urlReponse","urlControleur","lienRetourFormulaire"};
  private Map params=new HashMap<String,String>();
  • 5. satır: [urlControleur] (denetleyicinin URL'si) ve [lienRetourFormulaire] ([réponse] ve [erreurs] görünümlerinin bağlantı metni) parametreleri eklenmiştir.

6.6.3. [doGet] yöntemi

[doGet] yöntemi, daha önce mevcut olmayan [GET /personne2/main?action=retourFormulaire] eylemini işlemelidir:

        @SuppressWarnings("unchecked")
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

         // servletin başlatılmasının nasıl gerçekleştiği kontrol edilir
        if (erreursInitialisation.size() != 0) {
             // hata sayfasına yönlendiriliyor
            request.setAttribute("erreurs", erreursInitialisation);
            request.setAttribute("lienRetourFormulaire", "");
            getServletContext().getRequestDispatcher(urlErreurs).forward(
                    request, response);
             // son
            return;
        }
         // isteği gönderen yöntemi alınıyor
        String méthode=request.getMethod().toLowerCase();
         // yürütülecek eylemi alıyoruz
        String action=request.getParameter("action");
         // eylem?
        if(action==null){
            action="init";
        }
         // eylemin yürütülmesi
        if(méthode.equals("get") && action.equals("init")){
             // uygulamanın başlatılması
            doInit(request,response);
            return;
        }
        if(méthode.equals("post") && action.equals("validationFormulaire")){
             // giriş formunun doğrulanması
            doValidationFormulaire(request,response);
            return;
        }
        if(méthode.equals("get") && action.equals("retourFormulaire")){
             // giriş formuna geri dönüş
            doRetourFormulaire(request,response);
            return;
        }
         // diğer durumlar
        doInit(request,response);
    }
  • 6-14. satırlar: Başlatma hataları listesinin boş olup olmadığı kontrol edilir. Boş değilse, hatayı veya hataları bildirecek olan [erreurs(erreursInitialisation)] görünümü görüntülenir.

Bu kodu anlamak için [erreurs] görünümünün şablonunu hatırlamak gerekir:


<%
// şablondan veriler alınır
  ArrayList erreurs=(ArrayList)request.getAttribute("erreurs"); 
  String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>

[erreurs] görünümü, istekte "hatalar" anahtar öğesini bekler. Denetleyici bu öğeyi 8. satırda oluşturur. Ayrıca "lienRetourFormulaire" anahtar öğesini de bekler. Denetleyici bu öğeyi 9. satırda oluşturur. Burada bağlantının metni boş olacaktır. Dolayısıyla, gönderilen [erreurs] görünümünde herhangi bir bağlantı olmayacaktır. Zira, uygulamanın başlatılmasında hatalar meydana gelmişse, uygulamanın yeniden yapılandırılması gerekir. Kullanıcıya bir bağlantı aracılığıyla uygulamaya devam etmesini önermenin bir anlamı yoktur.

  • 34-37. satırlar: yeni [GET /personne2/main?action=retourFormulaire] eyleminin işlenmesi

6.6.4. [doInit] yöntemi

Bu yöntem, 1 numaralı [GET /personne2/main] isteğini işler. Bu istekte, [formulaire(nom,age)] görünümünü boş olarak göndermelidir. Kod şöyledir:

     // boş formun görüntülenmesi
    void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
         // kullanıcının oturum bilgilerini alıyoruz
        HttpSession session = request.getSession(true);        
         // boş formun gönderilmesi
        session.setAttribute("nom", "");
        session.setAttribute("age", "");
        request.setAttribute("urlAction", (String)params.get("urlControleur"));
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
    }
  • 4. satır: Mevcut oturum varsa alınır, yoksa oluşturulur (getSession'in true parametresi).
  • 9-10. satırlar: [formulaire] görünümü görüntülenir. Bu görünümün beklediği şablonu hatırlayalım:

<%
    // modelden veriler alınır
  String nom=(String)session.getAttribute("nom");
  String age=(String)session.getAttribute("age");
  String urlAction=(String)request.getAttribute("urlAction");
%>
  • 6-7. satırlar: [formulaire] görünüm modelindeki [nom,age] öğeleri boş dizelerle başlatılır ve oturuma yerleştirilir; çünkü görünüm bu öğeleri burada beklemektedir.
  • 8. satır: Modelin [urlAction] öğesi, [web.xml] dosyasındaki [urlControleur] parametresinin değeriyle başlatılır ve sorguya yerleştirilir.

6.6.5. [doValidationFormulaire] yöntemi

Bu yöntem, gönderilen parametrelerin [action, txtNom, txtAge] olduğu 2 numaralı [POST /personne2/main] isteğini işler. Kod şu şekildedir:

     // formun doğrulanması
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
         // parametreleri alınır
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // oturumda saklanan parametreler
        HttpSession session = request.getSession(true);        
        session.setAttribute("nom", nom);
        session.setAttribute("age", age);
         // parametrelerin doğrulanması
        ArrayList<String> erreursAppel = new ArrayList<String>();
         // ad alanı boş olmamalıdır
        nom = nom.trim();
        if (nom.equals(""))
            erreursAppel.add("Le champ [nom] n'a pas été rempli");
         // yaş, 0'dan büyük bir tamsayı olmalıdır
        if (!age.matches("^\\s*\\d+\\s*$"))
            erreursAppel.add("Le champ [age] est erroné");
         // parametrelerde hata mı var?
        if (erreursAppel.size() != 0) {
             // hata sayfası gönderiliyor
            request.setAttribute("erreurs", erreursAppel);
            request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
            getServletContext().getRequestDispatcher(urlErreurs).forward(
                    request, response);
            return;
        }
         // parametreler doğru - yanıt sayfası gönderiliyor
        request.setAttribute("nom", nom);
        request.setAttribute("age", age);
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request,
                response);
        return;
    }
  • 5-6. satırlar: İstemcinin isteğinden "txtNom" ve "txtAge" parametrelerinin değerleri alınır.
  • 8-10. satırlar: Kullanıcı, [réponse] ve [erreurs] görünümlerindeki [Retour au formulaire] bağlantısına tıkladığında bu değerleri bulabilmek için oturumda saklanır.
  • 12-19. satırlar: Her iki parametrenin değerlerinin geçerliliği kontrol edilir
  • 21-28. satırlar: Parametrelardan biri hatalıysa, [erreurs(erreurs,lienRetourFormulaire)] görünümü görüntülenir. Bu görünümün şablonunu hatırlayalım:

<%
// şablondan veriler alınıyor
  ArrayList erreurs=(ArrayList)request.getAttribute("erreurs"); 
  String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
  • 30-34. satırlar: Alınan "txtNom" ve "txtAge" parametrelerinin her ikisinin de geçerli değerlere sahip olması durumunda, [reponse(nom,age,lienRetourFormulaire)] görünümü görüntülenir. [reponse] görünümünün şablonunu hatırlamak gerekir:

<%
    // modelden veriler alınıyor
  String nom=(String)request.getAttribute("nom");
  String age=(String)request.getAttribute("age");
  String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>

6.6.6. [doRetourFormulaire] yöntemi

Bu yöntem, 3 numaralı [GET /personne2/main?action=retourFormulaire] isteğini işler. Kodu şöyledir:

// önceden doldurulmuş form görüntüleniyor
    void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
         // kullanıcının oturumu alınıyor
        HttpSession session = request.getSession(true);        
         // form şablonunu hazırlama
         // oturumda isim var mı?
        String nom = (String) session.getAttribute("nom");
        if (nom == null)
            session.setAttribute("nom", "");
         // Oturumda yaş var mı?
        String age = (String) session.getAttribute("age");
        if (age == null)
            session.setAttribute("age", "");
         // urlAction
        request.setAttribute("urlAction", (String)params.get("urlControleur"));
         // form görüntüleniyor
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
    }

Bu yöntemin sonunda, kullanıcının son girişleriyle önceden doldurulmuş [formulaire] görünümü görüntülenmelidir. [formulaire] görünümünün şablonunu hatırlayalım:


<%
    // modelden veriler alınır
  String nom=(String)session.getAttribute("nom");
  String age=(String)session.getAttribute("age");
  String urlAction=(String)request.getAttribute("urlAction");
%>

Dolayısıyla, [doRetourFormulaire] yöntemi önceki modeli oluşturmalıdır.

  • 4. satır: Denetleyicinin girilen değerleri (ad, yaş) kaydettiği oturum alınır.
  • 7. satır: Oturumdan isim alınır
  • 8-9. satırlar: Eğer orada yoksa, boş bir değerle oturuma eklenir. Bu durum, uygulamanın normal çalışması sırasında ortaya çıkmamalıdır; çünkü [retourFormulaire] eylemi her zaman [validationFormulaire] eyleminin ardından gerçekleşir ve bu da girilen verilerin oturuma kaydedilmesinden sonra olur. Ancak bir oturumun süresi sınırlı olduğundan (genellikle birkaç on dakika) sona erebilir. Bu durumda, 4. satırda adı bulunmayan yeni bir oturum oluşturulur. Ardından yeni oturuma boş bir ad eklenir.
  • 11-13. satırlar: yaş için de aynı işlem yapılır
  • Oturumun süresinin dolması sorununu göz ardı edersek, 3-13. satırlar gereksizdir. Şablondaki [nom,age] öğeleri zaten oturumda bulunmaktadır. Dolayısıyla bunları tekrar oturuma eklemeye gerek yoktur.
  • 15. satır: Şablondaki [urlAction] öğesinin değeri belirlenir

6.7. Tests

Tomcat'i başlatın veya yeniden başlatın. [http://localhost:8080/personne2] URL'sini girin ve ardından 6.1. paragrafında örnek olarak gösterilen testleri tekrarlayın.