Skip to content

6. HTML Formları

Şimdiye kadar, yalnızca iki giriş alanı içeren tek bir form kullandık. Burada, yaygın olarak kullanılan grafik bileşenleri (radyo düğmeleri, onay kutuları, giriş alanları, açılır menüler, listeler) kullanarak bir form oluşturup işlemeyi amaçlıyoruz.

6.1. Uygulamanın görünümleri

Uygulamada sadece iki görünüm olacaktır. İlki boş bir form gösterir:

QZXW2HTMLP000547ZQX 1 - formulaire

Image

formulaire.jsp adlı bu ilk görünüm, struts-html kütüphanesindeki çeşitli etiketleri uygulamamıza olanak sağlayacaktır. Kullanıcı formu doldurur:

Image

[Envoyer] düğmesi, girilen değerlerin onaylanmasını sağlar. Bu, ikinci görünüm olacaktır:

Image

Bu ikinci görünüm, struts-bean ve struts-logic adlı iki başka etiket kütüphanesini kullanmamızı sağlayacaktır. [Retour au formulaire] bağlantısı, doldurduğumuz haliyle forma geri dönmemizi sağlar. Böylece ilk görünüme geri döneriz.

6.2. Uygulamanın mimarisi

  • Form (Görünüm 1), DynaActionForm sınıfından türetilmiş dynaFormulaire adlı dinamik bir Struts nesnesi ile temsil edilecektir. Bu form, formulaire.jsp görünümü tarafından görüntülenecektir.
  • Struts eylemi InitFormulaireAction, formun görüntülenmesi için gerekli verileri toplamayı amaçlayacaktır
  • Doldurulmuş form, isteği ikinci görünüm olan confirmation.jsp'e yönlendirmekle görevli ForwardAction eylemi tarafından işlenecektir. Bu görünüm, formdaki değerleri görüntülemekle görevli olacaktır.

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

6.3.1. server.xml dosyası

Uygulamanın bağlamı /formulaire2 olarak adlandırılacaktır. Bu nedenle, Tomcat’taki server.xml dosyasına aşağıdaki satırı ekleyeceğiz:

    <Context path="/formulaire2" docBase="e:/data/serge/web/struts/formulaire2" />

Bu işlem tamamlandıktan sonra, yeni bağlamın dikkate alınması için gerekirse Tomcat'i yeniden başlatırız. URL http://localhost:8080/formulaire2 adresini çağırarak bu bağlamın geçerliliğini kontrol edebiliriz:

Image

6.3.2. web.xml dosyası

Uygulamanın web.xml yapılandırma dosyası şu şekilde olacaktır:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <servlet>
      <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
      <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <taglib>
      <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
  </taglib>
  <taglib>
      <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
  </taglib>
  <taglib>
      <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
  </taglib>

</web-app>

Daha önce karşılaştığımız web.xml yapılandırma dosyalarında bazı değişiklikler yapıyoruz:

  • struts-bean ve struts-logic adlı iki yeni etiket kütüphanesi ekliyoruz. Bunlar, confirmation.jsp görünümünde kullanılacak. formulaire.jsp görünümü ise struts-html kütüphanesini kullanacak.

6.3.3. struts-config.xml dosyası

struts-config.xml dosyası ise şu şekilde olacaktır:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
    <form-beans>
        <form-bean name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
            <form-property name="opt" type="java.lang.String" initial="non"/>
            <form-property name="chk1" type="java.lang.String"/>
            <form-property name="chk2" type="java.lang.String"/>
            <form-property name="chk3" type="java.lang.String"/>            
            <form-property name="champSaisie" type="java.lang.String" initial=""/>
            <form-property name="mdp" type="java.lang.String" initial=""/>        
            <form-property name="boiteSaisie" type="java.lang.String" initial=""/>        
            <form-property name="combo" type="java.lang.String"/>
            <form-property name="listeSimple" type="java.lang.String"/>
            <form-property name="listeMultiple" type="java.lang.String[]"/>                
            <form-property name="secret" type="java.lang.String" initial="xxx"/>
            <form-property name="valeursCombo" type="java.lang.String[]" />
            <form-property name="valeursListeSimple" type="java.lang.String[]" />
            <form-property name="valeursListeMultiple" type="java.lang.String[]"/>                  
        </form-bean>            
    </form-beans>

    <action-mappings>
      <action
          path="/confirmation"
            name="dynaFormulaire"
            validate="false" 
            scope="session"
          parameter="/vues/confirmation.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

      <action
          path="/init"
            name="dynaFormulaire"
            validate="false" 
            scope="session"
          type="istia.st.struts.formulaire.InitFormulaireAction"
      >
            <forward name="afficherFormulaire" path="/vues/formulaire.jsp"/>
        </action>

      <action
          path="/affiche"
          parameter="/vues/formulaire.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

    </action-mappings>

        <message-resources 
      parameter="ApplicationResources"
        null="false"/>    

</struts-config>

Burada üç ana bölüm bulunmaktadır:

  • <form-beans> bölümünde formların tanımlanması
  • <action-mappings> bölümünde eylemlerin tanımlanması
  • <message-resources> bölümünde kaynak dosyasının tanımlanması

6.3.4. Uygulamanın form nesneleri (bean'leri)

Uygulamadaki HTML formlarını temsil etmek için kullanılan nesneler, ActionForm türünde veya bu türden türetilmiş (DynaActionForm, DynaValidatorForm, ...) nesnelerdir. Bunlara "bean" denir, çünkü yapıları JavaBeans kurallarına uygundur. Uygulamamızda tek bir form bean'i vardır; adı dynaFormulaire'tir ve DynaActionForm'ten türetilmiş bir türdür. Bu bean aşağıdaki durumlarda kullanılacaktır:

  • 1 numaralı görünümün görüntülenmesi için gerekli verileri içermek
  • kullanıcı 1 numaralı görünümü gönderdiğinde (submit) form değerlerini almak
  • 2 numaralı görünümün görüntülenmesi için gerekli verileri barındırmak

dynaFormulaire bean'inin yapısı, 1 numaralı görünümün formuyla yakından ilişkilidir. Bunu inceleyelim:

No.
Tür HTML
Rol
1
<input name="opt" type="radio" value="evet">
<input name="opt" type="radio" value="hayır">
birbiriyle bağlantılı radyo düğme grubu (aynı ad)
2
<input name="chk1" type="radio" value="açık">
<input name="chk2" type="radio" value="on">
<input name="chk3" type="radio" value="on">
onay kutusu grupları
(aynı ada sahip olmayan)
3
<input type="text " name="champSaisie" >
bir giriş alanı
4
<input type="password " name="mdp" >
bir şifre alanı
5
<textarea name="boiteSaisie">...</textarea>
çok satırlı giriş alanı
6
<select name="combo" size="1">..</select>
bir açılır menü
7
<select name="listeSimple" size="3">..</select>
tek seçimli bir liste
8
<select name="listeMultiple" size="3" multiple>..</select>
çoklu seçim listesi
9
<input type="button" value="Sil"
onclick='effacerListe("listeSimple")'>
seçimi kaldırmaya yarayan düğme
listeSimple (7)
10
<input type="button" value="Sil"
onclick='listeSil("listeMultiple")'>
listeSimple (7) içinde
listeMultiple (8) içinde seçilen öğeleri
11
<input type="submit" value="Gönder">
formun gönder düğmesi
12
<input type="hidden" name="secret" value="...">
gizli bir alan

Birkaç durumu ayırt edelim:

  1. dynaFormulaire nesnesi, yukarıdaki HTML formunun değerlerini içermek için kullanılır; bu form, [Envoyer] düğmesi ile gönderilecektir. Bu nedenle, HTML formundaki ile aynı alanlara sahip olması gerekir. Alanın türü aşağıdaki kural ile belirlenir:
  • HTML alanı yalnızca bir değer sağlıyorsa, dynaFormulaire alanının türü java.lang.String olacaktır
  • HTML alanı birden fazla değer veriyorsa, dynaFormulaire alanının türü java.lang.String[] olacaktır

Yukarıdaki HTML formunda, yalnızca listeMultiple alanı birden fazla değerle (kullanıcı tarafından seçilenler) ilişkilendirilebilir. Dolayısıyla, dynaFormulaire nesnesinin ilk tanımı şu şekilde olacaktır:

        <form-bean name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
            <form-property name="opt" type="java.lang.String" initial="non"/>
            <form-property name="chk1" type="java.lang.String"/>
            <form-property name="chk2" type="java.lang.String"/>
            <form-property name="chk3" type="java.lang.String"/>            
            <form-property name="champSaisie" type="java.lang.String" initial=""/>
            <form-property name="mdp" type="java.lang.String" initial=""/>        
            <form-property name="boiteSaisie" type="java.lang.String" initial=""/>        
            <form-property name="combo" type="java.lang.String"/>
            <form-property name="listeSimple" type="java.lang.String"/>
            <form-property name="listeMultiple" type="java.lang.String[]"/>                
            <form-property name="secret" type="java.lang.String" initial="xxx"/>
        </form-bean>            

dynaFormulaire formu, web istemcisi tarafından gönderilen HTML formundaki değerlerle nasıl doldurulacak?

opt
HTML <input type="radio" name="opt" value="evet"> alanı işaretlenmişse opt alanına "evet" değeri, <input type="radio" name="opt" value="hayır"> alanı işaretlenmişse "hayır" değeri atanacaktır.
chk1
HTML <input name="chk1" type="radio" value="1"> alanı işaretlenmişse chk1 alanı "on" değerini alır, aksi takdirde hiçbir değer almaz. Bu son durumda, chk1 alanı önceki değerini korur.
chk2
aynı şekilde
chk3
aynı
champSaisie
champSaisie alanı, kullanıcının HTML <input type="text" name="champSaisie"> alanına girdiği metni alacaktır. Bu metin, gerekirse boş bir dize olabilir.
mdp
mdp alanı, kullanıcının HTML <input type="password" name="mdp"> alanına girdiği metni alacaktır. Bu metin, gerekirse boş bir dize olabilir.
boiteSaisie
boiteSaisie alanı, kullanıcının HTML alanına <textarea name="boiteSaisie">...</textarea> içine yazdığı metni alacaktır. Bu metin, kullanıcı tarafından yazılan ve birbirinden "\r\n" karakter dizisiyle ayrılmış satırlardan oluşan tek bir karakter dizesidir. Elde edilen metin, boş bir dize de olabilir.
combo
kombinasyon kutusu, HTML <select name="combo" size="1">..</select> alanından kullanıcı tarafından seçilen seçeneği alır. Seçilen seçenek, kombinasyon kutusunda görünen seçenektir. Seçilen HTML seçeneği <option value="XX">YY</option> türündeyse, açılır menü alanına "XX" değeri yüklenecektir. Seçilen HTML seçeneği <option>YY</option> türündeyse, açılır menü alanına "YY" değeri atanır.
listeSimple
listeSimple alanı, varsa, HTML <select name="listeSimple" size="..">..</select> alanında kullanıcı tarafından seçilen seçeneği alır. Seçim yapılmamışsa, listeSimple alanı herhangi bir değer almayacak ve önceki değerini koruyacaktır. listeSimple alanına fiilen atanan değer, açılır menü için belirtilen kurallara göre belirlenir.
listeMultiple
String[] türündeki listeMultiple alanı, varsa, HTML <select name="listeMultiple" size=".." multiple>..</select> alanında kullanıcı tarafından seçilen seçenekleri alır. Seçim yoksa, listeMultiple dizisi herhangi bir değer almayacak ve içeriği değişmeyecektir. listeMultiple dizisine fiilen atanan değerler, açılır menü için belirtilen kurallara uyar.
secret
"secret" alanı, HTML <input type="hidden" name="secret" value="XX"> alanından XX değerini alacaktır. Bu metin, gerekirse boş bir dize olabilir.
  1. dynaFormulaire nesnesi, 1 numaralı görünümün başlangıç içeriğini sağlamak için kullanılır. Önceki alanların değerleri aşağıdaki amaçlarla kullanılacaktır:
opt
tarayıcının hangi radyo düğmesini işaretleyeceğini bilmesi için "evet" veya "hayır" değerine sahip olmalıdır
chk1
chk1'in değeri "on" ise onay kutusu işaretlenecek, aksi takdirde işaretlenmeyecektir
chk2
aynı şekilde
chk3
aynı şekilde
champSaisie
alanın değeri giriş alanında görüntülenecektir champSaisie
mdp
alanın değeri giriş alanında görüntülenecektir mdp
boiteSaisie
alanın değeri boiteSaisie giriş alanına görüntülenecektir
combo
Bu alanın değeri, form görüntülendiğinde açılır menüden hangi öğenin seçilmesi gerektiğini belirtir
listeSimple
aynı
listeMultiple
listeMultiple tablosundaki değerler, form görüntülendiğinde çoklu listeden hangi öğelerin seçilmesi gerektiğini belirtir
secret
alanın değeri, HTML gizli alanının value özniteliğine atanacaktır.

1 numaralı görünüm için başka bilgilere ihtiyaç vardır:

  • açılır listede görüntülenecek değerlerin listesi
  • listeSimple listesinde görüntülenecek değerlerin listesi
  • listeMultiple listesinde görüntülenecek değerlerin listesi

Bu bilgileri görünüme aktarmanın birkaç yolu vardır. Örneğin, görünüme iletilen sorguda yer alan tablolar bu iş için uygun olabilir. Burada, bu tabloları dynaFormulaire bean’ine yerleştiriyoruz:

        <form-bean name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
...
            <form-property name="valeursCombo" type="java.lang.String[]" />
            <form-property name="valeursListeSimple" type="java.lang.String[]" />
            <form-property name="valeursListeMultiple" type="java.lang.String[]"/>                  
        </form-bean>            

dynaFormulaire formu, /init eylemi tarafından başlatılacak ve bu eylem, Action sınıfından türetilmiş InitFormulaireAction adlı bir nesneyi çağıracaktır. Bu nesne, üç listenin görüntülenmesi için gerekli olan üç diziyi oluşturup bunları dynaFormulaire bean'ine yerleştirecektir. Yapılandırma dosyası, bu bean'e oturumla aynı kapsamı atar. Bu, Struts denetleyicisinin bu bean'i oturuma yerleştirmesine neden olur. Böylece, iki istek-yanıt döngüsü arasında onu yeniden oluşturmamıza gerek kalmaz. Ayrıca /init eylemi yalnızca bir kez çağrılacaktır.

  1. dynaFormulaire nesnesi de 2 numaralı görünümün içeriğini sağlamak için kullanılır. Bu görünüm, sadece değerleri görüntüler.

6.3.5. Uygulamanın eylemleri

Eylemler, Action türü veya türevleri olan nesneler tarafından gerçekleştirilir. Eylemlerin yapılandırması <action-mappings> etiketleri içinde yapılır:

    <action-mappings>
      <action
          path="/confirmation"
            name="dynaFormulaire"
            validate="false" 
            scope="session"
          parameter="/vues/confirmation.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

      <action
          path="/init"
            name="dynaFormulaire"
            validate="false" 
            scope="session"
          type="istia.st.struts.formulaire.InitFormulaireAction"
      >
            <forward name="afficherFormulaire" path="/vues/formulaire.jsp"/>
        </action>

      <action
          path="/affiche"
          parameter="/vues/formulaire.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

    </action-mappings>

Bir eyleme her zaman bir formun eşlik etmediğini belirtelim. Yukarıdaki /affiche eylemi buna bir örnektir. Her bir eylemi ayrıntılı olarak incelemeden önce, <action> etiketinde yer alan eylem-form çiftinin nasıl işlediğini hatırlayalım:

  • Bir eylem, bir web istemcisinden gelen bir istekle başlar ve bir yanıt sayfasının gönderilmesiyle sona erer. Bu, web istemcisi-sunucu arasındaki istek-yanıt döngüsüdür. İstek, ActionServlet tipi veya bunun türevlerinden biri olan Struts denetleyicisi tarafından alınır. Yanıtı gönderen de yine bu denetleyicidir.
  • ActionForm tipi veya türevleri olan form bean'i, henüz mevcut değilse oluşturulur. Denetleyici, scope ile belirtilen kapsamda name adlı bir nesne bulup bulamadığını kontrol eder. Bulursa, onu kullanır. Bulamazsa, onu oluşturur ve scope ile belirtilen kapsama, name ile belirtilen özniteliğe eşleştirerek yerleştirir.

Örneğin /init eylemi örneğinde, denetleyici, dynaFormulaire'in daha önce oluşturulup oluşturulmadığını öğrenmek için request.getSession().getAttribute("dynaFormulaire") komutunu çalıştırır. Eğer oluşturulmamışsa, denetleyici bunu oluşturacak ve request.getSession() gibi bir komutla oturuma ekleyecektir.setAttribute("dynaFormulaire", new DynaFormulaire(...)).

  • Denetleyici ayrıca, type özniteliğiyle belirtilen türde bir Action nesnesi de arar. Bulamazsa onu oluşturur, aksi takdirde mevcut olanı kullanır.
  • Form bean'inin reset yöntemi çağrılacaktır. Bu bean, ilk oluşturulduğu durum hariç, yeniden kullanılır. Dolayısıyla, "temizlemek" isteyebileceğiniz veriler içerir. Bunu, ActionForm bean'inin veya türevlerinin reset yönteminde yapacaksınız.
  • Eğer eylem, bir formun POST isteğinin hedefi ise, istemcinin isteğinde bulunan form değerleri, form bean’indeki aynı adlı alanlara kopyalanır. Bu kopyalama işleminden önce reset yönteminin çağrıldığına dikkat edilmelidir.
  • Yapılandırmada validate="true" özniteliği belirtilmişse, form bean'inin validate yöntemi çağrılır. Bu yöntem, bean'deki verileri doğrulamalıdır. Bu doğrulama genellikle, formun POST yoluyla yeni veriler aldığı ve bu verilerin geçerliliğinin kontrol edilmesi istendiği durumlarda gerçekleştirilir. Bu yöntem, kontrolöre olası hata listesini bir ActionErrors nesnesi içinde döndürür.
  • ActionErrors nesnesi boş değilse, denetleyici eylemin input özniteliğiyle belirtilen görünümü görüntüler.
  • Veri doğrulaması talep edilmezse veya başarılı bir şekilde tamamlanırsa, denetleyici, mevcut eyleme atanan Action türü veya türev nesnesinin execute yöntemini çalıştırır. Web istemcisinin isteği bu yöntem içinde işlenir. Execute yöntemi, karakter dizisi türündeki anahtarlarla indekslenen bir ActionForward nesnesi döndürür. Bu anahtarlar, yapılandırılan eylemin forward etiketlerinde bildirilen anahtarlardır. Örneğimizde, /init eyleminin tek bir forward etiketi vardır. Bu etiket, "afficherFormulaire" anahtarını formulaire.jsp görünümüne eşler.
  • Denetleyici, alınan anahtarla eşleştirilen görünümü görüntüler. Bu görünüm aslında bir eylem olabilir; bu durumda önceki süreç tekrarlanır.

/init eylemi

        <action
          path="/init"
            name="dynaFormulaire"
            validate="false" 
            scope="session"
          type="istia.st.struts.formulaire.InitFormulaireAction"
      >
            <forward name="afficherFormulaire" path="/vues/formulaire.jsp"/>
        </action>
  • /init eylemi normalde, kullanıcı URL'i talep ettiğinde ilk istek-yanıt döngüsünde bir kez gerçekleşir. http://localhost:8080/formulaire2/init.do
  • dynaFormulaire nesnesi oluşturulur veya geri dönüştürülür. scope özniteliğinin gerektirdiği şekilde oturumda geri alınır (geri dönüşüm) veya yerleştirilir (oluşturma).
  • reset yöntemi çağrılır. Bu yöntem ne yapmalıdır? Normalde, ActionForm nesnesinin alanları varsayılan değerlere sıfırlanır. Ancak burada bunu yapmayacağız, çünkü dynaFormulaire nesnesi oturuma yerleştirilmiştir (scope="session"). Dolayısıyla, dynaFormulaire nesnesinin alanları değerlerini korumalıdır. dynaFormulaire nesnesinin ilk oluşturulduğu sırada bu değerler nelerdir? İki durum söz konusudur:
  • alanın, yapılandırma dosyasında belirtilen bir başlangıç değeri vardır:
            <form-property name="opt" type="java.lang.String" initial="non"/>

Bu durumda, Struts denetleyicisi bu alanı bu başlangıç değeriyle oluşturacaktır.

  • alanın yapılandırmada bir başlangıç değeri yoktur: Java'nın başlatma kuralları geçerlidir. Genel olarak, sayısal alanların değeri sıfır, karakter dizelerinin değeri boş dize, diğer nesnelerin değeri ise null olacaktır.

dynaFormulaire'in başlangıç yapılandırmasına bir göz atalım:

        <form-bean name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
            <form-property name="opt" type="java.lang.String" initial="non"/>
            <form-property name="chk1" type="java.lang.String"/>
            <form-property name="chk2" type="java.lang.String"/>
            <form-property name="chk3" type="java.lang.String"/>            
            <form-property name="champSaisie" type="java.lang.String" initial=""/>
            <form-property name="mdp" type="java.lang.String" initial=""/>        
            <form-property name="boiteSaisie" type="java.lang.String" initial=""/>        
            <form-property name="combo" type="java.lang.String"/>
            <form-property name="listeSimple" type="java.lang.String"/>
            <form-property name="listeMultiple" type="java.lang.String[]"/>                
            <form-property name="secret" type="java.lang.String" initial="xxx"/>
            <form-property name="valeursCombo" type="java.lang.String[]" />
            <form-property name="valeursListeSimple" type="java.lang.String[]" />
            <form-property name="valeursListeMultiple" type="java.lang.String[]"/>             
        </form-bean>            

dynaFormulaire'in oluşturulduktan sonraki alanlarının başlangıç değerleri şu şekilde olacaktır:

Alan
Başlangıç değeri
opt
"hayır"
chk1, chk2, chk3
boş dize
champSaisie
boş dize
mdp
boş dize
boiteSaisie
boş dize
combo
boş dize
listeSimple
boş dize
listeMultiple
boş diziler tablosu
secret
"xxx"
valeursCombo, listeSimple, listeMultiple
boş dizeler dizisi
  • dynaFormulaire'in reset yönteminin, formulaire.jsp görünümündeki üç listeyi beslemesi gereken üç diziye değerler verdiğini düşünebiliriz. Bu, bu üç dizinin verilerinin keyfi bir şekilde üretildiği için burada mümkün olabilir. Bununla birlikte, en yaygın durum, bu verilerin uygulama modelinden, yani MVC'teki M'den gelmesidir. Burada, örneği karmaşıklaştırmamak için orta yol izleyeceğiz ve bu değerlerin InitFormulaireAction eylemi, yani MVC'in C'si tarafından üretilmesini sağlayacağız.
  • dynaFormulaire'te bir reset yöntemi yazma zorunluluğu yoktur; çünkü bu sınıfın türediği ActionForm sınıfında hiçbir işlem yapmayan (başlatma işlemi içermeyen) böyle bir yöntem mevcuttur.
  • dynaFormulaire'in reset yöntemi çağrıldığında, denetleyici eylemin validate özniteliğine bakar. Burada bu özniteliğin değeri "false"dır. dynaFormulaire'in validate yöntemi çağrılmayacaktır.
  • InitFormulaireAction nesnesi oluşturulur veya önceden mevcutsa geri dönüştürülür ve execute yöntemi çalıştırılır. Bu yöntem, dynaFormulaire'in üç dizisine (valeursCombo, valeursListeSimple ve valeursListeMultiple) rastgele değerler atayacaktır. Yöntem, "afficherFormulaire" anahtarına sahip bir ActionForward döndürür.
  • Denetleyici, /init eyleminin bir forward etiketiyle "afficherFormulaire" anahtarına eşleştirilen /vues/formulaire.jsp görünümünü görüntüler.

/confirmation eylemi

      <action
          path="/confirmation"
            name="dynaFormulaire"
            validate="false" 
            scope="session"
          parameter="/vues/confirmation.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
  • Kullanıcı 1 numaralı görünümdeki [Envoyer] düğmesine bastığında /confirmation eylemi gerçekleşir. Tarayıcı, kullanıcı tarafından doldurulan formu Struts denetleyicisine "gönderir".
  • dynaFormulaire nesnesi oturumda alınır
  • reset yöntemi çağrılır. Bu yöntem çağrıldıktan sonra, Struts denetleyicisi, istemci tarafından gönderilen formdaki alanların değerlerini dynaFormulaire nesnesindeki aynı adlı alanlara kopyalar. Şimdi bu nesnenin alan listesine tekrar göz atalım ve bu kopyalama işleminin nasıl gerçekleştiğine bakalım:
Alan
İlişkili HTML kodu
Form değerlerinin
form değerlerinin kopyalanmasından sonra
opt
<input type="radio" name="opt" value="evet">Evet
<input type="radio" name="opt" value="hayır" checked="checked">Hayır
- İşaretlenen radyo düğmesine göre "evet" veya "hayır"
chk1
<input type="checkbox" name="chk1" value="on">
- chk1 kutucuğu işaretlenmişse "on"
- chk1 kutucuğu işaretlenmemişse önceki değerini korur
chk2
<input type="checkbox" name="chk2" value="on">
- chk2 kutucuğu işaretlenmişse "on"
- chk2 kutucuğu işaretlenmemişse önceki değerini korur
chk3
<input type="checkbox" name="chk2" value="on">
- chk3 kutucuğu işaretlenmişse "on"
- chk3 kutucuğu işaretlenmemişse önceki değerini korur
champSaisie
<input type="text" name="champSaisie" value="">
- kullanıcı tarafından champSaisie alanına girilen değer
mdp
<input type="password" name="mdp" value="">
- mdp alanına kullanıcı tarafından girilen değer
boiteSaisie
<textarea name="boiteSaisie"></textarea>
- kullanıcı tarafından boiteSaisie alanına girilen değer
combo
<select name="combo">...</select>
- combo'da kullanıcı tarafından seçilen değer
listeSimple
<select name="listeSimple" size="3">...</select>
- listeSimple'te kullanıcı tarafından seçilen değer
listeMultiple
<select name="listeMultiple" multiple="multiple" size="5">
- listeMultiple'te kullanıcı tarafından seçilen değerleri içeren dize dizisi
secret
<input type="hidden" name="secret" value="xxx">
- "xxx".

Tarayıcı tarafından gönderilen istekte mutlaka bir değer almayan alanlarla ilgili bir sorun yaşıyoruz. Bu durum, chk1 ila chk3 onay kutuları ile listeSimple ve listeMultiple listeleri için geçerlidir. Bu durumda, bu alanlar önceki istek-yanıt döngüsü sırasında elde edilen önceki değerlerini korurlar.

Örneğin chk1 onay kutusunu ele alalım ve önceki istek-yanıt döngüsünde kullanıcının bu kutuyu işaretlediğini varsayalım. Bu durumda tarayıcı, isteğinin parametre dizesinde chk1="on" bilgisini göndermiştir. Dolayısıyla geliştirici, dynaFormulaire'teki chk1 alanına "on" değerini atamıştır. Şimdi, mevcut döngüde kullanıcının chk1 onay kutusunu işaretlemediğini varsayalım. Bu durumda, yeni isteğin parametre dizesinde tarayıcı chk1="off" gibi bir değer göndermez, hiçbir şey göndermez. Sonuç olarak, dynaFormulaire'in chk1 alanı "on" değerini koruyacak ve dolayısıyla kullanıcının onayladığı formdaki değeri yansıtmayan bir değere sahip olacaktır. Bu sorunu çözmek için dynaFormulaire'in reset yöntemini kullanacağız. Bu yönteme chk1, chk2 ve chk3 alanlarını "off" olarak ayarlayacağız. chk1 örneğimizde, kullanıcı:

  • chk1 kutucuğunu işaretlemiş olsun. Bu durumda tarayıcı chk1="on" bilgisini gönderir ve dynaFormulaire'in chk1 alanı "on" değerine geçer
  • chk1 kutucuğunu işaretlemezse, tarayıcı chk1 alanı için herhangi bir değer göndermez ve bu alan önceki "off" değerini korur. Her iki durumda da, dynaFormulaire'in chk1 alanında kaydedilen değer doğrudur.

Sorun, hem listeSimple hem de listeMultiple listeleri için benzerdir. Bu listelerde herhangi bir seçenek seçilmediyse, bunlar sorgu parametrelerinde yer almayacak ve dolayısıyla önceki değerlerini koruyacaktır. dynaFormulaire yönteminin reset yönteminde, listeSimple'i boş bir karakter dizisiyle ve listeMultiple'i uzunluğu 0 olan bir karakter dizisi dizisiyle sıfırlayacağız.

  • dynaFormulaire'in reset yöntemi çağrıldığında, denetleyici, istemcinin isteğinde kendisine gönderilen bilgileri dynaFormulaire'in alanlarına kopyalar
  • Bir ForwardAction nesnesi oluşturulur veya geri dönüştürülür ve bu nesnenin execute yöntemi çağrılır. ForwardAction, eylemin "parameter" özniteliği ile tanımlanan görünüme (burada /vues/confirmation.jsp) işaret eden bir ActionForward nesnesi döndüren önceden tanımlanmış bir sınıftır.
  • Denetleyici bu görünümü gönderir. Döngü tamamlanır.

Eylem /görüntüler

      <action
          path="/affiche"
          parameter="/vues/formulaire.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
  • /affiche eylemi, 2 numaralı görünümdeki [Retour vers le formulaire] bağlantısının etkinleştirilmesiyle tetiklenir.
  • Burada eyleme bağlı bir form bulunmamaktadır. Dolayısıyla, doğrudan ForwardAction nesnesinin execute yönteminin yürütülmesine geçilir; bu yöntem, /vues/formulaire.jsp görünümüne işaret eden bir ActionForward nesnesi döndürür.

6.3.6. Uygulamanın mesaj dosyası

struts-config.xml dosyasının üçüncü bölümü, mesaj dosyasıdır:

        <message-resources 
          parameter="ApplicationResources"
            null="false"
      />    

ApplicationResources.properties dosyası, WEB-INF/classes dizinine yerleştirilir. Bu dosya boş olacaktır. Boş olsa bile, yapılandırma dosyasında tanımlanması gerekir; aksi takdirde, biraz sonra ele alacağımız struts-bean etiket kütüphanesi bir hata verir. Bu kütüphane, confirmation.jsp görünümü tarafından kullanılır.

6.4. Görünüm kodları

6.4.1. formulaire.jsp görünümü

Bu görünümün iki durumda görüntülendiğini hatırlayalım:

  • 1. istek-yanıt döngüsü sırasında /init eylemi çağrıldığında
  • sonraki döngülerde /affiche eylemi çağrıldığında

formulaire.jsp görünümünün kodu şöyledir:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html>
  <head>
      <title>formulaire</title>
  </head>  
  <body background='<html:rewrite page="/images/standard.jpg"/>'>
      <h3>Formulaire Struts</h3>
    <hr>
    <html:form action="/confirmation" name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
      <table border="0">
        <tr>
          <td>bouton radio</td>
          <td>
                        <html:radio name="dynaFormulaire" property="opt" value="oui">Oui</html:radio>
                        <html:radio name="dynaFormulaire" property="opt" value="non">Non</html:radio>                                            
          </td>
        </tr>
        <tr>
          <td>Cases à cocher</td>
          <td>
                        <html:checkbox name="dynaFormulaire" property="chk1">1</html:checkbox>
                        <html:checkbox name="dynaFormulaire" property="chk2">2</html:checkbox>
                        <html:checkbox name="dynaFormulaire" property="chk3">3</html:checkbox>                                                
          </td>
        </tr>
        <tr>
          <td>Champ de saisie</td>
          <td>
                        <html:text name="dynaFormulaire" property="champSaisie" />
          </td>
        </tr>
        <tr>
          <td>Mot de passe</td>
          <td>
              <html:password name="dynaFormulaire" property="mdp" />
          </td>
        </tr>
        <tr>
          <td>Boîte de saisie multilignes</td>
          <td>
              <html:textarea name="dynaFormulaire" property="boiteSaisie" />
          </td>
        </tr>
        <tr>
          <td>Combo</td>
          <td>
              <html:select name="dynaFormulaire" property="combo">
                            <html:options name="dynaFormulaire" property="valeursCombo"/>
                        </html:select>
          </td>
        </tr>
        <tr>
          <td>
                        <table>
                            <tr>
                                <td>Liste à sélection unique</td>
                            </tr>
                            <tr>
                                <td>
                                    <input type="button" value="Effacer" onclick="this.form.listeSimple.selectedIndex=-1"/>
                                </td>
                            </tr>
                        </table>
          <td>
              <html:select name="dynaFormulaire" property="listeSimple" size="3">
                            <html:options name="dynaFormulaire" property="valeursListeSimple"/>                        
                        </html:select>
          </td>
        </tr>
        <tr>
                    <td>
                        <table>
                            <tr>
                                <td>Liste à sélection multiple</td>
                            </tr>
                            <tr>
                                <td>
                                    <input type="button" value="Effacer" onclick="this.form.listeMultiple.selectedIndex=-1"/>                                
                                </td>
                            </tr>
                        </table>
                    </td>
          <td>
              <html:select name="dynaFormulaire" property="listeMultiple" size="5" multiple="true">
                            <html:options name="dynaFormulaire" property="valeursListeMultiple"/>                        
                        </html:select>
          </td>
        </tr>
      </table>
      <html:hidden name="dynaFormulaire" property="secret"/>
            <br>
            <hr>
            <html:submit>Envoyer</html:submit> 
    </html:form>
  </body>
</html>

Bu JSP sayfası, struts-html kütüphanesinden gelen etiketleri kullanmaktadır. Bir etiket kütüphanesini kullanmak için şunların yapılması gerektiğini hatırlatmak isteriz:

  • uygulamanın web.xml dosyasında <tag-lib> etiketiyle kütüphaneyi tanımlamak
  <taglib>
      <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
  </taglib>
  • bu kütüphanenin kodunu uygulama dizin yapısının herhangi bir yerine yerleştirin, burada WEB-INF/struts-html.tld
  • Bu kütüphaneyi kullanan JSP sayfalarının başına kütüphane kullanımını bildirin:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

formulaire.jsp görünümü, şimdi açıklayacağımız etiketleri kullanır:

balise
<body background="<html:rewrite page="/images/standard.jpg"/>">
traduction HTML
<body background="/formulaire2/images/standard.jpg">
explication
html:rewrite etiketi, URL dosyalarında uygulama adından bağımsız çalışmayı sağlar. Bu etiketin bir özniteliği vardır:
page
URL yeniden yazılmalı
Yukarıdaki örnekte olduğu gibi, uygulamaya "formulaire3" adını vermeye karar verilirse, background özniteliğinin kodu yeniden yazılmaya gerek yoktur. html:rewrite etiketi, yeni kodu HTML oluşturacaktır
background="/formulaire3/images/standard.jpg"
balise
<html:form action="/confirmation" name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
traduction HTML
<form name="dynaFormulaire" method="post" action="/formulaire2/confirmation.do">
explication
html:form etiketi, HTML form etiketini oluşturmaya yarar. Bu etiketin birkaç özniteliği vardır:
action
Formun gönderilmesi gereken Struts eylemi - struts-config.xml içinde tanımlanan eylemlerden birine karşılık gelmelidir
name
isteğe bağlı - gönderilen formun değerlerinin yerleştirileceği veya okunacağı ActionForm bean'inin veya türevinin adı. Bu öznitelik yoksa, action özniteliği ile tanımlanan eyleme bağlı form kullanılır. Bu bilgi, yapılandırma dosyasında bulunur (eylemin name özniteliği).
type
isteğe bağlı - form için örneklenecek Java sınıfı. Bu öznitelik yoksa, action özniteliği ile tanımlanan eyleme ilişkin sınıf kullanılır. Bu bilgi, yapılandırma dosyasında bulunur (eylemin type özniteliği).
Görüldüğü gibi, varsayılan olarak oluşturulan HTML kodu, POST yöntemini kullanır. Aynı HTML kodunda, eylemin URL kodu, başına uygulama adı eklenip sonuna .do eklenecek şekilde yeniden yazılmıştır.
balise
<html:radio name="dynaFormulaire" property="opt" value="evet">Evet</html:radio>
traduction HTML
<input type="radio" name="opt" value="oui">
explication
html:radio etiketi, HTML <input type="radio" ...> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
name
isteğe bağlı - alanın değerinin yerleştirileceği veya okunacağı ActionForm bean'inin adı veya türevi. Bu öznitelik yoksa, <html:form> etiketiyle ilişkili form kullanılır.
property
okuma ve yazma işlemleri için radyo düğmesine ilişkili form bean'inin alan adı.
value
isteğe bağlı - HTML alanına verilecek değer
Başlangıç ve bitiş etiketleri arasındaki metin, radyo düğmesinin yanında görüntülenecek metindir.
balise
<html:checkbox name="dynaFormulaire" property="chk1">1</html:checkbox>
traduction HTML
<input type="checkbox" name="chk1" value="on">
explication
html:checkbox etiketi, HTML <input type="checkbox" ...> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
name
isteğe bağlı - alanın değerinin yerleştirileceği veya okunacağı ActionForm bean'inin adı veya türevi. Bu öznitelik yoksa, <html:form> etiketiyle ilişkili form kullanılır.
property
Okuma ve yazma işlemlerine açık onay kutusuyla ilişkili form bean'inin alan adı.
value
isteğe bağlı - HTML alanına verilecek değer
Başlangıç ve bitiş etiketleri arasındaki metin, onay kutusunun yanında görüntülenecek metindir.
balise
<html:text name="dynaFormulaire" property="champSaisie" />
traduction HTML
<input type="text" name="champSaisie" value="">
explication
html:text etiketi, HTML <input type="text" ...> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
name
isteğe bağlı - alanın değerinin yerleştirileceği veya okunacağı ActionForm bean'inin adı veya türevi. Bu öznitelik yoksa, <html:form> etiketiyle ilişkili form kullanılır.
property
okuma ve yazma amaçlı giriş alanıyla ilişkili form bean'inin alan adı.
value
isteğe bağlı - HTML alanına girilecek değer
balise
<html:password name="dynaFormulaire" property="mdp" />
traduction HTML
<input type="password" name="mdp" value="">
explication
html:password etiketi, HTML <input type="password" ...> etiketini oluşturmak için kullanılır. Bu etiket çeşitli öznitelikleri destekler:
balise
<html:textarea name="dynaFormulaire" property="boiteSaisie" />
traduction HTML
<textarea name="boiteSaisie"></textarea>
explication
html:textarea etiketi, HTML <textarea>...</textarea> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
name
isteğe bağlı - alanın değerinin yerleştirileceği veya okunacağı ActionForm bean'inin adı veya türevi. Bu öznitelik yoksa, <html:form> etiketiyle ilişkili form kullanılır.
property
okuma ve yazma yetkisine sahip şifre alanıyla ilişkili form bean'inin alan adı.
value
isteğe bağlı - HTML alanına verilecek değer
balise
<html:select name="dynaFormulaire" property="combo">....</html:select>
traduction HTML
<select name="combo">...</select>
explication
html:select etiketi, HTML <select>...</select> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
name
isteğe bağlı - alanın değerinin yerleştirileceği veya okunacağı ActionForm bean'inin adı veya türevi. Bu öznitelik yoksa, <html:form> etiketiyle ilişkili form kullanılır.
property
okuma ve yazma amaçlı giriş alanıyla ilişkili form bean'inin alan adı.
value
isteğe bağlı - HTML alanına verilecek değer. Bu değere sahip açılır menü seçeneği seçilecektir.
balise
<html:select name="dynaFormulaire" property="combo">
<html:options name="dynaFormulaire" property="valeursCombo"/>
</html:select>
traduction HTML
<option value="combo1">combo1</option>
<option value="combo2">combo2</option>

explication
html:options etiketi, bir HTML <select> etiketi içinde HTML <option>...</option> etiketlerini oluşturmak için kullanılır. Seçim listesinin doldurma değerlerinin nasıl bulunacağını belirtmenin çeşitli yolları vardır. Burada, name ve property özniteliklerini kullandık:
name
isteğe bağlı - alanın değerinin yerleştirileceği veya okunacağı ActionForm bean'inin veya türevinin adı. Bu öznitelik yoksa, <html:form> etiketiyle ilişkili form kullanılır.
property
Seçim listesinin değerlerini içeren form bean'inin alan adı. Bu, bir karakter dizisi dizisi olmalıdır.

Diğer iki liste de bir öncekiyle benzer şekilde oluşturulur:

          <html:select name="dynaFormulaire" property="listeSimple" size="3">
            <html:options name="dynaFormulaire" property="valeursListeSimple"/>            
        </html:select>

Yukarıda, açılır menü yerine bir liste elde etmek için size özniteliği 1'den farklı bir değere ayarlanmıştır.

<html:select name="dynaFormulaire" property="listeMultiple" size="5" multiple="true">
        <html:options name="dynaFormulaire" property="valeursListeMultiple"/>                
    </html:select>

Yukarıda, çoklu seçim yapılabilen bir liste elde etmek için multiple="true" özniteliği belirtilmiştir.

balise
<html:hidden name="dynaFormulaire" property="secret"/>
traduction HTML
<input type="hidden" name="secret" value="xxx">
explication
html:hidden etiketi, HTML <input type="hidden" ...> etiketini oluşturmak için kullanılır.
name
isteğe bağlı - alanın değerinin yerleştirileceği veya okunacağı ActionForm adlı bean veya bunun bir türevi. Bu öznitelik belirtilmezse, <html:form> etiketiyle ilişkili form kullanılır.
property
gizli alana ilişkili form bean'indeki alan adı. HTML adlı gizli alana atanan "xxx" değeri, yapılandırma dosyasındaki form tanımından gelir. Bu dosyada, gizli alan için "xxx" başlangıç değeri tanımlanmıştır.

formulaire.jsp görünümü ile bellekte onu temsil eden dynaFormulaire bean'i arasındaki bağlantıyı tam olarak anlamak için, dynaFormulaire bean'inin hem okuma hem de yazma işlemlerinde kullanıldığını hatırlamak gerekir:

İstek, kullanıcı formdaki [Envoyer] düğmesine tıkladığında gerçekleşir. Tarayıcı, HTML formunu /confirmation eylemine "gönderir". O sırada neler olduğunu daha önce açıklamıştık; özellikle de dynaFormulaire formundaki alanların, HTML formundaki aynı isimli alanların değerlerini alacağını belirtmiştik.

Denetleyici, bir isteğe yanıt olarak formulaire.jsp görünümünün görüntülenmesini istediğinde ne olur? Etiketleri tek tek yeniden inceleyelim:

balise
<body background="<html:rewrite page="/images/standard.jpg"/>">
fonction
HTML kodunu oluşturur
<body background="/formulaire2/images/standard.jpg">
balise
<html:form action="/confirmation" name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
...
</html:form>
fonction
HTML kodunu oluşturur
<form name="dynaFormulaire" method="post" action="/formulaire2/confirmation.do">
balise
<html:radio name="dynaFormulaire" property="opt" value="evet">Evet</html:radio>
<html:radio name="dynaFormulaire" property="opt" value="hayır">Hayır</html:radio>
fonction
dynaFormulaire'in opt alanı "evet" ise, HTML kodunu oluştur
<input type="radio" name="opt" value="oui" checked="checked">Oui
<input type="radio" name="opt" value="non">Non
balise
<html:checkbox name="dynaFormulaire" property="chk1">1</html:checkbox>
<html:checkbox name="dynaFormulaire" property="chk2">2</html:checkbox>
<html:checkbox name="dynaFormulaire" property="chk3">3</html:checkbox>
fonction
dynaFormulaire'in chk1 ve chk3 alanları "on" ve chk2 alanı "off" ise, HTML kodunu oluştur
<input type="checkbox" name="chk1" value="on" checked="checked">1
<input type="checkbox" name="chk2" value="on">2
<input type="checkbox" name="chk3" value="on" checked="checked">3                                                
balise
<html:text name="dynaFormulaire" property="champSaisie" />
fonction
champSaisie alanı "bu bir deneme" değerindeyse, HTML kodunu oluşturur
<input type="text" name="champSaisie" value="ceci est un essai">
balise
<html:password name="dynaFormulaire" property="mdp" />
fonction
eğer mdp alanı "azerty" ise, HTML kodunu üretir
<input type="password" name="mdp" value="azerty">
balise
<html:password name="dynaFormulaire" property="mdp" />
fonction
eğer mdp alanı "azerty" ise, HTML kodunu üretir
<input type="password" name="mdp" value="azerty">
balise
<html:password name="dynaFormulaire" property="mdp" />
fonction
eğer mdp alanı "azerty" ise, HTML kodunu üretir
<input type="password" name="mdp" value="azerty">
balise
<html:select name="dynaFormulaire" property="combo">
<html:options name="dynaFormulaire" property="valeursCombo"/>
</html:select>
fonction
eğer açılır menü alanı "combo2" ise, HTML kodunu oluşturur
<select name="combo">
    <option value="combo0">combo0</option>
    <option value="combo1">combo1</option>
    <option value="combo2" selected="selected">combo2</option>
    <option value="combo3">combo3</option>
    <option value="combo4">combo4</option>
</select>
balise
<html:select name="dynaFormulaire" property="listeSimple" size="3">
<html:options name="dynaFormulaire" property="valeursListeSimple"/>
</html:select>
fonction
listeSimple alanı "simple1" değerindeyse, HTML kodunu oluşturur
<select name="listeSimple" size="3">
    <option value="simple0">simple0</option>
    <option value="simple1" selected="selected">simple1</option>
    <option value="simple2">simple2</option>
...
</select>
balise
<html:select name="dynaFormulaire" property="listeMultiple" size="5" multiple="true">
<html:options name="dynaFormulaire" property="valeursListeMultiple"/>
</html:select>
fonction
listeMultiple alanı {"multiple0","multiple2"} dizisiyse, HTML kodunu oluşturur
<select name="listeMultiple" multiple="multiple" size="5">
    <option value="multiple0" selected="selected">multiple0</option>
    <option value="multiple1">multiple1</option>
    <option value="multiple2" selected="selected">multiple2</option>
    <option value="multiple3">multiple3</option>
...
</select>
balise
<html:hidden name="dynaFormulaire" property="secret"/>
fonction
eğer "secret" alanı "xxx" değerindeyse, HTML kodunu oluşturur
<input type="hidden" name="secret" value="xxx">
balise
<html:submit>Gönder</html:submit>
fonction
HTML kodunu oluşturur
<input type="submit" value="Envoyer">

Açıklanması gereken son husus, JSP sayfasında yer alan ve [Effacer] numaralı iki düğmeyle bağlantılı olan javascript kodudur. Bu düğmeler, listeSimple ve listeMultiple numaralı listelerde seçili olan öğelerin seçimini kaldırır:

<input type="button" value="Effacer" onclick="this.form.listeSimple.selectedIndex=-1"/>                                
<input type="button" value="Effacer" onclick="this.form.listeMultiple.selectedIndex=-1"/>

Etiket

<html:form action="/confirmation" name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">

şu HTML kodunu oluşturur:

<form name="dynaFormulaire" method="post" action="/formulaire2/confirmation.do">

[Effacer] düğmeleriyle ilişkili JavaScript kodunu anlamak için, bu belgeyi kullanan bir JavaScript kodu içinde bir web belgesinin farklı öğelerinin nasıl adlandırıldığını hatırlayalım:

Veri
Anlam
document
web belgesinin tamamını ifade eder
document.forms
belgede tanımlanan formların toplamını ifade eder
document.forms[i]
belgedeki i numaralı formu belirtir
document.forms["nomFormulaire"]
name özniteliği "nomFormulaire" olan <form> formunu belirtir
document.nomFormulaire
name özniteliği "nomFormulaire" olan <form> formunu belirtir
document.[formulaire].elements
[formulaire] ifadesiyle belirtilen formun üye öğelerinin koleksiyonunu ifade eder. Bu koleksiyon, belirtilen formdaki tüm <input>, <textarea>, <select> etiketlerini içerir.
document.[formulaire].elements[i]
, [formulaire]'in i numaralı öğesini belirtir
document.[formulaire].elements["nomComposant"]
[formulaire] öğesi içinde name özniteliği nomComposant değerine eşit olan öğeyi belirtir
document.[formulaire]. nomComposant
name özniteliği nomComposant'e eşit olan [formulaire] öğesini belirtir
document.[formulaire].[composant].value
[formulaire] formundaki [composant] bileşeninin değerini belirtir; bu formun HTML kodu, value özniteliğine sahip olabilir (<input>, <textarea>)
document.[formulaire].[select].selectedIndex
bir listeden seçilen seçeneğin indeksini belirtir. Okuma ve yazma işlemlerinde kullanılır. Bu özelliğin değeri -1 olarak ayarlandığında, listedeki tüm öğelerin seçimi kaldırılır.
document.[formulaire].[select].options
<select> etiketiyle ilişkili seçenekler tablosunu belirtir
document.[formulaire].[select].options[i]
belirtilen <select> etiketinin i numaralı seçeneğini belirtir
document.[formulaire].[select].options[i].selected
Belirtilen [select] etiketinin i numaralı seçeneğinin seçili olup olmadığını (true) belirten boole değeri. Okuma ve yazma işlemlerinde kullanılabilir

İki düğmenin JavaScript koduna tekrar bakalım:

<input type="button" value="Effacer" onclick="this.form.listeSimple.selectedIndex=-1"/>                                
<input type="button" value="Effacer" onclick="this.form.listeMultiple.selectedIndex=-1"/>

Düğmeye tıklandığında, "onclick" özniteliğiyle ilişkili kod çalıştırılır. Burada, kod satır içi olarak yazılmıştır. Çoğu zaman, onclick="fonksiyon(...)" şeklinde yazılır; burada fonksiyon, <script language="javascript">...</script> etiketleri içinde tanımlanmış bir fonksiyondur. Yukarıdaki kod ne yapar? İlk düğmenin kodunu inceleyelim:

this
düğmenin bulunduğu web belgesini belirtir
this.form
düğmenin bulunduğu formu belirtir
this.form.listeSimple
formdaki listeSimple bileşenini belirtir
this.form.listeSimple.selectedIndex
, listeSimple'te seçilen seçeneğin indeksini belirtir. Bu özelliğin değeri -1 olarak ayarlandığında, tüm seçeneklerin seçimi kaldırılır.

6.4.2. confirmation.jsp görünümü

Bu görünümün, formulaire.jsp görünümünde yer alan formun web istemcisi tarafından gönderilmesinden sonra /confirmation eylemi (c.a.d) sonucunda görüntülendiğini hatırlatalım. Bu görünümün tek amacı, kullanıcı tarafından girilen değerleri görüntülemektir. Kod şöyledir:

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<html>
    <head>
      <title>Confirmation</title>
  </head>
  <body background="<html:rewrite page="/images/standard.jpg"/>">
      <h3>Confirmation des valeurs saisies</h3>
    <hr/>
    <table border="1">
        <tr>
        <td>Bouton radio</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="opt"/></td>
      </tr>
        <tr>
        <td>Case à cocher chk1</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="chk1"/></td>
      </tr>
        <tr>
        <td>Case à cocher chk2</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="chk2"/></td>
      </tr>
        <tr>
        <td>Case à cocher chk3</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="chk3"/></td>
      </tr>

        <tr>
        <td>Champ de saisie</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="champSaisie"/></td>
      </tr>
        <tr>
        <td>Mot de passe</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="mdp"/></td>
      </tr>

        <tr>
        <td>Boîte de saisie</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="boiteSaisie"/></td>
      </tr>

        <tr>
        <td>combo</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="combo"/></td>
      </tr>
        <tr>
        <td>liste simple</td>
        <td><bean:write name="dynaFormulaire" scope="session" property="listeSimple"/></td>
      </tr>
            <logic:iterate id="choix" indexId="index" name="dynaFormulaire" property="listeMultiple">
          <tr>
          <td>liste multiple[<bean:write name="index"/>]</td>
          <td><bean:write name="choix"/></td>
        </tr>
            </logic:iterate>
    </table>
        <br>
    <html:link page="/affiche.do">
            Retour au formulaire
        </html:link>    
  </body>
</html>

Burada iki yeni etiket kütüphanesi tanıtıyoruz: struts-bean ve struts-logic. struts-bean kütüphanesi, istek, oturum veya uygulama bağlamında bulunan nesnelere erişim sağlar. struts-logic kütüphanesi ise etiketler aracılığıyla yürütme mantığı eklemeye olanak tanır. Bu iki kütüphane hiçbir şekilde zorunlu değildir. Daha önce gördüğümüz gibi, bir JSP sayfası şunları yapabilir:

  • istek (request.getAttribute(...)), oturum (session.getAttribute(...)) veya uygulama bağlamındaki nesneleri alabilir
  • <%= değişken %> değişkenleri aracılığıyla HTML koduna dinamik bölümler ekleyebilir
  • Java kodu <% Java kodu %> içerebilir

JSP sayfalarına Java kodu eklemek, uygulama mantığı (Java kodu) ile sunum (etiket kullanımı) arasında kesin bir ayrım isteyen herkesi rahatsız eder. Bu nedenle, bu kullanıcılar için etiket kütüphaneleri geliştirilmiştir.

formulaire.jsp görünümünde olduğu gibi ilerleyeceğiz ve confirmation.jsp kodunda bulunan etiketlerin her birini, formulaire.jsp görünümünde daha önce karşımıza çıkmamışlarsa açıklayacağız. Öncelikle, sayfanın kullanacağı üç etiket kütüphanesini tanımlayarak başladığını belirtelim:

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

Ayrıca, bu üç kütüphanenin uygulamanın web.xml dosyasında tanımlanması gerektiğini de hatırlayalım. Şimdi formulaire.jsp belgesindeki etiketleri inceleyelim:

balise
<bean:write name="dynaFormulaire" scope="session" property="opt"/>
fonction
akışına bir değer yazar. bean:write etiketi aşağıdaki öznitelikleri kabul eder:
name: kullanılacak nesnenin adı
scope: bu nesnenin aranacağı kapsam (request, session, context)
property: name ile belirtilen nesnenin, özelliği yazılması gereken alanı. Bu alan herhangi bir türde bir nesne olabilir. Nesnenin toString yöntemi kullanılacaktır.
Burada, dynaFormulaire nesnesinin opt alanının değeri yazılır. Kullanıcı, value="evet" özniteliğine sahip radyo düğmesini işaretlemişse "evet", value="hayır" özniteliğine sahip radyo düğmesini işaretlemişse "hayır" değeri elde edilir.
balise
<bean:write name="dynaFormulaire" scope="session" property="chk1"/>
fonction
dynaFormulaire'teki chk1 alanının değerini yazar. Kullanıcı kutucuğu işaretlediyse "on", işaretlemediyse "off" değeri alınır. Aynı durum chk2 ve chk3 için de geçerlidir.
balise
<bean:write name="dynaFormulaire" scope="session" property="champSaisie"/>
fonction
champSaisie alanının değerini dynaFormulaire'e yazar, yani kullanıcının bu alana girdiği metni. Aynı durum mdp ve boiteSaisie için de geçerlidir.
balise
<bean:write name="dynaFormulaire" scope="session" property="combo"/>
fonction
dynaFormulaire açılır menü alanının değerini yazar. Kullanıcı tarafından seçilen <option> öğesinin value özniteliğini alırız.
balise
<bean:write name="dynaFormulaire" scope="session" property="listeSimple"/>
fonction
listeSimple alanının değerini dynaFormulaire'e yazar. Kullanıcı tarafından bir öğe seçilmişse, seçilen <option> öğesinin value özniteliği alınır. Aksi takdirde boş bir dize alınır.
balise
            <logic:iterate id="choix" indexId="index" name="dynaFormulaire" property="listeMultiple">
          <tr>
          <td>liste multiple[<bean:write name="index"/>]</td>
          <td><bean:write name="choix"/></td>
        </tr>
            </logic:iterate>
fonction
Burada mantık etiketlerini kullanıyoruz. Çoktan seçmeli bir listeyle karşı karşıyayız. dynaFormulaire nesnesinin listeMultiple alanının değeri bir String dizisidir. Java'da bir döngü yazardık. logic:iterate etiketi, Java kodu yazmadan aynı döngüyü gerçekleştirmemizi sağlar. Örnekte logic:iterate etiketinin aşağıdaki öznitelikleri vardır:
name="dynaFormulaire": kullanılacak nesnenin adı
property="listeMultiple": name ile belirtilen nesne içinde, döngüde taranacak koleksiyonu içeren özelliğin adı. Burada bu koleksiyon, listeMultiple'te seçilen değerlerin dizisidir. Bu dizi boş olabilir.
id="choix": döngünün her turunda dizinin o anki elemanını belirten tanımlayıcı. 1. yinelemede, "choix" listeMultiple[0]'i, 2. yinelemede listeMultiple[1]'i temsil eder ve bu şekilde devam eder.
indexID="index": Döngünün her turunda dizideki geçerli öğenin indeksini belirten tanımlayıcı. İlk yinelemede index değeri 0, ikinci yinelemede 1 olur ve bu şekilde devam eder.
<logic:iterate ...> ve </logic:iterate> etiketleri arasında yer alan HTML kodu, (name,property) çiftiyle belirtilen koleksiyonun her bir elemanı için tekrarlanır. Bu kodun dinamik kısmı şöyledir:
          <td>liste multiple[<bean:write name="index"/>]</td>
          <td><bean:write name="choix"/></td>
Yukarıda belirtildiği gibi, i numaralı yinelemede (i>=0), oluşturulan HTML kodu aşağıdaki kodla eşdeğerdir:
          <td>liste multiple[<%=i%>]</td>
          <td><%=listeMultiple[i]%></td>
balise
    <html:link page="/affiche.do">
            Retour au formulaire
        </html:link>    
fonction
uygulamanın bağlamına göre bir bağlantı oluşturur; böylece bağlamı bilmek gerekmez. Bu etiket tarafından oluşturulan HTML kodu şöyledir:
<a href="/formulaire2/affiche.do">Retour au formulaire</a>

6.5. Java sınıfları

struts-config.xml yapılandırma dosyası iki Java sınıfına atıfta bulunur:

        <form-bean name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
...
      <action
          path="/init"
            name="dynaFormulaire"
            validate="false" 
            scope="session"
          type="istia.st.struts.formulaire.InitFormulaireAction"
      >

DynaFormulaire sınıfı, 1 numaralı görünüm formulaire.jsp'in değerlerini içerecek sınıftır. InitFormulaireAction sınıfı, formulaire.jsp'teki [Envoyer] düğmesi ile gönderilen formun değerlerini işleyecek sınıftır.

6.5.1. DynaFormulaire sınıfı

Bir formun değerlerini barındırmak için, bu sınıfın reset veya validate yöntemlerinden birini yeniden tanımlamaya gerek olmadığı sürece DynaActionForm türünde bir nesne yeterlidir. Burada, herhangi bir veri doğrulaması yapılmadığı için validate yönteminin yeniden tanımlanmasına gerek yoktur. Ancak reset yönteminin yeniden tanımlanması gerekir. Zira, DynaFormulaire nesnesinin alanları, web istemcisi tarafından gönderilen formdan değerlerini alacaktır. Ancak bazı alanlar, istek içinde bulunmuyorsa değer almayabilir. Bu durum aşağıdaki durumlarda ortaya çıkar:

  • kullanıcı tarafından işaretlenmemiş bir onay kutusu
  • 1'den fazla seçeneğin bulunduğu bir liste veya hiçbir seçeneğin seçilmemiş olması

Bu tür bir bileşene sahip formlarda, reset yöntemi

  • onay kutusuyla ilişkili alana "off" değerini atamalıdır
  • tek seçimli listeyle ilişkili alana boş dize atamalıdır
  • çoklu seçim listesiyle ilişkili alana, boyutu sıfır olan bir karakter dizisi dizisi atamalıdır

Böylece, bu alanlar istekten bir değer almazlarsa, reset tarafından atanan değeri korurlar; bu değer, kullanıcı tarafından onaylanan formdaki bileşenin durumuna karşılık gelir (onay kutusu işaretlenmemiş, listede hiçbir öğe seçilmemiş).

DynaActionForm sınıfından türetilen DynaFormulaire sınıfının kodu şöyledir:

package istia.st.struts.formulaire;

import org.apache.struts.action.DynaActionForm;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;

public class DynaFormulaire extends DynaActionForm {
  public void reset(ActionMapping mapping, HttpServletRequest request){
    // onay kutularını sıfırla - değer kapalı
    set("chk1","off");
    set("chk2","off");
    set("chk2","off");
    // listeSimple'i sıfırla - boş dize
    set("listeSimple","");
     // listeMultiple'i sıfırla - boş dizi
    set("listeMultiple",new String[]{});
  }
}

6.5.2. InitFormulaireAction sınıfı

InitFormulaireAction sınıfı, struts-config.xml dosyasında /init eylemi ile ilişkilendirilmiştir:

      <action
          path="/init"
            name="dynaFormulaire"
            validate="false" 
            scope="session"
          type="istia.st.struts.formulaire.InitFormulaireAction"
      >
            <forward name="afficherFormulaire" path="/vues/formulaire.jsp"/>
        </action>

/init eylemi, DynaFormulaire nesnesinin ilk oluşturulmasında yalnızca bir kez kullanılır. Bu eylemin amacı, listeSimple ve listeMultiple adlı üç açılır menü listesine içerik sağlamaktır. Bu içerik, dynaFormulaire nesnesinin özellikleri olan üç tablo şeklinde sağlanır:

        <form-bean name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire">
            <form-property name="opt" type="java.lang.String" initial="non"/>
...
            <form-property name="valeursCombo" type="java.lang.String[]" />
            <form-property name="valeursListeSimple" type="java.lang.String[]" />
            <form-property name="valeursListeMultiple" type="java.lang.String[]"/>                                          
        </form-bean>            

valeursCombo, valeursListeSimple ve valeursListeMultiple tabloları, InitFormulaireAction tarafından bir kez başlatıldıktan sonra, bir daha başlatılmalarına gerek kalmaz. Çünkü dynaFormulaire nesnesi oturuma yerleştirilir ve bu sayede istek-yanıt döngüleri boyunca değerini korur. Bu nedenle /init eylemi yalnızca bir kez yürütülür. InitFormulaireAction kodunun içeriği şöyledir:

package istia.st.struts.formulaire;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;

public class InitFormulaireAction
  extends Action {
  public ActionForward execute(ActionMapping mapping, ActionForm form,
       HttpServletRequest request, HttpServletResponse response) throws IOException,    ServletException {

     // formu görüntülenmeye hazırlar

     // form için gerekli bilgileri formun bean'ine aktarır
    DynaFormulaire formulaire = (DynaFormulaire) form;
    formulaire.set("valeursCombo", getValeurs(5, "combo"));
    formulaire.set("valeursListeSimple", getValeurs(7, "simple"));
    formulaire.set("valeursListeMultiple", getValeurs(10, "multiple"));
     // kontrolü geri verilir
    return mapping.findForward("afficherFormulaire");
  } //işleme alınır

   // açılır menüdeki değerlerin listesi
  private String[] getValeurs(int taille, String label) {
    String[] valeurs = new String[taille];
    for (int i = 0; i < taille; i++) {
      valeurs[i] = label + i;
    }
    return valeurs;
  }
}
  • Sınıf, Action sınıfından türetilmelidir. Bu zorunludur.
  • Struts denetleyicisi, execute yöntemi aracılığıyla bir Action nesnesi kullanır. Dolayısıyla yeniden tanımlanması gereken yöntem budur. Bu yöntem aşağıdaki parametreleri alır:
    • ActionMapping mapping: struts-config.xml içinde uygulamanın yapılandırmasını temsil eden bir nesne
    • ActionForm form: eylemin yapılandırmasında tanımlanmışsa (eylemin name özniteliği), eylemle ilişkili form.
    • HttpServletRequest istek: istemcinin isteği
    • HttpServletResponse: İstemciye verilen yanıt
  • InitFormulaireAction sınıfı, dynaFormulaire formunu başlatmalıdır. Bu form, execute yöntemine ActionForm form parametresi şeklinde ulaşır. Hatırlanacağı üzere, dynaFormulaire, DynaFormulaire türündedir; bu sınıf, DynaActionForm sınıfından türetilmiştir ve DynaActionForm sınıfı da ActionForm sınıfından türetilmiştir.
  • execute yönteminde, DynaActionForm sınıfının set yöntemi kullanılarak valeursCombo, valeursListeSimple ve valeursListeMultiple alanlarına değerler atanır. Bu değerler, basitlik amacıyla rastgele seçilmiş dizilerdir. set yönteminin mevcut bir alana değer atadığına dikkat edelim. Bu yöntem, yeni alanlar oluşturmak için kullanılamaz. Bu nedenle, valeursCombo, valeursListeSimple, valeursListeMultiple alanlarını dynaFormulaire nesnesinin tanımında struts-config.xml içinde tanımlamak gerekir.
  • execute yöntemi, müşteriye yanıt olarak görüntülenecek görünümün anahtarını denetleyiciye döndürerek sona erer. Burada, struts-config.xml dosyasında /vues/formulaire.jsp görünümüne atanan anahtar afficherFormulaire'tir.

6.6. Dağıtım

Uygulamanın dizin yapısı şu şekildedir:

  

Image

Image

Yukarıdaki ApplicationResources.properties dosyasının struts-bean etiket kütüphanesi için gerekli olduğunu hatırlayalım. Bu dosyanın uygulama mesajlarını içerdiği bilinmektedir. Bu mesajlara struts-bean kütüphanesi tarafından erişilebilir. Burada, uygulamamız herhangi bir mesaj tanımlamamaktadır. Dolayısıyla ApplicationResources.properties dosyası mevcut olmakla birlikte boştur.

6.7. Sonuç

Bu derste, bir HTML formunun çeşitli bileşenlerini nasıl yöneteceğimizi ayrıntılı olarak ele aldık. Artık Struts uygulamalarımızda karmaşık formlar kullanabiliriz.