3. Denetleyici tarafından formun işlenmesi
Şimdi, kullanıcı formdaki [Envoyer] düğmesine bastığında denetleyici tarafından form değerlerinin işlenmesine odaklanacağız.
3.1. struts-config.xml dosyası
Struts denetleyicisinin yeni struts-config.xml yapılandırma dosyası şu şekilde olur:
<?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="frmPersonne"
type="istia.st.struts.personne.FormulaireBean"
/>
</form-beans>
<action-mappings>
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
<action
path="/erreurs"
parameter="/vues/erreurs.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
<action
path="/reponse"
parameter="/vues/reponse.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
<action
path="/formulaire"
parameter="/vues/formulaire.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
</action-mappings>
<message-resources parameter="ressources.personneressources"/>
</struts-config>
Değişiklikleri vurguladık:
- bir <form-beans> bölümü eklenmiştir. Bu bölüm, uygulamadaki her bir formla ilişkili sınıfları tanımlamak için kullanılır. Uygulamada farklı form sayısı kadar <form-bean> etiketi bulunmalıdır. Burada tek bir formumuz olduğu için tek bir <form-bean> bölümü vardır. Her form için şunları tanımlamamız gerekir:
- adını (name özniteliği)
- form değerlerini depolamaktan sorumlu, ActionForm'ten türetilen sınıfın adı (type özniteliği)
Bu iki öznitelik rastgele seçilemez. Formun HTML kodundaki <html:form> etiketinde kullanılanlarla aynı olmalıdır. (ad, yaş) formundaki bu etiketi hatırlayalım:
Form, struts-config.html dosyasında da aynı şekilde bildirilmelidir. Burada yapılan da budur:
- /main eyleminin yapılandırması değişti. Bu eylem, form değerlerini işlemekle görevlidir. Bu nedenle, eylemin ihtiyaç duyduğu bilgileri formda belirtmeliyiz:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
/main servleti, kendisine adı verilmesi gereken bir formu işleyecektir. Bu işi name özniteliği yapar. Bu ad, <form-bean> bölümlerinden birinin name özniteliğine atıfta bulunmalıdır; burada bu, frmPersonne'tir.
scope="session" özniteliği, form değerlerinin oturumda depolanması gerektiğini belirtir. Bu her zaman gerekli değildir. Ancak burada gereklidir. Nitekim, /reponse.do ve /erreurs.do görünümlerinde forma yönlendiren bağlantılar bulunmaktadır. Her iki durumda da, önceki bir istemci-sunucu iletişimi sırasında kullanıcı tarafından girilen değerlerle birlikte formu görüntülemek istiyoruz. Bu nedenle, formun oturumda depolanması gerekiyor.
Validate özniteliği, frmPersonne nesnesinin validate yönteminin çağrılıp çağrılmayacağını belirtir. Bu yöntem, form verilerinin geçerliliğini kontrol etmek için kullanılır. Burada, verilerin doğrulanması gerektiğini belirtiyoruz; bu da FormulaireBean sınıfında bir validate yöntemi yazmamız gerektiği anlamına gelir. Formun validate yöntemi, /main servlet'i çağrılmadan önce Struts denetleyicisi tarafından çağrılır. Bu yöntem, bir hata listesine benzeyen ActionErrors türünde bir nesne döndürür. Bu liste varsa ve boş değilse, Struts denetleyicisi burada durur ve yanıt olarak input özniteliğiyle belirtilen görünümü gönderir. Görünüm, istekte ActionErrors listesini alacak ve bunu <html:errors> etiketiyle görüntüleyebilecektir. Yukarıda, hata olması durumunda /main servlet’inin /erreurs.do görünümünü göndermesi gerektiğini belirtmiştik. Bu görünümün, aşağıdaki URL /vues/erreurs.reponse.jsp ile ilişkili olduğunu hatırlayalım:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<html:errors/>
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
</body>
</html>
Bu görünüm, hata listesini görüntülemek için <html:errors> etiketini doğru bir şekilde kullanıyor. Bu hata listesinde hata mesajları değil, <message-resources> etiketiyle referans verilen dosyada bulunan mesaj tanımlayıcıları yer alıyor (dikkat: resources kelimesinde s tekil olarak kullanılır):
Aşağıdaki etiket, uygulama tarafından kullanılan mesajları içeren dosyanın WEB-INF/classes/ressources/personneressources.properties dosyasında bulunduğunu gösterir:

Bu dosyada neler bulunur? Bu, Java'daki Properties sınıfına karşılık gelen bir özellik dosyasıdır, yani bir dizi anahtar=değer satırından oluşur:
errors.header=<ul>
errors.footer=</ul>
personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>
Bu mesaj dosyası en az iki işleve sahiptir:
- uygulamayı yeniden derlemeye gerek kalmadan mesajları değiştirmeye olanak tanır
- Struts uygulamalarının uluslararası hale getirilmesini sağlar. Her dil için birer tane olmak üzere birden fazla kaynak dosyası oluşturulabilir. Struts, bu dosyaların adlandırılmasında belirli standartlara uyulduğu takdirde doğru mesaj dosyasını otomatik olarak kullanır.
- Formun validate yöntemi boş bir hata listesi döndürürse, Struts denetleyicisi ForwardAction servletinin execute yöntemini çağırır. Burada şunu anlamak önemlidir: Servletin execute yöntemi çalıştırıldığında, bu, form verilerinin geçerli kabul edildiği anlamına gelir (tabii ki validate="true" ile doğrulanmış olmaları şartıyla). Geliştirici, eyleme bağlı servletin execute yönteminde formu fiilen işler. İşlemenin özü (uygulama mantığı, iş sınıflarının ve veri erişim sınıflarının kullanımı) burada yer alır. Sonuç olarak, yöntem, oluşturucuya müşteriye yanıt olarak hangi görünümün gönderilmesi gerektiğini belirten ActionForward türünde bir sonuç döndürür. Burada Struts’un önceden tanımlanmış ForwardAction eylemini kullandık. Bu eylemin execute yöntemi, parameter özniteliği ile belirtilen URL’e işaret eden bir ActionForward döndürmekle yetinir:
<action
path="/main"
name="frmPersonne"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Dolayısıyla, form verileri geçerliyse, /main eylemi daha önce kullandığımız /vues/main.html görünümünü döndürecektir.
3.2. Yeni FormulaireBean sınıfı
Daha önce, formulaire.personne.jsp formundaki verileri (ad, yaş) depolamakla görevli FormulaireBean sınıfının ilk bir sürümünü oluşturmuştuk. Bu sürüm, verilerin geçerliliğini kontrol etmiyordu. Şimdi bunu yapmamız gerekiyor, çünkü struts-config.xml dosyasında, form verilerinin ForwardAction servletine aktarılmadan önce doğrulanması gerektiğini (validate="true") belirtmiştik. Sınıfın kodu şu şekilde oluyor:
package istia.st.struts.personne;
import javax.servlet.http.*;
import org.apache.struts.action.*;
public class FormulaireBean
extends ActionForm {
// ad
private String nom = null;
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
// yaş
private String age = null;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
// doğrulama
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
// hata yönetimi
ActionErrors erreurs = new ActionErrors();
// ad alanı boş olmamalıdır
if (nom == null || nom.trim().equals("")) {
erreurs.add("nomvide", new ActionError("personne.formulaire.nom.vide"));
// yaş pozitif bir tamsayı olmalıdır
}
if (age == null || age.trim().equals("")) {
erreurs.add("agevide", new ActionError("personne.formulaire.age.vide"));
}
else {
// yaş pozitif bir tamsayı olmalıdır
if (!age.matches("^\\s*\\d+\\s*$")) {
erreurs.add("ageincorrect", new ActionError("personne.formulaire.age.incorrect", age));
// hata listesi döndürülür
}
} //if
// hata listesi döndürülür
return erreurs;
}
}
Yenilik, validate yönteminin yazımında yatmaktadır. Bu yöntem, Struts denetleyicisi tarafından, aynı adlı form alanlarının değerlerini sınıfın nom ve age özniteliklerine atadıktan sonra çağrılır. Bu yöntem, nom ve age özniteliklerinin geçerliliğini kontrol etmelidir. Yukarıdaki kod oldukça anlaşılırdır:
- boş bir hata listesi (ActionErrors hatalar) oluşturulur
- "nom" alanı kontrol edilir. Boşsa, ActionErrors.add("anahtar", ActionError) yöntemi kullanılarak hata listesine bir hata eklenir.
- "age" alanı bir tamsayı değilse de aynı işlem yapılır.
- validate yöntemi, Struts denetleyicisine hata listesini (ActionErrors hatalar) döndürür. Eğer hatalar null ise veya erreurs.size() 0'a eşitse, denetleyici herhangi bir hata olmadığını kabul eder. Bu durumda, eyleme (type="org.apache.struts.actions.ForwardAction") atanan Action sınıfının execute yöntemini çalıştırır. Aksi takdirde, formdaki hatalarla ilişkili görünümü (input="/erreurs.do") geri döndürür.
ActionErrors hatalar listesine, ActionErrors.add ("cléErreur", new ActionError("cléMessage"[,param0, param1, param2, param3])) ile bir hata eklenir. İlk parametre "cléErreur", tıpkı bir sözlükte olduğu gibi, ActionErrors listesindeki bir ActionError öğesini benzersiz bir şekilde tanımlamak için kullanılır. Bu parametre herhangi bir değer alabilir. ActionError, ActionError(String cléMessage[,String param0, String param1, String param2, String param3]) burada cléMessage, hatayla ilişkili mesajın kimliği ve en fazla 4 adet isteğe bağlı parametredir. cléMessage kimliği rastgele bir kimlik değildir. Bu, struts-config.xml dosyasının <message-resources> etiketiyle belirtilen dosyada bulunan kimliklerden biridir:
Bu dosyanın (aslında WEB-INF/classes/ressources/personneressources.properties) aşağıdaki anahtarları içerdiğini hatırlayalım:
errors.header=<ul>
errors.footer=</ul>
personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>
FormulaireBean sınıfının validate yöntemi tarafından kullanılan mesaj anahtarlarının yukarıdaki dosyada gerçekten mevcut olduğu doğrulanabilir. Her hata mesajı için HTML <li> etiketini kullandık, böylece <html:errors> etiketi bunları bir liste olarak görüntüleyebilsin. ActionError nesnesinin yalnızca bir mesaj anahtarıyla değil, ek parametrelerle de oluşturulabileceğini gördük:
Bir ActionError nesnesi ek parametrelerle (en fazla dört adede kadar) oluşturulmuşsa, bu parametrelere mesaj metninde {0} ila {3} notasyonu kullanılarak erişilebilir. Böylece, FormulaireBean'in validate yöntemi, personne.formulaire.age.incorrect anahtarı ve param0 age ek parametresiyle bir ActionError oluşturur:
Mesajlar .properties dosyasında personne.formulaire.age.incorrect anahtarına atanan mesaj şöyledir:
{0} yaş değeriyle değiştirilecektir. Son olarak, errors.header ve errors.footer anahtarlarına sahip mesajlar, hata listesinin sırasıyla önüne ve arkasına yazılacaktır. Burada bu iki anahtar, <li> etiketlerini çevrelemesi gereken HTML <ul> ve </ul> etiketlerini eklemek için kullanılacaktır.
3.3. Formun geçerlilik testleri
Form geçerlilik testlerine hazırız. Uygulamanın çeşitli bileşenlerinin nereye yerleştirilmesi gerektiğini aşağıda hatırlatıyoruz:
![]() | |
![]() | |
![]() | |
![]() |
3.3.1. Test 1
Tomcat'i yeniden başlatarak yeni yapılandırma dosyalarını okumasını sağlayalım ve ardından URL http://localhost:8080/strutspersonne/formulaire.do adresini çağıralım:

Açıklamalar:
- struts-config.html'te aşağıdaki bölüm istismar edildi:
<action
path="/formulaire"
parameter="/vues/formulaire.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
Alınan sayfanın HTML kodunu incelersek, sayfanın <form> etiketinin şu şekilde olduğunu görürüz:
Submit türündeki [Envoyer] düğmesi, form verilerini URL /strutspersonne/main.do adresine gönderecektir.
3.3.2. Test 2
Giriş alanlarını boş bırakarak [Envoyer] düğmesini kullanalım. Aşağıdaki yanıtı alıyoruz:

Açıklamalar:
- yukarıda belirtildiği gibi, form verileri URL /strutspersonne/main.do adresine gönderildi. Ardından, struts-config.xml dosyasının aşağıdaki bölümleri kullanıldı:
<form-bean
name="frmPersonne"
type="istia.st.struts.personne.FormulaireBean"
scope="session"
/>
....
<action
path="/main"
name="frmPersonne"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
/main eylemi tetiklendi. Bu eylem, frmPersonne (name="frmPersonne") formunu kullanır. Buna bağlı olarak Struts denetleyicisi, gerekirse FormulaireBean sınıfından bir nesne oluşturmuştur (form-bean etiketinde type="istia.st.struts.personne.FormulaireBean" olarak belirtilmiştir). Bu nesnenin nom ve age özniteliklerini, HTML formundaki aynı adlı alanlarla doldurmuştur:
<table>
<tr>
<td>Nom</td>
<td><html:text property="nom" size="20"/></td>
</tr>
<tr>
<td>Age</td>
<td><html:text property="age" size="3"/></td>
</tr>
<tr>
</table>
Bu işlem tamamlandıktan sonra, Struts denetleyicisi FormulaireBean nesnesinin validate yöntemini çağırdı; çünkü yapılandırma dosyasında /main eyleminin validate özniteliği true olarak ayarlanmıştı:
<action
path="/main"
name="frmPersonne"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
FormulaireBean sınıfının validate yöntemi şöyledir:
// doğrulama
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
// hata yönetimi
ActionErrors erreurs = new ActionErrors();
// ad alanı boş olmamalıdır
if (nom == null || nom.trim().equals("")) {
erreurs.add("nomvide", new ActionError("personne.formulaire.nom.vide"));
// yaş pozitif bir tamsayı olmalıdır
}
if (age == null || age.trim().equals("")) {
erreurs.add("agevide", new ActionError("personne.formulaire.age.vide"));
}
else {
// yaş, pozitif bir tamsayı olmalıdır
if (!age.matches("^\\s*\\d+\\s*$")) {
erreurs.add("ageincorrect", new ActionError("personne.formulaire.age.incorrect", age));
// hata listesi verilir
}
} //if
// hata listesi döndürülür
return erreurs;
}
[nom] ve [age] alanları boş olduğu için, yukarıdaki validate yöntemi iki hatadan oluşan bir liste oluşturdu ve bunu Struts denetleyicisine geri gönderdi. Hatalar olduğu için denetleyici, daha sonra input özniteliğiyle ilişkili görünümü istemciye geri gönderdi. Hangi görünüm olduğunu belirlemek için, yapılandırma dosyasının aşağıdaki bölümünü kullandı:
<action
path="/erreurs"
parameter="/vues/erreurs.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
Sonuç olarak /vues/erreurs.personne.jsp görünümünü gönderdi. Bu görünümün kodu şöyledir:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<html:errors/>
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
</body>
</html>
<html:errors> etiketi, Struts denetleyicisi tarafından kendisine gönderilen hata mesajlarının listesini basit bir şekilde görüntüler. Bu etiket, <message-resources> etiketinde belirtilen hata mesajları dosyasını kullanır:
Bu dosyada aşağıdaki anahtarlar ve mesajlar bulunur:
personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.vide=<li>Vous devez indiquer un age</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>
errors.header=<ul>
errors.footer=</ul>
- errors.header anahtarıyla ilişkili mesaj yazılır
- Alınan ActionErrors listesindeki farklı anahtarlara ait mesajlar yazılır
- errors.footer anahtarına ait mesaj yazılır
3.3.3. Test 3
Hata sayfasındaki [Retour au formulaire] bağlantısını kullanalım. Aşağıdaki sayfaya ulaşırız:

Açıklamalar:
- [Retour au formulaire] bağlantısının kodu şu şekildedir: HTML
Struts denetleyicisi, yapılandırma dosyasından aşağıdaki bölümü kullanmıştır:
<action
path="/formulaire"
parameter="/vues/formulaire.personne.jsp"
type="org.apache.struts.actions.ForwardAction"
/>
Böylece /vues/formulaire.personne.jsp görünümünü geri gönderdi.
3.3.4. Test 4
Aşağıdaki formu doldurduktan sonra [Envoyer] düğmesini kullanıyoruz:

Aşağıdaki yanıtı alıyoruz:

Açıklamalar: Bunlar, 2 numaralı testtekilerle aynıdır.
3.3.5. Test 5
Yukarıdaki [Retour au formulaire] bağlantısını kullanıyoruz. Aşağıdaki sayfayı elde ediyoruz:

Formun, onayladığımız haliyle karşımıza çıktığını görüyoruz.
Açıklamalar: Test No. 3'tekilerle aynıdır, ancak ek bir bilgi daha vardır:
- Görüntülenen HTML formunda şu etiketler bulunmaktadır:
<table>
<tr>
<td>Nom</td>
<td><html:text property="nom" size="20"/></td>
</tr>
<tr>
<td>Age</td>
<td><html:text property="age" size="3"/></td>
</tr>
<tr>
</table>
<html:text> etiketlerinin iki işlevi vardır:
- istemciden sunucuya form değerleri gönderilirken, formdaki giriş alanlarının değerleri, FormulaireBean nesnesindeki aynı adlı alanlara atanır
- sunucu tarafından görüntülenecek formun HTML kodu istemciye gönderilirken, <html:text> etiketleriyle ilişkili giriş alanlarının value öznitelikleri, FormulaireBean nesnesindeki aynı adlı alanların değerleriyle başlatılır.
Burada iki farklı istemci-sunucu iletişimi söz konusudur:
- birincisinde, kullanıcı formu doldurup sunucuya göndermiştir
- ikincisinde ise kullanıcı, [Retour au formulaire] bağlantısını kullanarak forma geri dönmüştür.
İkinci etkileşimde formun orijinal değerleriyle yeniden görüntülenebilmesinin tek yolu, bu değerlerin müşterinin oturumuna kaydedilmesidir. /main eylemini yapılandıran bölümde talep edilen de budur:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Eğer scope="request" ayarını yapmış olsaydık, form verileri oturumda depolanmazdı ve ikinci veri alışverişinde bu değerleri bulamazdık.
3.3.6. Test 6
Forma geri dönelim ve bu sefer geçerli veriler girelim:

Formu gönderelim. Aşağıdaki sonucu elde ediyoruz:

Açıklamalar:
- [Envoyer] düğmesi, form değerlerini URL /strutspersonne/main.do adresine gönderdiğinden, ActionErrors sonucunun FormulaireBean yönteminin validate yönteminden Struts denetleyicisine geri dönene kadar, 2 numaralı testtekiyle aynı açıklamalar geçerlidir. Ancak burada bu liste boştur. Denetleyici bu durumda /main eyleminin yapılandırmasının yeni bir bölümünü kullanır:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
parameter="/vues/main.html"
type="org.apache.struts.actions.ForwardAction"
/>
Struts denetleyicisi, gerekirse type özniteliğiyle belirtilen türde bir nesne oluşturur. Bu sınıfın execute yöntemi çalıştırılır ve denetleyicinin müşteriye yanıt olarak göndermesi gereken görünümü belirten ActionForward türünde bir nesne döndürmelidir. Burada type özniteliği, önceden tanımlanmış ForwardAction sınıfını belirtir. Bu sınıfın execute yöntemi hiçbir işlem yapmaz ve yalnızca parameter özniteliği ile tanımlanan görünüme (burada /vues/main.html görünümü) işaret eden bir ActionForward nesnesi döndürür. Bu, denetleyicinin geri gönderdiği görünümdür.
3.3.7. Test 7
/formulaire.do görünümünü tekrar talep ediyoruz:

Formu, onayladığımız haliyle buluyoruz. Bunun açıklaması daha önce yapılmıştı. Yapılandırma (scope="session") sayesinde formun oturumda kalmasını talep ettik. Dolayısıyla, formun değerleri istemci-sunucu arasındaki iletişim sırasında korunur.
Neredeyse bitti. Geriye, form verilerinin geçerli olması durumunda uygulanacak gerçek bir eylem oluşturmak kaldı. Şu an için, örneğimizi basitleştirmek amacıyla önceden tanımlanmış ForwardAction eylemini kullandık.
3.4. /main eyleminin yeni yapılandırması
Mevcut struts-config.xml yapılandırma dosyasını, /main bölümünü aşağıdaki şekilde değiştirmek dışında değiştirmeyeceğiz:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
type="istia.st.struts.personne.FormulaireAction"
>
<forward name="reponse" path="/reponse.do"/>
</action>
type özniteliği artık FormulaireAction adlı başka bir sınıfı işaret ediyor; bu sınıfı oluşturmamız gerekecek. frmPersonne formundaki veriler geçerliyse, bu sınıfın execute yöntemi çalıştırılacaktır. "execute" yönteminin yapması gerekeni yaptığını ve denetleyicinin müşteriye geri göndermesi gereken görünümü belirten ActionForward türünde bir nesne döndürdüğünü belirtmiştik. Formun işlenme sonucuna bağlı olarak genellikle birden fazla görünüm seçeneği olabilir. Olası farklı görünümlerin listesi, <action> etiketinin içinde yer alan <forward> etiketlerinde listelenir. Bu tür bir etiketin sözdizimi şöyledir:
bir görünümü benzersiz bir şekilde tanımlayan herhangi bir ad | |
anahtarla ilişkili görünümün URL |
3.5. FormulaireAction sınıfı
FormulaireAction sınıfını yazmak, esasen execute yöntemini yazmaktan ibarettir:
package istia.st.struts.personne;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.ServletException;
public class FormulaireAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException,ServletException {
// form geçerliyse, aksi takdirde bu noktaya gelinmezdi
FormulaireBean formulaire=(FormulaireBean)form;
request.setAttribute("nom",formulaire.getNom());
request.setAttribute("age",formulaire.getAge());
return mapping.findForward("reponse");
}//çalıştır
}
execute yöntemi dört parametre alır:
- ActionMapping eşlemesi: Yürütülmekte olan eylemin yapılandırmasına ait bir "görüntü" nesnesi; dolayısıyla burada aşağıdaki yapılandırmanın bir görüntüsü:
<action
path="/main"
name="frmPersonne"
validate="true"
input="/erreurs.do"
type="istia.st.struts.personne.FormulaireAction"
>
<forward name="reponse" path="/reponse.do"/>
</action>
Böylece eylem, eylemin sonunda müşteriye geri gönderilebilecek görünümlerle ilişkili anahtarlara erişebilir. excute yöntemi bu anahtarlardan birini geri göndermelidir.
- ActionForm form: Mevcut eylemin kullandığı formun değerlerinin bulunduğu bean nesnesi. Burada, FormulaireBean türündeki frmPersonne nesnesidir. Böylece eylem, form değerlerine erişebilir.
- HttpServletRequest istek: çeşitli servletler tarafından zenginleştirilmiş olabilecek istemci isteği. Böylece eylem, hem ilk isteğin (request.getParameter) tüm parametrelerine hem de bu ilk isteğe eklenen tüm özniteliklere erişebilir (request.getAttribute). Örneğimizde, execute yöntemi ismi ve yaşı ekleyerek isteği zenginleştirir. Bu iki değer zaten mevcut olduğu için bu işlem burada tamamen gereksizdir; ancak bunlar öznitelik olarak değil, parametreler olarak yer almaktadır. Kod burada sadece örnek amaçlıdır.
- HttpServletResponse response: İstemciye gönderilecek yanıt. Eylem bu yanıtı zenginleştirebilir. Burada bunu yapmamaktadır.
Burada özel bir durumla karşı karşıyayız. execute** yöntemi neredeyse hiçbir şey yapmıyor. Sadece bir sonraki görünümün **/reponse.do** olduğunu belirtmeli ve bu görünümün görüntülemesi gereken isim ve yaş bilgilerini alacağını isteğe eklemelidir. Bunu, ActionMapping sınıfının findForward yöntemini kullanarak yapar; bu yöntem, eylemin yapılandırmasındaki forward** etiketlerinde bulunan anahtarlardan birini parametre olarak kabul eder. Burada, böyle bir etiket sadece bir tane vardır:
Dolayısıyla, yöntemimiz /reponse.do görünümünün gönderilmesi gerektiğini belirtmek için "reponse" anahtarını içeren bir ActionForward döndürür.
3.6. FormulaireAction Testleri
Önceki sınıfı JBuilder ile derliyoruz ve oluşturulan .class dosyasını WEB-INF/classes dizinine yerleştiriyoruz:

/vues/reponse.personne.jsp görünümünü değiştiriyoruz:
<%
// ad ve yaş verilerini alıyoruz
String nom=(String)request.getAttribute("nom");
String age=(String)request.getAttribute("age");
%>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Personne - réponse</h2>
<hr>
<table>
<tr>
<td>Nom</td>
<td><%= nom %>
</tr>
<tr>
<td>Age</td>
<td><%= age %>
</tr>
</table>
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
</body>
</html>
Görünüm, aldığı isteğin özniteliklerinden isim ve yaş bilgilerini alır. URL http://localhost:8080/strutspersonne/formulaire.do adresinden formu talep ediyoruz ve ardından dolduruyoruz:

[Envoyer] düğmesini kullanıyoruz ve şu yanıtı alıyoruz:

Açıklamalar:
- Sürecin başlangıcı için 2 numaralı testte verilen açıklamayı tekrar kullanacağız. /main eyleminin yapılandırmasını hatırlayalım:
<action
path="/main"
name="frmPersonne"
scope="session"
validate="true"
input="/erreurs.do"
type="istia.st.struts.personne.FormulaireAction"
>
<forward name="reponse" path="/reponse.do"/>
</action>
- Form, URL /main.do denetleyicisine gönderildikten sonra, denetleyici FormulaireBean türünde bir frmPersonne nesnesi oluşturdu veya geri dönüştürdü ve bu nesneye formdaki değerleri yükledi
- frmPersonne nesnesinin validate yöntemi çağrıldı. Veriler geçerli olduğu için, validate yöntemi boş bir ActionErrors listesi döndürdü.
- Bir FormulaireAction nesnesi oluşturuldu veya geri dönüştürüldü ve bu nesnenin execute yöntemi çağrıldı. Bu yöntem, "reponse" anahtarına sahip bir ActionForward nesnesi döndürdü.
- Ardından denetleyici, "reponse" anahtarına bağlı c.a.d görünümünü gönderdi. /reponse.do ve dolayısıyla /vues/reponse.personne.jsp.
- reponse.personne.jsp görünümü, FormulaireAction nesnesinin execute yöntemi tarafından isteğe eklenen değerlerle görüntülendi.
3.7. Sonuç
Tam ama basit bir uygulama geliştirdik. Struts, Tomcat ve JBuilder ile bunu gerçek ortamda uygularken, özellikle uygulamanın yapılandırma dosyaları olan XML dosyalarında çok sayıda hata yapma olasılığı vardır. İlk bakışta, bu uygulamayı Struts kullanmadan bir servlet ve JSP sayfalarıyla oluşturmak daha basit görünebilir. Yeni başlayanlar için bu muhtemelen doğrudur. Deneyim kazandıkça Struts ile geliştirme yapmak daha kolay hale gelir. Birçok şirket, aşağıdaki nedenlerden dolayı web geliştirmelerinde Struts metodolojisini zorunlu kılmaktadır:
- Struts, MVC modeline uygundur
- Tüm geliştiriciler aynı şekilde çalıştığında, uygulamaların bakımı standart bir mimariye sahip oldukları için daha kolay hale gelir.



