Professional Documents
Culture Documents
Struts MGULEC WwwJavaDiliCom
Struts MGULEC WwwJavaDiliCom
o m
i.c
dil
ja va
2007, Ankara
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
1
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
HAZIRLAYANLAR
Ekip İsim - Soyisim E-Posta Tarih
o
2.Ekip Harun Reşit Zafer hrzafer@gmail.com
Sertaç Demir sertacdemir@gmail.com
1. Ekip Karahan Öztürk karahanozturk@gmail.com 21.01.2007
i.c
dil
ja va
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
2
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
İÇİNDEKİLER
o
İÇİNDEKİLER....................................................................................................................... 3
STRUTS HIZLI BAŞLANGIÇ .............................................................................................. 5
Struts Nedir? ....................................................................................................................... 5
MVC (Model-View-Controller) Mimarisi ......................................................................... 5
i.c
Model: ............................................................................................................................ 5
Görünüm: ....................................................................................................................... 5
Denetçi: .......................................................................................................................... 5
Geliştirme Ortamını Kurma ............................................................................................... 6
JDK’yı Kurma ................................................................................................................ 6
Tomcat’i Kurma ............................................................................................................. 6
dil
Strurts’ı Kurmak ............................................................................................................. 6
İlk Uygulamayı Gerçekleştirme ......................................................................................... 6
Denetçiyi Anlamak ............................................................................................................. 6
Hosgeldin.do İstemini Hosgeldin.jsp’ye Yönlendirmek ................................................ 7
Eylem Sınıfını (Action Class) Anlamak............................................................................. 8
Eylem Sınıfı Nedir? ........................................................................................................ 8
Eylem Sınıfı Oluşturmak ................................................................................................ 8
va
Struts-config.xml Dosyasına Eylem Eşlemesi Eklemek ................................................ 9
ActionForm Sınıfı .............................................................................................................. 9
ActionForm Nedir? ...................................................................................................... 10
Struts HTML Etiketleri .................................................................................................... 14
1. STRUTS NEDİR? ............................................................................................................ 15
1.1 Web uygulaması nedir? .............................................................................................. 15
2. MVC TASARIM ÖRÜNTÜSÜ ....................................................................................... 17
ja
m
7.4. Bir Tabloda Onay Düğmeleri Kullanma ................................................................... 37
7.5. Radyo Düğmeleri Tablosu Yaratma .......................................................................... 38
8. AYKIRI DURUMLARIN ELE ALINMASI ................................................................... 39
8.1. Zincirlenmiş(Chained) aykırı durumların Kullanılması ............................................ 39
8.2. Haber veren(declarative) veya programsal(programmatic) aykırı durumlar ............ 40
o
8.3. Programsal Aykırı Durumlar ..................................................................................... 47
KAYNAKLAR..................................................................................................................... 48
i.c
dil
ja va
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
4
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
STRUTS HIZLI BAŞLANGIÇ
m
Struts Nedir?
Struts çatısı, JSP için MVC (Model-View-Controller) tasarım örüntüsünün gerçekleştirimidir.
Struts, Apache Jakarta projesininbir parçasıdır ve açık kaynaktır. Struts, her hangi boyuttaki
uygulamalar için uygundur. Son sürümü http://jakarta.apache.org/ adresinden indirilebilir.
o
MVC (Model-View-Controller) Mimarisi
i.c
MVC mimarisi; uygulamayı model, görünüm (view) ve denetçi (controller) bileşenlerine
bölmektir. Bu bileşenlerin mimari içinde biricik sorumlulukları vardır ve diğer bileşenlerden
bağımsızdırlar. Bir bileşendeki değişiklik diğer bileşenleri etkilemez.
Model: Veri kaynağından veri sağlama ve verileri saklamakla sorumludur. Tüm iş mantığı
modelde gerçekleştirilir. Veri erişimi, veri doğrulama ve veri saklama model tarafından
gerçekleştirilir.
dil
Görünüm: Kullanıcıya, uygulamanın görüntülenecek kısmını gösterir; kullanıcıdan girdi
alır, istemleri denetçiye gönderir ve denetçiden gelen yanıtları sunar. Html, jsp, etiket
kitaplıkları ve kaynak kütükleri (resources files) bu bileşenin parçalarındandır.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
5
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
Geliştirme Ortamını Kurma
o
JDK’yı Kurma
JDK 1.5’i ya da daha üst sürümü http://java.sun.com adresinden indirin ve el kitabındaki
talimatlara göre kurun.
i.c
Tomcat’i Kurma
Apache’nin sitesinden Tomcat’i indirip kurun. Kurulumunuzu sınamak için kurduğunuz
yerdeki /bin dizinindeki sunucuyu çalıştırın ve ağ tarayıcınızda http://localhost:8080/ yazın.
Bir hoş geldiniz sayfasıyla karşılaşmıyorsanız, kurulum için belgelerden yararlanın.
Strurts’ı Kurmak
dil
http://jakarta.apache.org/struts sitesinden son sürüm Struts’ı indirin. Arşivi açtığınızda war
dosyalarıyla karşılaşacaksınız (struts-blank.war, struts-documentation.war, struts-
example.war…).
va
İlk Uygulamayı Gerçekleştirme
struts-blank.war dosyasını yeniden adlandırarakornek-proje.war yapın ve Tomcat’in wabapps
dizini altına yerleştirin. Tomcat, otomatik olarak bu arşivi çıkarıp yükleyecektir.
Denetçiyi Anlamak
ja
<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>
ww
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
</servlet> fatihg@cs.hacettepe.edu.tr
6
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
Bu servlet, struts için tüm istemlerden sorumludur. Kullanıcı web.xml dosyasında <servlet-
mapping> etiketiyle ActionServlet’e belirli bir istem örüntüsü eşleyebilir. Varsayılan olarak
*.do’dur. Aşağıda bu eşleme (mapping) gösterilmektedir.
o
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
i.c
<url-pattern>*.do</url-pattern>
</servlet-mapping
dil
mapping definitions) herhangi bir eylemi eşlemek için kullanılır. Bir Hosgeldin.jsp sayfası
oluşturup istemi “Hosgeldin.do”ya yönlendirelim.
Hosgeldin.jsp
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
va
<html:html locale="true">
<head>
<title><bean:message key="welcome.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
ja
<h3><bean:message key="welcome.heading"/></h3>
<p><bean:message key="welcome.message"/></p>
</body>
</html:html>
w.
m
Anasayfadan (index.jsp) “Buraya Tıkla” bağlantısına tıklanınca istem, denetçiye gider;
denetçi Hosgeldin.jsp’ye yönlendiri ve sayfa görüntülenir.
o
Eylem Sınıfını (Action Class) Anlamak
i.c
Eylem Sınıfı Nedir?
Eylem sınıfı, struts’ın “org.apache.struts.action.Action” sınıfından türeyen bit uygulamadır.
Eylem sınıfı, iş manıtğı etrafında sarmalayıcı gibi davranır ve model katmanına arayüz sağlar.
Görünüm ve model katmanları arasında tutkal görevi görür. Görünüm katmanından verileri
alıp işlemlere yönlendirir ve işlemlerden dönen verileri tekrar görünüm katmanına
yönlendirir.
Bir eylem (action), gelen http isteminin içeriğiyle o istemle ilgili iş mantığı arasında
dil
bağdaştırıcı (adapter) olarak çalışır. Daha sonra struts denetçisi (ActionServlet) uygun bir
eylem seçer, gerekliyse bir olgu (instance) oluşturur be execute() yordamını çalıştırır.
Eylemi kullanmak için, execute() yordamının üstüne yazacak (overwrite) bir alt sınıfa
(subclass) gereksinim duyacağız. Eylem sınıfına iş mantığını eklemeyin. Bunun yerine veri
tabanını ve iş mantığını işlem ya da veri erişim nesneleri (data Access objects) katmanına
yerleştirin.
va
ActionServlet; parametrelendirilmiş sınıfı, execute() yordamını kullanarak Action Form’a
uzatır. Execute() yordamı ActionForward türü bir nesne döndürür. ActionForwad nesnesinin
değerine göre, struts çatısı istemi yönlendirir.
YonlendirEylemi.java
w.
package anapaket;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
ww
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
m
Eylem sınıfının imzası aşağıdaki gibidir.
public ActionForward execute(ActionMapping mapping,
o
ActionForm form,
javax.servlet.http.HttpServletRequest request,
i.c
javax.servlet.http.HttpServletResponse response)
throws java.lang.Exception
Eylem sınıfı, http istemini işler ve uygun http yanıtını oluşturur (ya da oluşturacak sınıfa
yönlendirir). Yönlendirmek için ActionForward nesnesi döndürür ya da yanıt tamamlanmışsa
null döndürür.
Struts-config.xml:
<action
w.
path="/YonlendirEylemi"
type="anapaket.YonlendirEylemi">
<forward name="tamam" path="/jsp/Yonlendir.jsp"/>
</action>
ActionForm Sınıfı
Bu konuyu açıklamak için verilecek örnekte kullanıcıdan adres bilgileri alınacak,
doğrulanması halinde model katmanına (eylem sınıfı) gönderilecektir. Eylem sınfından da
basarili.jsp sayfasına yönlendirilecektir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
9
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
ActionForm Nedir?
m
ActionForm, org.apache.struts.action.ActionForm sınıfından türeyen java çekirdeğidir
(JavaBean). ActionForm, kullanıcı tarafından verilen girdilerle sunucu kısmında otomatik
olarak oluşturulur.
AdresForm.java
o
i.c
dil
ja va
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
10
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
package form;
m
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.*;
o
{
private String ad=null;
private String adres=null;
private String e_iletiAdresi=null;
i.c
public void setAd(String ad){
this.ad=ad;
}
dil
public void setAdres(String adres){
this.adres=adres;
}
errors.add("adres",new ActionMessage("error.adres.required"));
}
if( getEmailAddress() == null || getEmailAddress().length() < 1 ) {
errors.add("e_iletiAdresi",new ActionMessage("error.e_iletiAd.required"));
}
return errors;
}
}
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
11
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
validate() yordamıyla verilerin geçerliliği sınanor. Hata oluşması durumunda ActionMapping
nesnesine hata iletileri eklenir.
Şimdi de gerekli eylem sınıfını oluşturup, istemi basarili.jsp sayfasına yönlendirelim.
AdresEylemi.java
o
package anapaket;
import javax.servlet.http.HttpServletRequest;
i.c
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
}
public ActionForward execute(
}
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
dil
HttpServletResponse response) throws Exception{
return mapping.findForward("basarili");
va
Struts-congig.xml dosyasında form çekirdeğini tanımlayalım.:
<form-bean
name="AdresForm"
type="form.AdresForm"/>
ja
<action
path="/Adres"
w.
type="anapaket.AdresEylemi"
name="AdresForm"
scope="request"
validate="true"
input="/jsp/Addres.jsp">
<forward name="basarili" path="/jsp/basarili.jsp"/>
ww
</action>
Adres.jsp
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
12
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<html:html locale="true">
<head>
<title><bean:message key="welcome.title"/></title>
o
<html:base/>
</head>
<body bgcolor="white">
i.c
<html:form action="/Adres">
<html:errors/>
<table>
<tr>
<td align="center" colspan="2">
<font size="4">Alanları Doldurunuz</font>
</tr>
<tr>
<td align="right">
Name
</td>
<td align="left">
dil
<html:text property="ad" size="30" maxlength="30"/>
</td>
va
</tr>
<tr>
<td align="right">
Address
</td>
<td align="left">
<html:text property="adres" size="30" maxlength="30"/>
ja
</td>
</tr>
<tr>
<td align="right">
E-mail address
w.
</td>
<td align="left">
<html:text property="e_iletiAdresi" size="30"
maxlength="30"/>
</td>
</tr>
<tr>
ww
<td align="right">
<html:submit>Kaydet</html:submit>
</td>
<td align="left">
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
13
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
Kullanıcı alanları doldurup, “Kaydet” düğmesine basar. Form doğrulaması sunucu tarafında
yapılır. Hatalar <html:errors/> etiketiyle jsp sayfasında görüntülenir. Metin alanı oluştyrmak
m
için <html:text/> etiketi kullanılır.
<html:text property="adres" size="30" maxlength="30"/>
Böylece metin alanından veriler alınır ve ilgili form çekirdeğinde saklanır.
Anasayfaya aşağıdaki bağlantıyı ekleyerek Adres.jsp sayfamızı sınayabiliriz.
<html:link page="/jsp/Adres.jsp"> Addres Formuna Git</html:link>
o
Struts HTML Etiketleri
i.c
Struts, kullanıcı arayüzü için bir etiket kütüphanesi sağlar. Bu kütüphaneden yararlanmak için
jsp sayfasının başına
<%@ taglib uri="/tags/struts-html" prefix="html" %>
eklenmelidir.
dil
<html:message key="anahtar"/> İleti kaynağında, anahtara karşı gele iletiye bakar.
<html:password property="şifre" Form çekirdeğinde “şifre” isimli alanda saklanmak
size="10"/> üzere bir şifre alanı oluşturur.
<html:text property="metin" Form çekirdeğinde “metin” isimli alanda saklanmak
size="5"/> üzere bir metin alanı oluşturur.
<html:submit>Gönder</html:submit> “Gönder” isimli bir düğme oluşturur (submit button).
<html:reset>Reset</html:reset> Bir “Reset” düğmesi oluşturur.
va
<html:errors/> Sayfadaki hataları yazdırır.
<html:file property="Dosya seç"/> Formda dosya yükleme öğesi oluşturur. Bu öğe
org.apache.struts.upload.FormFile’dan türemelidir.
<html:checkbox Bir denetim kutusu oluşturur.
property="CheckBox"/>
<html:hidden Formda gizli bir öğe oluşturur.
ja
property="gizliDeger"/>
<html:radio value="abc" Radyo düğmesi oluşturur.
property="radyo"/>
<html:select multiple="true" Formda liste kutusu oluşturur. “seç” desteklenen veri
property="seç"> türleri dizisi olmalı, kullanıcı bir çok varlık
w.
method="post">
<html:base/> Taban etiketi oluşturur.. <BASE ...> tarayıcıya, nu
sayfanın bulunduğu yeri temel almasını sağlar. Diğer
referanslar bu tabana göre hesaplanır.
<html:html> HTML <html> öğesi oluşturur.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
14
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
1. STRUTS NEDİR?
m
Struts projesi 2000 Craig McClanahan tarafından MVC tabanlı Java Web
uygulamaları geliştirmede bir standart belirlemek amacıyla tasarlandı. Struts 1.0 2001
in ortasında yayınlandı ve şu anda Apache Kuruluşu’nun Jakarta Projesinin bir
parçasıdır. Struts çok çeşitli projelerde geniş bir yelpazede, farklı endüstri dallar için
kullanılmaktadır.
o
1.1 Web uygulaması nedir?
Web uygulaması özünde, web sunucu tarafında çalışan, kullanıcının isteğine
i.c
göre statik ve dinamik sayfalar üreten bir programdır. Kullanıcı istemleri genelde
sayfa üzerine fare ile tıklanarak gelir.
Web mimarisi aşağıdaki şekilde görülmektedir:
dil
va
Web container web uygulamasının elemanlarını yönetmeye yarayan araçtır.
ja
Web container; güvenlik, aynı anda kullanım ve yaşam döngüsü özelliklerini sağlar.
Apache tomcat iyi ve ücretsi bir web containerdır.
Java servlets: java ile yazılmış web sunucu tarafında çalışan ve kullanıcının
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
15
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
bizim için önem kazanıyor. Framework bir çeşit yazılım problemini çözmek için
toparlanmış (organize edilmiş) sınıflar ve arayüzler bütünüdür. Framework bir
sorunun çözümü için gerekli parçaları ve bu parçaların bir arada nasıl kullanılacağını
içerir. Fraemework’ün parçaları yeniden kullanılabilirdir.
Framework ve kütüphane aynı şey değillerdir. Kütüphane; uygulamanın
o
gereksinim duyduğu fonksiyonları ve usulleri içerirken, framework; uygulamanın
eriştiği genel ve yardımcı parçaları sağlar.
i.c
içinde yer alırlar. Struts’ın bu 8 paketi ve birbiri ile ilişkilerinin açıklamaları şu
şekildedir.
config
taglib
tiles
upload
sınıflarını içerir.
iskeletidir. Struts da J2EE web parçalarının birbiri ile belirli etkileşimlerini içeren bir
uygulama framework’üdür. Struts bu birleşmeyi MVC tasarım örüntüsü kullanarak
yapar. Bu birleşimin ne kadar önemli olduğunu anlamak için MVC’nin ne olduğu
anlaşılmalıdır.
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
16
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
2. MVC TASARIM ÖRÜNTÜSÜ
o
i.c
dil
Model-View-Controller tasarım örüntüsü nesneye yönelik tasarım örüntülerinin
atasıdır. İlk olaral Smalltalk-80 da kullanıcı arayüzü olarak kullanmıştır. Şu an hertürlü
va
kulanıcı arayüzü gerektiren sistemde kullanılabiliyor.
Controller bütün kullanıcı istemlerini ele alır ve geri dönüşte hangi view’a
gidileceğine karar verir. Controller bir istem aldığında, bu istemi uygun “handler” a
gönderir. Handler hangi action’un bu istem için uygul olduğuna karar verir. Controller
modelde bu action için gerekli olan fonksiyonu çağırır. Model gerekli işlemi yaptıktan
sonra controller hangi view’e dönüleceğini belirler.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
17
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
MVC örüntüsünün çalışma mantığı aşağıdaki şakilde görülebilir.
o
i.c
dil
va
MVC örüntüsünün katmanları biribirinden bağımsız olduğu için, katman
kullanıcısına büyük bir esnekli sağlar. Programcı ve tasarımcılar, bu ayrık yapı
ja
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
18
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
2.1. Struts ve MVC
m
Struts incelendiğinde MVC örüntüsünü bütünü ile içerdiği anlaşılır. Bu yüzden
MVC’nin bileşenlerinin struts içerisinde nasıl ele alındığı incelenecektir. Struts’ın MVC
le oluşturulması aşağdaki çizimde gösterilmiştir.
o
i.c
dil
ja va
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
19
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
o m
i.c
2.1.2. Struts View
Struts özel bir sunuş teknolojisi içermez. Birçok struts JSP’yi kullanır ki bu
dil
JSP’ler Struts tag library(Struts and Struts-EL), JSTL (java standart tag library) ve
JSF (Java server faces) tabanlıdırlar
Controller ve Model sınıfları arasındaki tüm etkileşim action sınıfı ile olur
ja
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
20
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
Struts MVC örüntüsü ile yapılmış login işlemi bir çizim ile aşağıda örneklenmiştir.
o
i.c
dil
ja va
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
21
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
3. STRUTS KURULUMU
Struts’ın kurulumu için java development kit(jdk), modern bir web container
m
(örneğin tomcat 5.0) ve ve basit bir yazı editörü yeterlidir. Eğer java ve web container
sisteminize kurulu değilse işte yapmanız gerekenler:
o
Tomcat’in çalıştığından emin olun
i.c
¾ http://jakarta.apache.org/tomcat
dil
3.1. Java Development Kit Kurulumu
Sun’dan indirilen Java Development Kit’in Windows için olan sürümü artık
Windows kurulumuna hazırdır. Windows kurulum sihirbazı size kurulumun bütün
adımlarında yardımcı olacaktır.
1. Küçük bir pencere, sizden jdk nın nereye kurulduğunu (adresini) öğrenmek
için, çıkacaktır.
2. “OK” u tıklayın, anlaşma şartlarını göreceksiniz. “Next” tıklamadan önce
anlaşma şartlarını okuyunuz.
3. Bir sonraki ekran size kurulum seçeneklerini gösterir. Normal (defoult)
w.
yapmamanız önerilir.
5. “Install” a tıklayın ve kurulum başlar, uygulama çubuğu(progress bar) size
kurulumun hangi aşamada olduğunu gösterir.
6. Kurulum tamamlandığında “close” düğmesine tıklayınız.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
22
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
menüsüne atar yerleştirir, buradan “tomcat başla” yı seçerek tomcati başlatabilirsiniz.
Aynı yerden “tomcat dur” diyerek tomcati durdurursunuz.
m
Tomcat’i test etmek için web sağlayıcısını (browser) http://localhost:8080
adresine yönlendirin eğer giriş sayfası açılırsa doğru çalışıyor anlamındadır.
o
En son Struts sürümünü bu adresten elde edebilirsiniz.
http://archive.apache.org/dist/struts/struts-1.1/. İndirdikten sonra sıkıştırılmış
dosyaları açmalısınız. Dağıtım bir Struts uygulaması geliştirebilmek için gerekli olan
tüm kütüphaneleri içermektedir. Dağıtımda ayn zamanda Webapps dizininin
i.c
içerisinde boş bir Struts uygulamas (strutsblank.war) bulunmaktadır. Bu kendi web
uygulamalarımızı geliitirmek için bize bir çatı sağlamak adına oldukça kullanışlıdr.
Kendi kodunuzu WEB-INF/classes dizinine, kendi ayarlarınız WEB-INF/struts-
config.xml dosyasına koyabilirsiniz. Böylelikle tamamen fonksiyonel bir Struts
uygulamasına sahip olmuş olursunuz.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
23
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
4.1. Eclipse’de Struts Projesi
Eclipse’de bir struts projesi oluşturmak için indirmiş olduğunuz struts dosyaları
m
kullanılır. Struts özellikli bir proje oluşturmak için struts için indirilen dosyaların
içindeki weapps klasörünün içindeki struts_blank.war import edilmelidir, bu şekilde
struts özellikleri kazanmış bir proje elde edilir. Bu işlemi yapmak için “file” tıklanıp
import seçilir. Import için select penceresi açılır bu pencerede “War File” seçilir ve
“next” tıklanır.
o
i.c
dil
ja va
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
24
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
Ardından açılan pencerede struts-blank.war dosyasının bulunduğu yer
“browse” dan seçilip “finish” tıklanır.
o m
i.c
dil
ja va
w.
Oluşan struts-blank projesi bir struts projesidir. Burada srs klasörü altında java
kodları, WebInf altında web dosyaları (.html, .jsp… Uzantılı dosyalar) bulunur.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
25
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
o m
i.c
dil
va
4.2. Örnek Uygulama
Örnek olarak yapacağımız uygulama giriş sayfası ile açılıyor. Bu sayfada
kulanıcının dının alındığı bir yazı girdi alanı ve kullanıcının şifresinin iki kere
girmesinin sağlandiği iki tane parola giriş alanı bulunmaktadır. Bu alanların altında ise
“giriş” düğmesi yer almaktadır.
ja
w.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
26
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="form" %>
<form:form action="register.do">
m
Kullanici Adi:<form:text property="username"/><br>
Parola Giriniz:<form:password property="password1"/><br>
Parolayi Tekrarlayiniz:<form:password
property="password2"/><br>
o
<form:submit value="Giris"/>
</form:form>
i.c
Kullanıcının girdiği iki parola aynı ise basari.html’e yönlenilenecektir. Başarılı
olma görünümü ve ilgili kod aşağıda verilmiştir.
Basari.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
dil
va
Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>BASARİ</title>
</head>
ja
<body>
<b>Giris Basarili!!!!
<P><A href="baslangic.jsp">yeniden dene?</A></P>
</body>
</html>
w.
ww
o m
Hata.html:
i.c
<HTML>
<HEAD>
<TITLE>HATA!</TITLE>
</HEAD>
<BODY>
<b>Giris Basarisiz!
</HTML>
dil
<P><A href="baslangic.jsp">yeniden dene?</A></P>
</BODY>
RegisterForm.java
package app;
import org.apache.struts.action.*;
ja
username;};
public void setPassword1(String password) {this.password1 =
password;};
public void setPassword2(String password) {this.password2 =
password;};
}
(Projedeki java dosyaları app paketinin içindedir)
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
28
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
Bu formdaki bilgiler üzerinde bu formla ilişkili action sınıfı iş yapar. Action sınıfı
bu formu kullanıp gerekli işlemleri yapan sınıftır. Bu proramda parolaları karşılaştırıp
m
hata ya da basarı durumuna yönlenmeyi sağlar. Programın ilgili action sınıfı ise:
RegisterAction.java
package app;
import org.apache.struts.action.*;
o
import javax.servlet.http.*;
import java.io.*;
i.c
ActionForm form,
HttpServletRequest req,
HttpServletResponse res) {
dil
String password1 = rf.getPassword1();
String password2 = rf.getPassword2();
return mapping.findForward("failure");
}
}
w.
Bu sınıf ile ilgili işlamler yapılır ve basarı ve hata durumuna sapılır. Ama hata
ve basarı durumlarıyla ilişkili html veye jsp sayfalarının belirlenmesi gerekir. Program
için bu adreslemeler struts-config. xml dosyasında eşleştirilmiştir. Programın struts-
config.xml dosyası verilmeden önce bu dosya hakkında bazı bilgile açıklanacaktır.
m
</html:link>
Bir örnek:
<html:link forward="Kullanıcı Ekle">
Kullanıcı eklemek için tıkla
</html:link>
o
Çekirdek Bildirimleri
<form-bean name="Form Adı" type="Çekirdeğin dizin yolu"/>
Bir örnek:
i.c
<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 olmaıdır.
</action>
path niteliği bu sayfanın yolunu veriyor. type niteliği bu action için action
sınıfına yolunu verir. 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
w.
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ştiğ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:
return mapping.findForward("başarılı");
ww
m
Bunun bir örneği:
<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>
o
Daha önce form çekirdeklerinde belirtilmesi gereken KullanıcıEkleFormu’nu
name niteliği belirler. Struts ta uygulamanızın her parçası için bir ActionForm
çekirdeği kullanmanız tavsiye edilir.
i.c
Bu bilgilerin işiğinde oluşturulan struts-config.xml dosyamız:
<?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">
dil
<struts-config>
<data-sources/>
<form-beans>
<form-bean name="registerForm" type="app.RegisterForm"/>
</form-beans>
<global-exceptions/>
<global-forwards/>
<action-mappings>
va
<action name="registerForm" path="/register"
type="app.RegisterAction">
<forward name="success" path="/basari.html"/>
<forward name="failure" path="/hata.html"/>
</action>
</action-mappings>
<controller/>
ja
</struts-config>
w.
5. ACTION
Eylem (Action), gelen HTTP isteminin içeriğiyle, buna istem için çalıştırılacak iş
mantığı arasındaki adaptör olarak düşünülebilir.
Denetçi, her istem için uygun eylem seçer; gerekiyorsa bir olgusunu yaratır ve
execute yordamını çağırır.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
31
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
* Diğer kaynaklar (Java Çekirdekleri, oturum değişkenleri vs.) için erişimler, bu
kaynaklar korunma gerektiriyorsa, eşzamanlı olarak yapılır.
m
Bir Action nesnesi ilk yaratıldığında; denetçi, setServlet yordamını eylemin (Action)
eklendiği servlet olgusunu belirlemek için null olmayan argümanlarla (bağımsız
değişkenlerle) çağırır. Servlet kapatıldığında ya da yeniden başladığında, setServlet
yordamı null bağımsız değişkeniyle çağrılır ve bu eylem tarafından yer ayrılan
o
kaynaklar temizlenmiş olur.
i.c
5.1. ACTIONFORM
dil
çekirdeğin validate yordamı çağrılarak kullanıcı tarafından geçerli veri girişi yaptığı sınanır.
Eğer bu yordam bir hata tespit ederse, bir hata iletisi nesnesi döndürülür. Aksi durumda,
validate yordamı null döndürür ve girdilerin kabul edilebilir olduğu anlaşılarak
Action.execute yordamı çağrılır.
5.2. ACTIONSERVLET
va
Ağ uygulamasına gelen her türlü istemden sorumludur. Çok işlem yapmasa da ilk işi
yaptığı için önemlidir. Bir struts uygulamasında başlatılan ilk servlettir.
Başlatıldıktan sonra istemleri ele almaya hazırdır. Her istem process yordamıyla ele
alınır.
Uygulama kapatılırken ağ kabı tarafından destroy yordamıyla sonlandırılır.
ja
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
32
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
o m
i.c
5.3. HTML FORM
dil
Neredeyese her ağ uygulaması girdi değerleri alır. Ad, soyad, şifre, adres vb bilgiler
örnek gösterilebilir. HTML, bu bileşenler için gerekli metin alanı, radyo düğmesi, onay
kutuları vb alanları tarayıcıda gösterilmesini sağlar. Bu tür sayfalarda, bu girdiler html
va
forml ögelerince yerleştirilir.
Struts HTML etiket kitaplığı, html formları oluşturacak etiketleri içerir.
<html:form action="aramaAction">
<!-- -->
<html:submit styleClass="button" value="Go"/>
ja
</html:form>
Burada action ile bu formun gönderileceği URL girilir. Eğer yol eşlemesi (path
w.
Struts ta girdiler çoğunlukla html:form etiketi bağlamı içinde ortaya çıkar. Html
etiketleri sadece htlm:form etiketi bağlamında çalışır.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
33
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
m
6.1. Metin Girdisi(Text Input)
JSP ye bir metin kutusu değeri girmek için şu struts etiketini kullanabilirsiniz.
<html:text property="kullan c Ad "/>
o
Bunu çalıştırmak için ActionForm çekirdeği kullanıcı Adı olarak adlandırılan
özel(private) ve korunmu (protected) dizgi değerleri için setKullanıcıAdı adlı
atama(setter) ve getKullanıcıAdı adlı değer döndürme(getter) metodlarını içermelidir.
Struts java çekirdeğindeki property i getirerek JSP de görüntülemeyi ve onaya
i.c
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
dil
kullanılır. Struts da bu select, option ve options etiketleri kullanılarak gerçekleştirilir.
Kullanıcı açılır kutuda bir madde seçerken, struts form çekirdeğinde seçilen değeri bir
değişkenle ilişkilendirir. 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ğitirilmesinin 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 zaman Türkiye’nin görünmesi. Bunu
va
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.
• Yukarıdakilerin birleşimi
Dizi listesinin adı isimListesi olsun. Bu liste istem veya oturumdan birinin içine
w.
<html:select property="seçilenDeğer">
<html:options name="isimListesi" />
</html:select>
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
34
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
Burada birİsim dizi listesindeki isimlerden biridir.
m
Çekirdek dizi listesi ile:
o
Dizi listesinin adı çekirdekListesi olsun. Bu liste istem veya oturumdan birinin içine
koyulur. Kullanıcının seçiminin atanacak form çekirdeğindeki alanın adı
seçilenDeğer’dir. Bu seçilen çekirdeğin kimlikDeğeri ne atanacaktır. Bu değer aynı
i.c
zamanda formdaki seçim öncesi değere 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>
İ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.
w.
<html:select property="seçilenDeğer">
<html:option value="değer1"/>
<html:option value="değer2"/>
<html:option value="değer3"/>
</html:select>
m
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:
o
<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
i.c
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.
dil
Onay kutusu strutsın diğer girdi türlerinden biraz farklıd r. Formdaki türü
boole(boolean) 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’in sıfır değerli onay kutuları için
değer göndermemesidir. Bir örnek:
m
</tr>
</logic:iterate>
o
veya uygulama(application) etki alanlarında arıyor. Type değeri formun fiziksel yolunu
verirken; name formun mantıksal ismini veriyor.
i.c
Iterate kullanırken bir tabloya giriş yapmaya imkân 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. Bu demek oluyor ki çalışacak indisli niteliği
almak için listenizi form çekirdeğinde saklamalısınız. İndisli nitelik 1.02. sürümden
sonra ortaya çıkmıştır.
<td>
<bean:write name="öğrenci" property="ad" filter="true"/> </td>
<td>
<bean:write name="öğrenci" property="soyad" filter="true"/> </td>
<td>
w.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
37
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
public void setKomut (int index, String deger)
{
m
secilenDeger = indis;
komut = deger;
}
public String getKomut (int indis)
{
o
return komut;
}
public String getKomut()
{
i.c
return komut;
}
public int getIndis()
{
return secilenDeger;
}
dil
Action’da hangi düğmeye basıldığını “komut” u kontrol ederek ve hangi
eleman olduğunu indisi kontrol ederek görebilirsiniz. Formda oturum veya isteme
geçirdiğiniz listeyi alıp getirmeniz gerekebilir, bu durumda indisi kullanarak seçilen
elemanı alabilirsiniz.
va
7.5. Radyo Düğmeleri Tablosu Yaratma
ja
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.
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
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
38
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
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.
m
8. AYKIRI DURUMLARIN ELE ALINMASI
Aykırı durum fırlatma java’nın programın normal işleyişi içinde normal olmayan
bir durumu belirtme yöntemidir. Bu şekilde kullanıcı hatanın türü ve oluşma anı
o
hakkında bilgi edinebilir. Strutsda da aykırı durumların ele alınışı javadan farklı
değildir. Değişen şey aykırı durumların ele alınışı ve kullanıcıya geri dönümüdür.
Strutsda aykırı durumları ele alırken genelde iki yaklaşım vardır. Eğer aykırı
durum uygulama hatası ise; bu hata muhyemelen son kullanıcı tarafından çözülebilir.
i.c
Bu durumda genelde giriş sayfasına dönülür, kullanıcıya bu durumla ilgili bilgi verilir
ve bu durumun çözülmesi için yapılabilecek değişiklikler kullanıcıya sunulur.
Eğer aykırı durum sistem tarafından oluşmuşsa(low-level exception);
yapılabilecek en anlamlı iş sistem hata sayfasının göüntülenmesidir. Kullanıcının bu
sorunu çözme hususunda yapabileceği herhangi bir şey bulunmamaktadır. Bu hata
programlama hatası veya ağdaki bir sorun olablir ama buradaki önemli nokta siz bu
dil
hatanın ayrıntısını(stack trace) kullanıcıya göstermezsiniz, sadece sistem hata
sayfasını görüntülersiniz. Sistem hata sayfasının daha kullanıcı dostudur ve sistem
yöneticisi ile bağlantı kurulmasını sağlayabilir.
sorun çok farklı olabilir örneğin dosya sistemi dolu olabilir veya veri tabanı zaten bu
dosyayı içeriyor olabilir. Gerçekte oluşan eykırı durum IOException veya
SQLException’dur. Ama kullanıcının bu ayrıntıyı bilmeye veya çöcümlemesine gerek
yoktur. Bilmesi gereken şey yüklemenin yapılamamış olmasıdır. Bu sebeple
problemin asıl sebebini göndermessiniz, bunun yerine başka bir aykırı durum
w.
fırlatırsınız.
Zincirli aykırı durumlaru destekleyen aykırı durum sınıfı aşağıda verilmiştir:
import java.io.PrintStream;
import java.io.PrintWriter;
/**
* This is the common superclass for all application
ww
exceptions. This
* class and its subclasses support the chained exception
facility that allows
* a root cause Throwable to be wrapped by this class or one
of its
* descendants.
*/
public class BaseException extends Exception {
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
39
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
protected Throwable rootCause = null;
m
protected BaseException( Throwable rootCause ) {
this.rootCause = rootCause;
}
o
rootCause = anException;
}
i.c
return rootCause;
}
}
dil
public void printStackTrace(PrintStream outStream) {
printStackTrace(new PrintWriter(outStream));
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
40
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
Aşağıda haber veren aykırı durumları kullanan bir struts configuration dosyası
yer almaktadır:
m
<?xml version="1.0" encoding="UTF-8" ?>
o
"http://jakarta.apache.org/struts/dtds/struts-
config_1_1.dtd">
<struts-config>
i.c
<action-mappings>
<action
path="/login"
type="com.oreilly.struts.storefront.security.LoginAction"
name="loginForm"
scope="request"
input="/login.jsp">
<exception
key="security.error.changepassword"
path="/changePassword.jsp"
dil
<!--The following exceptions can be thrown during the
login action -->
type="com.oreilly.struts.framework.exceptions.ExpiredPasswordE
va
xception"/>
<exception
key=" security.error.loginfailed"
type="com.oreilly.struts.framework.exceptions.InvalidLoginExce
ption"
path="/login.jsp"/>
ja
<exception
key="security.error.accountlocked"
type="com.oreilly.struts.framework.exceptions.AccountLockedExc
eption"
w.
path="/accountLocked.jsp"/>
</action>
</action-mappings>
</struts-config>
ww
m
HttpServletResponse response,
Exception exception,
ActionForm form,
ActionMapping mapping)
throws IOException, ServletException {
o
// Is there a defined handler for this exception?
ExceptionConfig config =
mapping.findException(exception.getClass( ));
i.c
if (config == null){
if (log.isDebugEnabled( )){
log.debug(getInternal().getMessage("unhandledException",except
ion.getClass( )));
}
if (exception instanceof IOException){
}
throw (IOException) exception;
m
uygun alanda saklar ve kontrolü path niteliğinde tanımlanan kaynağa verir
Exception nesnesi, aykırı durum değişriğinde, aykırı durumun ele elınışını
yeniden düzenlemenize izin verir. Bunu org.apache.struts.action.ExceptionHandler
sınıfını genişleten(extends) bir java sınıfının handler özelliğinden yapabilirsiniz. Bu
sınıf sizin yapmak istediğiniz özelliği gerçekleştirmek için ExceptionHandler sınıfının
o
execute metodunu yeniden yazar(overwrite). Örneğin uygulamanız aşağıdaki
sınıfı(BaseException) genişletsin(extends).
package com.oreilly.struts.framework.exceptions;
i.c
import java.util.List;
import java.util.ArrayList;
import java.io.PrintStream;
import java.io.PrintWriter;
/**
* This is the common superclass for all application
exceptions. This
of its dil
* class and its subclasses support the chained exception
public BaseException( ){
super( );
}
w.
m
public String getMessageKey( ){
return messageKey;
}
o
this.messageArgs = args;
}
i.c
return messageArgs;
}
}
return rootCause;
}
printStackTrace(System.err);
dil ) {
va
public void printStackTrace(PrintStream outStream) {
printStackTrace(new PrintWriter(outStream));
}
if ( getRootCause( ) != null ) {
getRootCause( ).printStackTrace(writer);
}
writer.flush( );
w.
}
}
bunu struts kaynaklarındaki bir mesej ile ilişkilendirir. Bu sınıf aynı zamanda aykırı
durum yaratıcısının günleyebileceği bir nesne dizisi içerir. Bu nesneler
MessageFormat sınıfı temelli parametrelerin tutulmasında görevlidir. Bu mesaj şu
şekilde olabilir.
global.error.invalid.price=The price must be between {0} and {1}.
ActionError nesnesi oluşturulduğunda ikinci parametre olarak nesneler dizisini
geçebilirsiniz. Dizideki sıfırıncı eleman sıfırıncı pozisyona yerleştirilir, bir indisli
eleman birinci pozisyona diye devam eder.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
44
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
Aşağıdaki örnek default aykırı durum ele alıcısının nasıl genişletileceğini(extent) ve
ActionError sınıfının yapılandırıcısındaki aykırı durumdaki argümanları
m
vekillendirerek(substituning) nasıl özel özellik kazandırılıcağını ele almaktadır.
package com.oreilly.struts.chapter10examples;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
o
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionError;
i.c
import org.apache.struts.util.AppException;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.config.ExceptionConfig;
import com.oreilly.struts.framework.exceptions.BaseException;
dil
public class SpecialExceptionHandler extends ExceptionHandler
{
m
String messageKey = baseException.getMessageKey( );
Object[] exArgs = baseException.getMessageArgs( );
if ( exArgs != null && exArgs.length > 0 ){
// If there were args provided, use them in the
ActionError
o
error = new ActionError( messageKey, exArgs );
}else{
// Create an ActionError without any arguments
error = new ActionError( messageKey );
i.c
}
}else{
error = new ActionError(config.getKey( ));
property = error.getKey( );
}
class
}
dil
// The storeException method is defined in the parent
return forward;
va
}
Handler’ın içinde işlenen özel özellik size kalmıştır. Örnekte gösterilen kod,
ActionError’a arguman ekleyerek hata mesajlarının daha bilgilendirici olmasını
sağlamıştır.
Struts çatısı tarafından sunuan default aykırı durum ele alıcı(handler) çoklu
ja
aykırı durumları desteklemez. Eğer böyle bir davranışa ihtiyaç duyarsanız kendi
ExceptionHandler sınıfınızı yazmalısınız. Aşağıdaki figür strutsın default aykırı durum
ele alma mekanizmasını göstermektedir.
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
46
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
o m
i.c
dil
Struts’ın haber veren aykırı durum ele alma yöntemini kullanmak, programsalı
kullanmanızı engellemek, birarada gayet iyi çalışırlar. Ama bu kesimde programsal
aykırı durumlara yer verilmeyecektir.
try{
}catch( BaseException ex ){
// Log the exception
ex.getArgs( ) );
errors.add( ActionErrors.GLOBAL_ERROR, newError );
saveErrors( request, errors );
}catch( Throwable ex ){
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
47
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
// Log the exception
m
// Create and store the action error
ActionError newError = new ActionError(
"error.systemfailure" );
ActionErrors errors = new ActionErrors( );
errors.add( ActionErrors.GLOBAL_ERROR, newError );
o
saveErrors( request, errors );
i.c
);
}
dil
Eğer abstract bir sınıfa programsal aykırı durumları ele alma özelliği eklenirse, action
sınıfının tamamına gerek kalmaz. Bunu gerçekleştirmek için executeAction metodunu
tanımlamanız(implement) gerekir. executeAction metodu storefrontBaseAction sınıfı
tarafında tanımlıdır ve templete tasarım örüntüsünün bir gerçekleştirimidir
va
KAYNAKLAR
• www.oracle.com
• www.athensgroup.com
• www.sitepoint.com
• www.jakarta.apache.org/struts
• http://www.roseindia.net
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
48