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

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:

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

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

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 |
<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) | |
<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) | |
<input type="text " name="champSaisie" > | bir giriş alanı | |
<input type="password " name="mdp" > | bir şifre alanı | |
<textarea name="boiteSaisie">...</textarea> | çok satırlı giriş alanı | |
<select name="combo" size="1">..</select> | bir açılır menü | |
<select name="listeSimple" size="3">..</select> | tek seçimli bir liste | |
<select name="listeMultiple" size="3" multiple>..</select> | çoklu seçim listesi | |
<input type="button" value="Sil" onclick='effacerListe("listeSimple")'> | seçimi kaldırmaya yarayan düğme listeSimple (7) | |
<input type="button" value="Sil" onclick='listeSil("listeMultiple")'> | listeSimple (7) içinde listeMultiple (8) içinde seçilen öğeleri | |
<input type="submit" value="Gönder"> | formun gönder düğmesi | |
<input type="hidden" name="secret" value="..."> | gizli bir alan |
Birkaç durumu ayırt edelim:
- 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?
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. | |
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. | |
aynı şekilde | |
aynı | |
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 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 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. | |
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 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. | |
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" alanı, HTML <input type="hidden" name="secret" value="XX"> alanından XX değerini alacaktır. Bu metin, gerekirse boş bir dize olabilir. |
- 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:
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'in değeri "on" ise onay kutusu işaretlenecek, aksi takdirde işaretlenmeyecektir | |
aynı şekilde | |
aynı şekilde | |
alanın değeri giriş alanında görüntülenecektir champSaisie | |
alanın değeri giriş alanında görüntülenecektir mdp | |
alanın değeri boiteSaisie giriş alanına görüntülenecektir | |
Bu alanın değeri, form görüntülendiğinde açılır menüden hangi öğenin seçilmesi gerektiğini belirtir | |
aynı | |
listeMultiple tablosundaki değerler, form görüntülendiğinde çoklu listeden hangi öğelerin seçilmesi gerektiğini belirtir | |
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.
- 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:
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 |
"hayır" | |
boş dize | |
boş dize | |
boş dize | |
boş dize | |
boş dize | |
boş dize | |
boş diziler tablosu | |
"xxx" | |
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 |
<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" | |
<input type="checkbox" name="chk1" value="on"> | - chk1 kutucuğu işaretlenmişse "on" - chk1 kutucuğu işaretlenmemişse önceki değerini korur | |
<input type="checkbox" name="chk2" value="on"> | - chk2 kutucuğu işaretlenmişse "on" - chk2 kutucuğu işaretlenmemişse önceki değerini korur | |
<input type="checkbox" name="chk2" value="on"> | - chk3 kutucuğu işaretlenmişse "on" - chk3 kutucuğu işaretlenmemişse önceki değerini korur | |
<input type="text" name="champSaisie" value=""> | - kullanıcı tarafından champSaisie alanına girilen değer | |
<input type="password" name="mdp" value=""> | - mdp alanına kullanıcı tarafından girilen değer | |
<textarea name="boiteSaisie"></textarea> | - kullanıcı tarafından boiteSaisie alanına girilen değer | |
<select name="combo">...</select> | - combo'da kullanıcı tarafından seçilen değer | |
<select name="listeSimple" size="3">...</select> | - listeSimple'te kullanıcı tarafından seçilen değer | |
<select name="listeMultiple" multiple="multiple" size="5"> | - listeMultiple'te kullanıcı tarafından seçilen değerleri içeren dize dizisi | |
<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:
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:
formulaire.jsp görünümü, şimdi açıklayacağımız etiketleri kullanır:
<body background="<html:rewrite page="/images/standard.jpg"/>"> | |||
html:rewrite etiketi, URL dosyalarında uygulama adından bağımsız çalışmayı sağlar. Bu etiketin bir özniteliği vardır:
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" |
<html:form action="/confirmation" name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire"> | |||||||
html:form etiketi, HTML form etiketini oluşturmaya yarar. Bu etiketin birkaç özniteliği vardır:
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. |
<html:radio name="dynaFormulaire" property="opt" value="evet">Evet</html:radio> | |||||||
html:radio etiketi, HTML <input type="radio" ...> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
Başlangıç ve bitiş etiketleri arasındaki metin, radyo düğmesinin yanında görüntülenecek metindir. |
<html:checkbox name="dynaFormulaire" property="chk1">1</html:checkbox> | |||||||
html:checkbox etiketi, HTML <input type="checkbox" ...> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
Başlangıç ve bitiş etiketleri arasındaki metin, onay kutusunun yanında görüntülenecek metindir. |
<html:text name="dynaFormulaire" property="champSaisie" /> | |||||||
html:text etiketi, HTML <input type="text" ...> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
|
<html:password name="dynaFormulaire" property="mdp" /> | |
html:password etiketi, HTML <input type="password" ...> etiketini oluşturmak için kullanılır. Bu etiket çeşitli öznitelikleri destekler: |
<html:textarea name="dynaFormulaire" property="boiteSaisie" /> | |||||||
html:textarea etiketi, HTML <textarea>...</textarea> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
|
<html:select name="dynaFormulaire" property="combo">....</html:select> | |||||||
html:select etiketi, HTML <select>...</select> etiketini oluşturmak için kullanılır. Çeşitli öznitelikleri destekler:
|
<html:select name="dynaFormulaire" property="combo"> <html:options name="dynaFormulaire" property="valeursCombo"/> </html:select> | |||||
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:
|
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.
<html:hidden name="dynaFormulaire" property="secret"/> | |||||
html:hidden etiketi, HTML <input type="hidden" ...> etiketini oluşturmak için kullanılı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:
<body background="<html:rewrite page="/images/standard.jpg"/>"> | |
HTML kodunu oluşturur |
<html:form action="/confirmation" name="dynaFormulaire" type="istia.st.struts.formulaire.DynaFormulaire"> ... </html:form> | |
HTML kodunu oluşturur |
<html:radio name="dynaFormulaire" property="opt" value="evet">Evet</html:radio> <html:radio name="dynaFormulaire" property="opt" value="hayır">Hayır</html:radio> | |
dynaFormulaire'in opt alanı "evet" ise, HTML kodunu oluştur |
<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> | |
dynaFormulaire'in chk1 ve chk3 alanları "on" ve chk2 alanı "off" ise, HTML kodunu oluştur |
<html:text name="dynaFormulaire" property="champSaisie" /> | |
champSaisie alanı "bu bir deneme" değerindeyse, HTML kodunu oluşturur |
<html:password name="dynaFormulaire" property="mdp" /> | |
eğer mdp alanı "azerty" ise, HTML kodunu üretir |
<html:password name="dynaFormulaire" property="mdp" /> | |
eğer mdp alanı "azerty" ise, HTML kodunu üretir |
<html:password name="dynaFormulaire" property="mdp" /> | |
eğer mdp alanı "azerty" ise, HTML kodunu üretir |
<html:select name="dynaFormulaire" property="combo"> <html:options name="dynaFormulaire" property="valeursCombo"/> </html:select> | |
eğer açılır menü alanı "combo2" ise, HTML kodunu oluşturur |
<html:select name="dynaFormulaire" property="listeSimple" size="3"> <html:options name="dynaFormulaire" property="valeursListeSimple"/> </html:select> | |
listeSimple alanı "simple1" değerindeyse, HTML kodunu oluşturur |
<html:select name="dynaFormulaire" property="listeMultiple" size="5" multiple="true"> <html:options name="dynaFormulaire" property="valeursListeMultiple"/> </html:select> | |
listeMultiple alanı {"multiple0","multiple2"} dizisiyse, HTML kodunu oluşturur |
<html:hidden name="dynaFormulaire" property="secret"/> | |
eğer "secret" alanı "xxx" değerindeyse, HTML kodunu oluşturur |
<html:submit>Gönder</html:submit> | |
HTML kodunu oluşturur |
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:
[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 |
web belgesinin tamamını ifade eder | |
belgede tanımlanan formların toplamını ifade eder | |
belgedeki i numaralı formu belirtir | |
name özniteliği "nomFormulaire" olan <form> formunu belirtir | |
name özniteliği "nomFormulaire" olan <form> formunu belirtir | |
[formulaire] ifadesiyle belirtilen formun üye öğelerinin koleksiyonunu ifade eder. Bu koleksiyon, belirtilen formdaki tüm <input>, <textarea>, <select> etiketlerini içerir. | |
, [formulaire]'in i numaralı öğesini belirtir | |
[formulaire] öğesi içinde name özniteliği nomComposant değerine eşit olan öğeyi belirtir | |
name özniteliği nomComposant'e eşit olan [formulaire] öğesini belirtir | |
[formulaire] formundaki [composant] bileşeninin değerini belirtir; bu formun HTML kodu, value özniteliğine sahip olabilir (<input>, <textarea>) | |
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. | |
<select> etiketiyle ilişkili seçenekler tablosunu belirtir | |
belirtilen <select> etiketinin i numaralı seçeneğini belirtir | |
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:
düğmenin bulunduğu web belgesini belirtir | |
düğmenin bulunduğu formu belirtir | |
formdaki listeSimple bileşenini belirtir | |
, 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:
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. |
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. |
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. |
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. |
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. |
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:
Yukarıda belirtildiği gibi, i numaralı yinelemede (i>=0), oluşturulan HTML kodu aşağıdaki kodla eşdeğerdir: |
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: |
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:
![]() | ![]() |
![]() | ![]() |


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.






