Professional Documents
Culture Documents
Struts Rkindan Wwwjavadilicom
Struts Rkindan Wwwjavadilicom
Struts Rkindan Wwwjavadilicom
HACETTEPE ÜNİVERSİTESİ
i.c
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
dil
ARAŞTIRMA ÖDEVİ
(STRUTS)
va
Nilay KINDAN
20022054
ja
nilaykindan@hotmail.com
w.
ww
OCAK, 2005
o
HTML FORMLARI .................................................................................................................................................... 4
GİRDİLERİ ELE ALMA............................................................................................................................................ 5
METİN GİRDİSİ(TEXT INPUT) ..................................................................................................................................... 5
i.c
AÇILIR KUTU GİRDİSİ(DROP-DOWN COMBO BOX INPUT) ......................................................................................... 5
RADYO DÜĞMESİ GİRDİSİ .......................................................................................................................................... 7
ONAY KUTUSU GİRDİSİ .............................................................................................................................................. 7
ÇIKTILARI ELE ALMA............................................................................................................................................ 8
METİN ÇIKTISI(TEXT OUTPUT) .................................................................................................................................. 8
STRUTS’ TA TABLO YARATMA ................................................................................................................................... 8
ITERATE ETİKETİNİN ETKİ ALANINDA(SCOPE) İNDİSLİ NİTELİK KULLANMA.............................................................. 8
dil
BİR TABLODA ONAY DÜĞMELERİ KULLANMA .......................................................................................................... 9
RADYO DÜĞMELERİ TABLOSU YARATMA ............................................................................................................... 10
HATA MESAJLARI.................................................................................................................................................. 11
HATA MESAJLARINDA SABİTLERİN KULLANIMI ...................................................................................................... 12
HATA MESAJLARI İÇİN SAYFA BAŞLIĞI VE SAYFA ALTLIĞI ..................................................................................... 13
ACTİONFORM GEÇERLEME(VALİDATE) VE RESETLEME(RESET) ...................................................... 15
va
STRUTS-CONFİG.XML NEDİR?......................................................................................................................... 16
GENEL YÖNLENİCİLER(GLOBAL FORWARDS) .......................................................................................................... 16
ÇEKİRDEK BİLDİRİMLERİ ......................................................................................................................................... 16
ACTİON EŞLEMLERİ(ACTİON MAPPİNGS)................................................................................................................. 16
KAYNAKÇA:............................................................................................................................................................. 18
ja
w.
ww
o
Struts model, görünüm(view) ve denetçi(controller) MVC tasarım örüntüsüne dayalı sunucu
taraflı bir java uygulamasıdır. Web uygulamalarının sunum katmanını kolayca ayırabilmek, aynı
zamanda birim işlem ve veri katmanından soyutlamak için tasarlanmış açık kodlu bir
i.c
framework’tür.
Model: Model veri nesnelerinin kullanıcıya sunumundan sorumludur
Görünüm: Modelin ekrana sunumunda görev alır. Veri nesnelerinin o anki durumlarını sunar.
Denetçi: Kullanıcı girdileri ile etkileşecek kullanıcı arayüzlerinin yollarını tanımlar. Denetçi
bileşeni model veya veriyi işleyen bir nesnedir.
Struts MVC nin JSP, JSP etiketleri(tags) ve java servletlerinden oluşan kombinasyonun
gerçekleştirimidir.Struts daki her görünüm bileşeni struts etiketlerinin kombinasyonlarını
barındıran bir JSP ile eşleşir.
- İstem geliyor.
dil
Denetçi ve Action sınıflarını etkileşimleri şu şekildedir:
ACTION SINIFI
ja
JSP sayfasına veri aktarmak için mutlaka bir ActionForm sınıfına ihtiyaç vardır, yani bir JSP
ww
sayfasından baksa bir JSP sayfasına direkt bir geçiş söz konusu değildir. JSP’lere direkt erişim
tehlikelidir, mutlaka denetçi üzerinden geçiş yapmaları gerekiyor. Aksi takdirde denetçinin
sağlayacağı erişim kontrolü atlanmış olur.
o
ActionForm sınıfı bir yastık alanı gibi düşünülebilir.Kullanıcı yanlış veri girerse, bunun hemen
veri tabanına gitmesi engellenmiş oluyor. Kullanıcının girdiği eski verilerd bir yanlişlık varsa,
kullanıcı nerede hata yaptığını görebiliyor ve bunu düzeltebiliyor.
ActionForm sınıfındaki bütün alanlara ilk değerler atayabilirsiniz. Struts bu ilk değerleri gösterir
i.c
ve kullanıcının bunları değiştirmesine olanak verir. Kullanıcı formu onaylar, siz geçerlersiniz,
hataları saptarsınız, struts’a bulduğunuz hataların listesini verirsiniz ve bunları ele almasını
söylersiniz. Struts kullanıcıya formun üst kısmındaki hata listesiyle birlikte formu tekrar
görüntüler. Böylece kullanıcı hatalarını görür, düzeltir ve formu yeniden onaylar.
HTML FORMLARI
dil
Struts’daki html etiketleri(tag) genellikle sadece html:form etiketi bağlamı içinde çalışır.
Örneğin:
TanımDüzenle.do bu jsp için bir action sınıfıdır. scope verinin bulunacağı ve geçerli olacağı
faaliyet alanıdır. Bu form sunucuya html:submit etiketi kullanılarak onaya gönderilir. Aşağıda
bunun örneği yer almakta:
Bu action sınıfınızda ne yapacağınızı şekillendiren bir anahtardır. Eğer bu alan bos olsaydı, action
w.
sınıfınızı başka bir sayfadan alırdınız ve ilk değerlerini atardınız. Alan boş değilse bunu
kullanıcının “Düzenle” düğmesine basmasıyla alırsınız. value hem düğmeyi etiketlendirmek için
hem de property ile gösterilen alanın değerini atamak için kullanılır.
Form onaylandığı zaman ekleme, düzenleme veya kaydetme işlemlerinden hangisini yaptığınızı
“iş” alanını kontrol ederek karar verebilirsiniz.
o
Metin Girdisi(Text Input)
JSP’ye bir metin kutusu değeri girmek için şu struts etiketini kullanabilirsiniz.
i.c
<html:text property="kullanıcıAdı"/>
dil
çekirdeğindeki property i getirerek JSP de görüntülemeyi ve onaya gönderildiğinde JSP den
alınan değerle java çekirdeğindeki property i doldurmayı sağlar.
Açılır kutular kullanıcının birden çok eleman arasından birini seçmesi için kullanılır. Struts’ta bu
select, option ve options etiketleri kullanılarak gerçekleştirilir. Kullanıcı açılır kutuda bir madde
va
seçerken, struts form çekirdeğinde seçilen değeri bir değişkenle ilşikilendirir. Bu değişkenin ilk
değeri seçim öncesi görünen değeri gösterir.
Seçimi select etiketinin value niteliğini kullanarak hard coding(programda verinin kodun içinde
olduğu dolayısıyla değiştirilmesinin zor olduğu şekli) de mümkündür. Bu sadece seçim öncesi
bir değeri istediğimiz zaman yararlıdır. Örneğin ülke adlarının alfabetik sıralandığı bir listede her
ja
zaman “Türkiye” nin görünmesi gibi. Bunu yapmanın anlamı kullanıcı bu ekrana geldiğinde
“Türkiye” nin öncelikli değer olması ve kullanıcı seçiminin bir işe yaramamasıdır. Bu kötü bir
fikirdir.
Dizi listesinin adı “isimListesi” olsun. Bu liste istem veya oturumdan birinin içine koyulacak.
Kullanıcının seçimiyle atamak için kullanılan form çekirdeğindeki alanın adı “seçilenDeğer”.
Formda bu değer seçim öncesi değer olarak atanır.
<html:select property="seçilenDeğer">
o
Select şu sekilde değiştirilir:
i.c
</html:select>
-
-
görüntülenenDeğer
kimlikDeğeri
dil
Dizi listesinin adı “çekirdekListesi” olsun. Bu liste istem veya oturum dan birinin içine koyulur.
Kullanıcının seçiminin atanacağı form çekirdeğindeki alanın adı “seçilenDeğer” dir. Bu seçilen
çekirdeğin “kimlikDeğeri” ne atanacaktır. Bu değer aynı zamanda formdaki seçim öncesi değere
va
atanır. Kullanıcı “görüntülenenDeğer” in içeriğini listedeki bir eleman olarak görecektir.
<html:select property="seçilenDeğer">
<html:options collection="isimListesi" property="idValue"
labelProperty="görüntülenenDeğer"/>
</html:select>
ja
İlişkilendirilmiş Dizgiler
Kullanıcının seçimi olan seçilen değer form çekirdeğindeki alanın adına atanır. Bu değer formda
seçim öncesi değere atanmalıdır.
o
İlişkilendirilmiş dizgilerle “SeçilenDeğer”in İlişkilendirilmesi
i.c
<html:select property="selectedValue" value="değer2">
<html:option value="değer1"/>
<html:option value="değer2"/>
<html:option value="değer3"/>
</html:select>
dil
Radyo düğmesi girdisi için kullanıcıya birbirini dışlayan birkaç seçenek sunulur ve sadece bir
tanesini seçmesine izin verilir. Bir örnek:
va
<html:radio property="seçim” value=”ssk” />
<html:radio property="seçim” value=”emeklisandığı” />
<html:radio property="seçim” value=”bağkur” />
Hepsi aynı radyo düğmesi grubunda olduğu için property nitelik değerleri aynı, bu yüzden
karşılıklı dışlama sözkonusu. Seçim öncesi değere value nitelik değerlerinden birini eşleştirmek
için action sınıfınızdaki form çekirdeğindeki niteliğe “seçim” değerini atayın.
ja
Onay kutusu struts’ ın diğer girdi türlerinden biraz farklıdır. Formdaki türü boole(boolean)
w.
olmalıdır. Ayrıca çalışması için değerini form çekirdeğindeki reset metodunda 0 (false)
atamalısınız. Bunun sebebi html’nin sıfır değerli onay kutuları için değer göndermemesidir. Bir
örnek:
Seçim öncesi değeri belirlemek için baska bir alan kullanılmalıdır. Bu yüzden “öğeEkle” alanının
silinmesi gerekir.
Onay kutusunun bütün nitelikleri seçmelidir. value bu onay kutusunun seçilip seçilmediğini
belirler.Hiç bir şey yapılmazsa değeri “on” dur.
o
<bean:write property="isim" filter="true"/>
i.c
Form çekirdeğindeki “isim” alanının değerini yazmak içindir. filter niteliği html’de problem
yaratacakkarakterleri otomatik kodlamaya izin verir.Hiç bşr değişiklik yapılmadığı
takdirde(default) değeri 0 (false)’tır.
dil
Struts’ta iterate etiketi tablo yaratmak için kullanılır. Aşağıda basit bir örnek var.
</tr>
</logic:iterate>
bean:write etiketinin name niteliği property’i form çekirdeğinde aramak yerine iterate etiketi
w.
Iterate kullanırken bir tabloya giriş yapmaya imkan verilmesi için html etiketlerinin indisli
niteliklerini kullanmalısınız.Bunun birkaç örneği aşağıda ele alınmış. Bu niteliği ele alırken
dikkat edilmesi gereken bir nokta da verinin struts’ta sadece form çekirdeğine girilebilmesidir.
o
Bir Tabloda Onay Düğmeleri Kullanma
Bir tablonun elemanları düzenlenmek veya silinmek üzere sunulduğu zaman, tablodaki her satıra
i.c
karşılık bir ya da iki onay düğmesinin olmasını isteyebilirsiniz. Aşağıda bunun örneği var.
dil
<td> <html:submit indexed="true" property="komut"
value="Düzenle" />
</td>
<td> <html:submit indexed="true" property="komut" value="Sil" />
</td>
<td>
<bean:write name="öğrenci" property="ad" filter="true"/>
</td>
va
<td>
<bean:write name="öğrenci" property="soyad" filter="true"/>
</td>
<td>
<bean:write name="öğrenci" property="numara" filter="true"/>
</td>
<td> <bean:write name="öğrenci" property="bölümkodu”
ja
filter="true"/>
</td>
</tr>
</logic:iterate>
w.
Bu “komut” dizgi dizisinin property niteliğine düğmeye basıldığı zaman “Düzenle” atanıyordu,
örneğin komut[3]==”Düzenle”. Struts reflection kullanır, reflection da atama ve değer döndürme
metodlarına bağlı olarak türü belirler. Bu örnekte form çekirdeğinin ilgili bölümleri şu şekildedir:
o
public String getKomut()
{
return komut;
i.c
}
public int getIndis()
{
return secilenDeger;
}
Action’da hangi düğmeye basıldığını “komut” u kontrol ederek ve hangi eleman olduğunu indisi
dil
kontrol ederek görebilirsiniz. Formda oturum veya isteme geçirdiğiniz listeyi alıp getirmeniz
gerekebilir, bu durumda indisi kullanarak seçilen elemanı alabilirsiniz.
durum
muaf geçti Kaldı Form elemanı
0 * 0 Genel ders durumu
* 0 0 Akademik ders durumu
ja
select/ options etiketlerinin tersine radyo düğmesi etiketi tektir. select te struts’a sonucu nereye
koyacağınızı, options’ta ise listeyi nereden alacağınızı söylemeniz gerekir. Radyo düğmesinin
etiketini tekliğinden dolayı liste; sonuçların saklandığı yerle aynı yerden gelir(struts’ta sonuçlar
sadece form çekirdeğinde saklanır). Aşağıda bunun nasıl yapılacağının örneği var.
w.
Bu örnekte çekirdek dizi listesi veri yapısı var. Öyle ki her çekirdek kapı adı ve durum propery
sine sahip. Eğer radyo düğme etiketinde belirlenen değer ile çekirdeğin durum özelliği eşleşirse,
bu radyo düğmesi tablo görüntülenirken kontrol edilir. Kullanıcı formu onayladıktan sonra, dizi
listesi getirilip her bir çekirdeğin durum alanının o anki değeri alınır.
ww
Dikkat edilmesi gereken nokta; iterate etiketindeki id için kullandığınız değer ile form
çekirdeğindeki property değerinin örtüşmesidir. Bu sadece yerel değişken yaratmak için değil,
sonuçların nereye gideceğini de belirlemek için kullanılıyor. Bu anlatılanlar id nin her şeyin
yolunda gitmesi için gereken iki görevidir.
o
sadece “anahtar” ile eşleşen hata mesajlarının görüntülenmesini sağlar.
i.c
ActionErrors hatalar = new ActionErrors( );
errors.add(parametre1,new ActionError(parametreler));
saveErrors(istem , hatalar);
return (new ActionForward( eşlem.getInput()));
dil
Burada “istem”(request) HttpServletRequest türündedir. “eşlem” ise ActionMapping türündedir.
Hata mesajı listesi ActionErrors hatalar=new ActionErrors ile yaratılır ve tekil bir ActionError
da “ add” metodu ile hatalara eklenir. “add” metodu iki parametre alır. Bunlar html:error
etiketinde kullanılacak bir anahtar ve hata mesajını kapsülleyen(encapsulate) ActionError’ dır.
Yine iki parametre alan aşırı yüklenmiş add metodunda hatalar.add( String özellik, ActionError
hata) özellik(property) hatanın kategorisini tanımlamak için kullanılır.
va
ActionError nesnesinin yapıcı metodu(constructor) birden beşe kadar parametre alabilir.Birinci
parametre “UygulamaKaynakları.properties” kütüğüne anahtardır. Bu kütük hata mesajlarının
oluşturduğu metni içerir. Kalan parametreler seçmelidir, hata mesajlarındaki yer-tutucular(place-
holders) ‘ın yerine geçen değerlerdir. Parametreler ve mesaj dizgilerinin nasıl yaratıldığı
hakkında daha kapsamlı bilgi için “java.text.MesageFormat” kütüphane dökümanları
ja
incelenmelidir.
Jsp kütüğünde:
<html:errors/>
new ActionError(“VTHata”,
”alan bulunamadı” ,
"öğrenci listesi almaya "));
o
Derleme zamanında dizgiler hata almazlar. Derleyicinin potansiyel çalışma zamanı hatalarını
bulmasına yardımcı olmak için mümkün olduğunca sabit kullanmak bir standart haline gelmiştir.
Hata mesajları için iki yerde sabit kullanımı uygundur.
i.c
Birincisi “UygulamaKaynakları.properties” kütüğündeki mesaj anahtarlarını “Sabitler” kütüğü
içine yerleştirmektir. Hata mesaj anahtarlarının bütün referansları
“UygulamaKaynakları.properties” kütüğündeki hata mesajları ile birebir eşleşir.
İkincisi ActionError sınıfına konan tekil ActionError nesnelerini kimliklendiren anahtarlar için
action alt sınıflarında yerel sabitler yaratmaktır. html:errors etiketinin property niteliği ile eşleşen
com.öğrenci.Sabitler.java kütüğünde:
dil
anahtar yine listede dönen bir elemanla eşleşecektir.
JSP kütüğünde:
<html:errors />
ja
hatalar.add(OGRENCI_VT_HATA,
new ActionError (Constants.VT_HATA,
”öğrenci listesi almaya” ,
"alan bulunamadı"));
Hata Mesajı
ww
Sabitler kütüğünde:
UygulamaKaynakları.properties kütüğünde:
VTHata=<li>Hata: {0} çalışılırken{1}
o
JSP kütüğünde:
<%@ page
import="com.öğrenci.controller.org.ÖğrenciEkleAction" %> <html:errors
property= "<%= ÖğrenciEkleAction. OGRENCI_VT_HATA %>" />
i.c
Action sınıf kütüğünde:
public final String OGRENCI = “öğrenci”;
public final String OGRENCI_HATA =
Sabitler.VT_HATA+ "." + OGRENCI;
errors.add(PARENT_ORGS_DB_ERROR,
Hata Mesajı
dil
new ActionError (Sabitler.VT_HATA,
”öğrenci listesi almaya” ,
"alan bulunamadı"));
2. Bir hata mesajı ile bir alanı birleştirmek mümkündür. Bunu yapabilmek için her alan
kümesi kendi dene/yakala(try/catch) bloğunda kapsüllenebilir, böylece her hata mesajının
yeri belli olur. html:errors etiketi parametresiz kullanıldığı zaman hata mesajı listesinden
sonra sayfayı ortadan bölen bir çizginin görünmesine neden oluyor.
w.
Bu şu şekilde görünür:
-----------------------------------------------------------------------
o
Eğer hataların tekil alanlardan sonra görüntülenmesini istiyorsanız sayfa başlığında ve altlığında
herhangi bir atama yapılmadığından emin olmalısınız.
i.c
dil
ja va
w.
ww
o
public ActionErrors validate(ActionMapping eşlem, HttpServletRequest istem)
Bu; kullanıcının girdilerini geçerlemek için çağrılır. Java çekirdeği ayrıca aşağıda görüldüğü gibi
bir reset metodu da belirleyebilir.
i.c
public void reset(ActionMapping eşlem, HttpServletRequest istem)
2.
dil
sonra çağrılır. validate karşılık gelen action sınıfının perform metodu çağrılmadan hemen önce
çağrılır. validate metodu şu seçeneklere sahiptir:
1. Uygun geçerlemeleri yap ve hiçbir problem bulma. boş değer(null) veya sıfır
büyüklükte ActionError döndür ve denetçi servlet e uygun action sınıfının perfom
metodunu çağır.
Uygun geçerlemeleri yap ve problem bul. Bir ActionErrors kopyası döndür. Öyleki bu
va
sınıflar görüntülenecek hata mesaj anahtarları içersin. Denetçi servlet <html:errors>
etiketinin kullanacağı uygun bir istem niteliği alarak bu diziyi saklar ve bunu giriş
formuna kadar yollar (Bu form ActionMapping için girdiformu property değeri ile
kimliklendirilmiştir ve bununla ayırt edilebilmektedir) .
validate metodunun normal gerçekleştirimi boş değer döndürür ve denetçi sevlet gerekli
ja
geçerlemenin action sınıfı tarafından yapıldığını farzeder. Bu normal şartlarda olur fakat çoğu
geçerleme iş mantığına aykırı bir geçerleme işlemi gerçekleştirir ve ActionForm çekirdeği
kendisine bileşik bir işmantığı içermez.
İş mantığınız ,JSP niz ve tümleşik olan java çekirdeğine ek olarak; veri tabanına veri saklayan ve
veri getiren diğer sınıflarada sahip olmanız gerekir .
ww
o
Genel Yönleniciler(Global Forwards)
i.c
bir örnek: <forward name=”AnaSayfa” path=”/AnaSayfa.jsp”/>
Bu name’ i kullanarak kendi jsp’nizden diğer sayfa bağlantılarına gitmenizi sağlar. Eğer dizin
yolu değişirse siz de JSP nizde herhangi bir değişiklik yapmaya gerek kalmadan sadece
struts-config.xml kütüğünde değişiklik yaparak halledebilirsiniz .Bunu yapmak için şu formu
kullanbilirsiniz:
Bir örnek:
dil
<html:link forward="genel yönlenicilerde tanımlı değer">
va
<html:link forward="KullanıcıEkle">
Kullanıcı eklemek için tıkla
</html:link>
Çekirdek Bildirimleri
ja
Bir örnek:
w.
<form-bean name=”KullanıcıEkleForm”
type=”com.öğrenci.ActionForms.KullanıcıEkleForm” />
Kullanıcının girdilerini kabul edecek her JSP sayfanız için bunlardan bir tane olmalıdır.
Bunu iki çeşidi vardır. Biri girdi kabul edecek JSP ve girdi kabul etmeyecek JSP. Girdi kabul
etmeyecek JSP ler için tümleşik bir ActionForm düşünülemez.
<action path="/bu sayfanın yolu"
type="action sınıfının yolu"
o
<action path="/KullanıcıEkle"
type=" com.ogrenci.Action.KullanıcıEkleAction "
scope="request"
i.c
input="/jsp/KullanıcıEkle.jsp">
<forward name="basarılı" path="/jsp/KullanıcıEkle.jsp"/>
</action>
dil
input niteliği JSP ye bu action için yolunu verir.
forward niteliği action sınıfında kullanılacak “name” leri veriyor. Örneğin action sınıfınızda
kullanıcının girdisine bağlı olarak farklı sayfalara gidebilirsiniz. Bunu yukarıdaki tanımlı
name’leri kullanarak yapabilirsiniz. Gitmek istediğiniz sayfa başına bir name tanımlamak
yeterlidir. Bu size hedef sayfa değiştşiğinde struts-config.xml’i düzenlemeye olanak verir. Eğer
kullanıcı girdisi yoksa kendi “başarılı” sayfamıza geri döneriz. Action sınıfınızda bu name’ e
aşağıdaki gibi ulaşırsınız:
va
return mapping.findForward("başarılı");
<action path="/KullanıcıEkle"
type="com.ogrenci.Action.KullanıcıEkleAction" scope="request"
input="/jsp/KullanıcıEkle.jsp" name=”KullanıcıEkleForm”>
<forward name="başarılı" path="/jsp/KullancıEkle.jsp"/> </action>
ww
o
Kaynakça:
http://www.athensgroup.com
i.c
Mastering Jakarta Struts, Wiley publishing
dil
ja va
w.
ww