2. strutspersonne uygulaması
Klasik yöntemle, servlet ve JSP sayfaları kullanarak bir kişi uygulaması üzerinde çalıştık. Şimdi aynı uygulama üzerinden Struts'u tanıtmayı planlıyoruz.
2.1. Uygulamanın işleyişi
Burada, geliştirdiğimiz "kişi" uygulamasının işleyişini hatırlayalım. Uygulama şunlardan oluşur:
- bir ana servlet'ten oluşur. Uygulamanın tüm mantığını bu servlet sağlar.
- Üç JSP sayfası: formulaire.personne.jsp, reponse.personne.jsp, erreurs.personne.jsp
Uygulamanın işleyişi şu şekildedir. Uygulamaya URL http://localhost:8080/personne/main adresi üzerinden erişilebilir. Bu URL'de, formulaire.personne.jsp sayfası tarafından sağlanan bir form karşımıza çıkar:

Kullanıcı formu doldurur ve [Envoyer] adlı gönder düğmesine basar. [Rétablir] düğmesi sıfırlama düğmesidir; c.a.d düğmesi ise belgeyi alındığı duruma geri getirir. [Effacer] düğmesi bir düğme türündedir. Kullanıcı geçerli bir isim ve yaş girmelidir. Aksi takdirde, JSP ve erreurs.personne.jsp sayfaları aracılığıyla bir hata sayfası gönderilir. İşte bazı örnekler:
1. İşlem
![]() | ![]() |
[Retour au formulaire] bağlantısını takip edersek, onu bıraktığımız haliyle buluruz:
2 numaralı değişim
![]() | ![]() |
Kullanıcı doğru verileri gönderirse, uygulama JSP reponse.personne.jsp sayfası aracılığıyla kullanıcıya bir yanıt gönderir.
1. Alışveriş
![]() | ![]() |
[Retour au formulaire] bağlantısını takip edersek, onu bıraktığımız haliyle buluruz:
2 numaralı değişim
![]() | ![]() |
2.2. Uygulamanın Struts mimarisi
Aşağıdaki Struts mimarisini kullanacağız:
![]() |
- Üç görünüm olacaktır
- denetleyici, Struts tarafından sağlanan denetleyici olacaktır
- FormulaireBean, formulaire.personne.jsp görünümü tarafından sunulan formun değerlerini depolamaktan sorumlu sınıftır
- FormulaireAction, FormulaireBean'in değerlerini işleyip gönderilecek yanıt sayfasını belirleyen sınıftır:
- form verileri hatalıysa erreurs.personne.jsp görünümü
- aksi takdirde reponse.personne.jsp görünümü
Geliştirici için iş, şu kodu yazmaktan ibarettir:
- üç görünümün
- formla ilişkili FormulaireBean bean'i
- formu işlemekle görevli FormulaireAction sınıfı
2.3. Struts uygulaması için gerekli sınıfları derlemek
Uygulamamız için gerekli sınıfları derlemek üzere JBuilder'ı kullanacağız. JBuilder, Struts uygulamaları için gerekli sınıfların bulunmadığı bir JDK dosyasıyla çalışır. JBuilder'ı şu şekilde yapılandırabiliriz:
- Tools (Araçlar) seçeneği / Configure JDKs (JDK'i yapılandır)

- [Add/Ajouter] düğmesini kullanarak, JBuilder sınıf arşivlerine Struts tarafından sağlanan .jar dosyalarını ekleyebiliriz. Struts arşivini diske açmışsak, <struts>/lib klasöründeki tüm .jar dosyalarını JBuilder'a ekleyebiliriz:

Yukarıdaki tüm .jar dosyalarını JBuilder arşivlerine ekleyebilirsiniz. Tomcat'in de Struts arşivlerine erişmesi gerektiğini daha önce görmüştük. 4.x Tomcat'i için Struts .jar dosyalarını <tomcat4>\common\lib klasörüne yerleştirebiliriz. 5.x Tomcat'i için ise bunları <tomcat5>\shared\lib klasörüne yerleştirebiliriz. Daha sonra JBuilder’ın Struts .jar dosyalarını Tomcat ile aynı konumda bulmasını sağlayabiliriz. Biraz yukarıda JBuilder’ın .jar dosyalarını gösteren ekran görüntüsünde de bu şekilde yapılmıştır. Bu dosyalar <tomcat5>\shared\lib dizininden alınmıştır.
Dolayısıyla, bir sınıf derlenirken JBuilder bir Struts sınıfını bulamadığını bildirirse, iki şeyi kontrol edin:
- sınıfın yazımı
- JBuilder tarafından kullanılan .jar dosyalarını. Tüm Struts .jar dosyaları bu listede yer almalıdır.
2.4. strutspersonne uygulamasının görünümleri
Uygulamanın üç görünümü şunlardır:
- formulaire.personne.jsp: Bir kişinin adı ve yaşını girmek için kullanılan formu görüntüler
- reponse.personne.jsp: Girilen değerler geçerliyse bunları görüntüler
- erreurs.personne.jsp: varsa hataları görüntüler
2.4.1. erreurs.personne.jsp görünümü
Hata listesini görüntüleyen bu görünüm şu şekilde tanımlanacaktır:
<%@ 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 kodda iki yenilik var:
- <html:XX/> etiketlerinin varlığı; bunlar HTML etiketleri değildir. Aslında, JSP etiket kütüphaneleri oluşturulabilir; bu kütüphaneler, JSP sayfasının servlet'e dönüştürülmesi sırasında Java koduna dönüştürülür.
- JSP sayfası, kullandığı etiket kütüphanelerini beyan etmelidir. Bunu burada şu satırla yapmaktadır:
Bu satır iki bilgi verir:
- uri: kütüphanenin kullanım kurallarını belirleyen dosyanın konumu. struts-html.tld dosyası, Struts dağıtımında sağlanmaktadır. Yukarıdaki örnekte bu dosya, WEB-INF klasörüne yerleştirilecektir.
- prefix: kodda kütüphanenin etiketlerine önek eklemek için kullanılan tanımlayıcıdır. Bu, birden fazla etiket kütüphanesinin aynı anda kullanılması sırasında ortaya çıkabilecek isim çakışmalarını önler. İki farklı kütüphanede aynı isimde iki etiket bulunabilir. Her kütüphaneye farklı bir önek vererek, tüm belirsizlikler ortadan kaldırılır.
- <html:errors> etiketi, Struts denetleyicisinin kendisine ilettiği hata listesini görüntüler.
- <html:link> etiketi, /C/page adresine yönlendiren bir bağlantı oluşturur; burada
- C, uygulamanın bağlamıdır
- page ise etiketin page özniteliğinde belirtilen URL'tir
Etiket
aşağıdaki HTML kodunu oluşturacaktır:
burada C, uygulamanın bağlamıdır
2.4.2. erreurs.personne.jsp görünümünün testi
- erreurs.personne.jsp dosyası, strutspersonne uygulamasının "vues" klasörüne yerleştirilir:

- struts-html.tld dosyası Struts dağıtımından (<struts>/lib) alınarak WEB-INF dosyasına yerleştirilir:

- struts-config.xml dosyası şu şekilde değiştirilir:
<?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>
<action-mappings>
<action
path="/main"
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-mappings>
</struts-config>
Yapılandırma dosyasında, Struts denetleyicisi tarafından işlenmek üzere yeni bir URL /hatalar dosyası oluşturuyoruz. URL /erreurs.do, /vues/erreurs.personne.jsp görünümüne yönlendirilecektir. struts-config.xml dosyası, WEB-INF klasörüne yerleştirilir.
- Yeni struts-config.xml dosyasının dikkate alınması için Tomcat'i yeniden başlatıyoruz, ardından http://localhost:8080/strutspersonne/erreurs.do URL'sini çağırıyoruz:

<html:errors/> etiketi hiçbir sonuç vermedi. Bu normaldir, çünkü ForwardAction eylemi, etiketin beklediği hata listesini oluşturmadı. Bununla birlikte, yukarıdaki yanıt, JSP görünümümüzün en azından sözdizimsel olarak doğru olduğunu göstermektedir; aksi takdirde bir hata sayfası alırdık. Tarayıcı tarafından alınan HTML kodunu (Görünüm/Kaynak) kontrol edelim:
<html>
<head>
<title>Personne - erreurs</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<a href="/strutspersonne/formulaire.do">Retour au formulaire</a>
</body>
</html>
<html:link> etiketiyle oluşturulan bağlantıya dikkat edin. /strutspersonne bağlamı bağlantıya otomatik olarak eklenmiştir. Bu sayede, <html:link> tarafından oluşturulan bağlantıları değiştirmeye gerek kalmadan uygulamayı bir bağlamdan diğerine (örneğin, başka bir makineye) taşıyabilirsiniz.
2.4.3. reponse.personne.jsp görünümü
Formda girilen değerleri doğrulayan bu görünüm şöyledir:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%
// ad ve yaş verilerini alıyoruz
//String isim=(String)request.getAttribute("isim");
String nom="jean";
//String age=(String)request.getAttribute("age");
String age="24";
%>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Personne - réponse</h2>
<hr>
<table>
<tr>
<td>Nom</td>
<td><%= nom %>
</tr>
<tr>
<td>Age</td>
<td><%= age %>
</tr>
</table>
<br>
<html:link page="/formulaire.do">
Retour au formulaire
</html:link>
</body>
</html>
Sayfa, denetleyici tarafından önceden tanımlanmış request nesnesinde kendisine aktarılacak olan [nom] ve [age] bilgilerini görüntüler. Burada, denetleyicinin [nom] ve [age] değerlerini belirleme imkânı olmayacağı bir test yapıyoruz. Bu nedenle, bu iki bilgiyi rastgele değerlerle başlatıyoruz. Ayrıca, burada da forma geri dönüş bağlantısı bir <html:link> etiketiyle oluşturulur.
2.4.4. reponse.personne.jsp görünümünün testi
- reponse.personne.jsp dosyası, strutspersonne uygulamasının "vues" klasörüne yerleştirilmiştir:

- struts-config.xml dosyası şu şekilde değiştirilmiştir:
<?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>
<action-mappings>
<action
path="/main"
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-mappings>
</struts-config>
Yapılandırma dosyasında, Struts denetleyicisi tarafından işlenmek üzere yeni bir URL /reponse oluşturuyoruz. URL /reponse.do, /vues/reponse.personne.jsp görünümüne yönlendirilecektir. struts-config.xml dosyası, WEB-INF klasörüne yerleştirilir.
- Yeni struts-config.xml dosyasının dikkate alınması için Tomcat'i yeniden başlatıyoruz, ardından http://localhost:8080/strutspersonne/erreurs.do URL'sini çağırıyoruz:

Beklediğimiz sonucu elde ediyoruz.
2.4.5. formulaire.personne.jsp görünümü
Bu görünüm, kullanıcının adı ve yaşını girme formunu gösterir. JSP kodlu bu görünümün kodu şöyledir:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<meta http-equiv="pragma" content="no-cache">
<head>
<title>Personne - formulaire</title>
<script language="javascript">
function effacer(){
with(document.frmPersonne){
nom.value="";
age.value="";
}
}
</script>
</head>
<body>
<center>
<h2>Personne - formulaire</h2>
<hr>
<html:form action="/main" name="frmPersonne" type="istia.st.struts.personne.FormulaireBean">
<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>
<table>
<tr>
<td><html:submit value="Envoyer"/></td>
<td><html:reset value="Rétablir"/></td>
<td><html:button property="btnEffacer" value="Effacer" onclick="effacer()"/></td>
</tr>
</table>
</html:form>
</center>
</body>
</html>
Hata görünümünde kullanılan struts-html.tld etiket kütüphanesini tekrar görüyoruz. Yeni etiketler ortaya çıkıyor:
hem HTML <form> etiketini oluşturmak hem de bu formu işleyecek denetleyiciye bilgi vermek için kullanılır:
Form parametrelerinin (GET/POST) denetleyiciye gönderilme yönteminin belirtilmediğine dikkat edilmelidir. Bunu method özniteliği ile yapabiliriz. Bu öznitelik yoksa, varsayılan olarak POST yöntemi kullanılır. | |||||||
, <input type="text" value="..."> etiketini oluşturmak için kullanılır:
| |||||||
HTML <input type="submit"...> etiketini oluşturmak için kullanılır | |||||||
HTML <input type="reset"...> etiketini oluşturmak için kullanılır | |||||||
HTML <input type="button"...> etiketini oluşturmak için kullanılır |
2.4.6. formulaire.personne.jsp formuyla ilişkili bean
- Struts'ta her form, form değerlerini hatırlamak ve bunları geçerli oturumda saklamakla görevli bir bean ile ilişkilendirilmelidir. Bean, belirli bir sözdizimine uyması gereken bir Java sınıfıdır. Bir forma ilişkin bean, Struts kütüphanelerinde tanımlanan ActionForm sınıfından türetilmelidir:
- Bean'in öznitelik adları, formdaki alanlarla (formdaki html:text etiketlerinin property öznitelikleri) eşleşmelidir. Önceki form koduna göre, bean'in nom ve age adlı iki alanı olmalıdır.
- Formdaki her bir XX alanı için, bean iki yöntem tanımlamalıdır:
- public void setXX(Type değer): XX özniteliğine bir değer atamak için
- Type getXX(): XX alanının değerini almak için
Önceki formla ilişkili bean şu şekilde olabilir:
package istia.st.struts.personne;
import org.apache.struts.action.ActionForm;
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;
}
}
Bu sınıfları JBuilder ile derleyeceğiz.
2.4.7. formulaire.personne.jsp görünümünün testi
formulaire.personne.jsp dosyası, strutspersonne uygulamasının görünümler klasörüne yerleştirilir:

- struts-config.xml dosyası şu şekilde değiştirilir:
<?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>
<action-mappings>
<action
path="/main"
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>
</struts-config>
Yapılandırma dosyasında, Struts denetleyicisi tarafından işlenecek yeni bir URL /form oluşturuyoruz. URL /formulaire.do, /vues/formulaire.personne.jsp görünümüne yönlendirilecektir. struts-config.xml dosyası, WEB-INF klasörüne yerleştirilir.
- FormulaireBean sınıfını WEB-INF/classes klasörüne yerleştiriyoruz:

- Yeni struts-config.xml dosyasının dikkate alınması için Tomcat'i yeniden başlatıyoruz, ardından http://localhost:8080/strutspersonne/formulaire.do adresini çağırıyoruz:

Formu başarıyla alıyoruz. Formun JSP kodunda yer alan <html:XX> etiketlerinin nasıl "çevrildiğini" merak edebiliriz:
<html>
<meta http-equiv="pragma" content="no-cache">
<head>
<title>Personne - formulaire</title>
<script language="javascript">
function effacer(){
with(document.frmPersonne){
nom.value="";
age.value="";
}
}
</script>
</head>
<body>
<center>
<h2>Personne - formulaire</h2>
<hr>
<form name="frmPersonne" method="post" action="/strutspersonne/main.do">
<table>
<tr>
<td>Nom</td>
<td><input type="text" name="nom" size="20" value=""></td>
</tr>
<tr>
<td>Age</td>
<td><input type="text" name="age" size="3" value=""></td>
</tr>
<tr>
</table>
<table>
<tr>
<td><input type="submit" value="Envoyer"></td>
<td><input type="reset" value="Rétablir"></td>
<td><input type="button" name="btnEffacer" value="Effacer" onclick="effacer()"></td>
</tr>
</table>
</form>
</center>
</body>
</html>
Elde edilen formda, |Geri Yükle] ve [Effacer] düğmeleri çalışıyor. Submit türündeki [Envoyer] düğmesi, URL /strutspersonne/main.do sayfasına yönlendiriyor. Uygulamadaki web.xml dosyasına göre, Struts denetleyicisi bunu işleyecektir. struts-config.html dosyasına göre, denetleyici isteği /vues/main.html görünümüne yönlendirmelidir. Deneyelim:

Her şey beklendiği gibi ilerliyor. Geriye, form değerlerini gerçekten işlemek kalıyor: c.a.d. Form verilerini bir FormulaireBean nesnesinde alacak Action türü bir sınıf yazalım.








