Download as pdf
Download as pdf
You are on page 1of 48

HACETTEPE ÜNİVESİTESİ

BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

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

2.1. Struts ve MVC ........................................................................................................... 19


3. STRUTS KURULUMU ................................................................................................... 22
3.1. Java Development Kit Kurulumu .............................................................................. 22
3.2. Tomcat Kurulumu ..................................................................................................... 22
3.3. Struts Kurulumu ........................................................................................................ 23
w.

4. BASİT BİR STRUTS ÖRNEĞİ ....................................................................................... 23


4.1. Eclipse’de Struts Projesi............................................................................................ 24
4.2. Örnek Uygulama ....................................................................................................... 26
5. ACTION ........................................................................................................................... 31
5.1. ACTIONFORM ........................................................................................................ 32
5.2. ACTIONSERVLET .................................................................................................. 32
ww

5.3. HTML FORM ........................................................................................................... 33


6. GİRDİLERİN ELE ALINMASI ...................................................................................... 33
6.1. Metin Girdisi(Text Input) .......................................................................................... 34
6.2. Açılır Kutu Girdisi(Drop-Down Combo Box Input)................................................. 34
6.3. Radyo Düğmesi Girdisi ............................................................................................. 36
6.4. Onay Kutusu Girdisi.................................................................................................. 36
7. ÇIKTILARIN ELE ALINMASI ...................................................................................... 36
7.1. Metin Çıktısı(Text Output)........................................................................................ 36
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
3
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
7.2. Struts’ ta Tablo Yaratma ........................................................................................... 36
7.3. Iterate Etiketinin Etki alanında(scope) İndisli Nitelik Kullanma .............................. 37

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.

Denetçi: Model ve görünüm arasındaki bileşendir. Kullanıcıdan istemleri alır; modeldeki


va
uygun iş mantığını çalıştırır ve çıktıyı üretip görünüme gönderir. ActionServlet, Action,
ActionForm ve struts-config.xml denetçinin parçalarıdı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
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

Org.apache.struts.action.ActionServlet, struts çatısını kalbidir, struts çatısını denetçi


bileşenidir. ActionServlet, web.xml dosyasında Servlet olarak yapılandırılır.

<!-- Standard Action Servlet Yapılandırması -->


<servlet>
w.

<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

Yukarıdaki eşleme, *.do uzantılı istemleri ActionServlet’e yönlendirir. ActionServlet, hedef


için struts.config.xml dosyasındaki yapılandırmayı kullanır. Eylem eşleme tanımları (action

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.

Hosgeldin.do İstemini Hosgeldin.jsp’ye Yönlendirmek


Eylem eşleme tanımları, struts-config.xml dosyasının en önemli kısmıdır. Bu bölüm, “Form
Çekirdeği Tanımları” (Form Bean Definitions) kısmından tanımlı formları alır ve eylem
sınıfına yönlendirir.
ww

Aşağıda <action-mapping> etiketleri kullanılarak istem, Hosgeldin.jsp’ye yönlendirilir.


<action path="/Hosgeldin"
forward="/pages/Welcome.jsp"/>

Hosgeldin.jsp dosyasını çağırmak için aşağıdaki kod kullanılacaktır.


Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
7
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

<html:link page="/Hosgeldin.do">Buraya Tıkla</html:link>

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.

Eylem Sınıfı Oluşturmak


ja

Örnekte eylem sınıfı (YonlendirEylemi.java), sadece yönlendirme işlemi yapacaktır.


Sınıfımız, “tamam” değeri taşıyan AcitonForward nesnesi döndürecektir. Bu değer struts-
config.xml dosyasında da tanımlanacaktır.

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;

public class YonlendirEylemi extends Action


{
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception{
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
return mapping.findForward("tamam");
fatihg@cs.hacettepe.edu.tr
}
}
8
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

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.

Temel Değişkenler (Parameters):

mapping - ActionMapping olgusu


dil
form – Gerektiğinde istem için ActionForm çekirdeği (bean)
request - Gelen HTTP istemi
response – Oluşturulan http yanıtı
Aykırı Durum:
va
throws java.lang.Exception

Struts-config.xml Dosyasına Eylem Eşlemesi Eklemek


ja

Uygulamamızı sınama için anasayfaya (index.jsp) aşağıdaki bağlantıyı ekleyelim:


<html:link page="/YonlendirmeEylemi.do"> Yönlendir </html:link>

Struts-config.xml:
<action
w.

path="/YonlendirEylemi"
type="anapaket.YonlendirEylemi">
<forward name="tamam" path="/jsp/Yonlendir.jsp"/>
</action>

Anasayfadaki bağlantıya tıklanınca Yonlendir.jsp sayfası görüntülenecektir.


ww

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.*;

public class AdresForm extends ActionForm

o
{
private String ad=null;
private String adres=null;
private String e_iletiAdresi=null;

i.c
public void setAd(String ad){
this.ad=ad;
}

public String getAd(){


return this.ad;
}

dil
public void setAdres(String adres){
this.adres=adres;
}

public String getAdres(){


return this.adres;
}
va
public void setE_iletiAdresi(String e_iletiAdresi){
this.e_iletiAdresi = e_iletiAdresi;
}

public String getE_iletiAdresi (){


return this.e_iletiAdresi;
}
ja

public void reset(ActionMapping mapping, HttpServletRequest request) {


this.ad=null;
this.adres=null;
this.e_iletiAdresi =null;
}
w.

public ActionErrors validate()(


ActionMapping mapping, HttpServletRequest request ) {
ActionErrors errors = new ActionErrors();

if( getAd() == null || getAd().length() < 1 ) {


errors.add("ad",new ActionMessage("error.ad.required"));
}
if( getAdres() == null || getAdres().length() < 1 ) {
ww

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 class AdresEylemi extends Action


{

}
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

Eylemi ele almak için aşaıdaki satırları da ekleyelim. "/Adres.do":

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

Adresin girileceği formu içeren Adres.jsp sayfasını oluşturalım.

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.

Struts HTML Etiketleri

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.

seçebilmeli. Varlıkları tanımlamak için


<html:options> kullanın.
<html:textarea Metin kutusu oluşturur.
property="metinKutusu"
value="Merhaba Dünya" />
<html:form action="/Adres" HTNL Form’u sunucuya göndermek için kullanılır.
ww

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.

Struts büyük web uygulamaları yapmamıza yardımcı olur. Kullanıldığında


w.

uygulama daha etkin ve sorunsuz çalışır. Debugla ve proglama ile harcayacağımız


süreyi büyük oranda azaltır.
Struts java tabanlı web uygulamarının bütün parçalarını içeren bir frameworktür.
Bu noktada java tabanlı web uygulamalarının parçalarına bakılırsa;

Java servlets: java ile yazılmış web sunucu tarafında çalışan ve kullanıcının
ww

istemlerini cevaplayan programdır.


Java server pages: web sayfalarını statik ve dinamik olarak oluşturmayı sağlayan
teknolojidir.
Java beans: belirli kuralları belirli şekillerde uygulayan parçalardır.
Business Logic: fonksiyonelliği veya özelleşmiş uygulamanın kurallarını içeren
koddur.

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Ü

Java tabanlı web uygulamalarına baktıktan sonra framework’ün ne olduğu da

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.

Struts frameworkü 300’e yakın java sınıfından oluşmuştur ve bu sınıflar 8 paket

i.c
içinde yer alırlar. Struts’ın bu 8 paketi ve birbiri ile ilişkilerinin açıklamaları şu
şekildedir.

ActionForm, ActionMessage gibi control sınıfları ve diğer


action gerekli framework parçalarını içerir.
Action sınıfının içermediği DispatchAction gibi uygulamanın
actions kullandığı veya içerdiği Action sınıflarını içeririr.

config

taglib
tiles
upload
sınıflarını içerir.

sınıfları içerir. dil


Struts konfigrasyon dosyasının belleğindeki configrasyon

Struts tag libraryleri için tagleri ele almaya yarayan

Başlık frameworkü tarafından kullanılan sınıfları içerir


Browser kullanarak yerel dosya sisteminden dosya indirmek ya
da dosya yüklemek için gerekli olan dosyaları içerir.
va
Bütün framework tarafından kullanılan genel amaçlı yararlı
util dosyaları içerir.
Tanımlayıcının yerleştirilmesi için kullanılan özel sınıfları
validator içerir.

“uygulama frameworkü” uygulama geliştirici tarafından düzenlenen uygulamanın


ja

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.

MVC örüntüsü adından anlaşıldığı gibi üç katmandan oluşur:

Model: veri ve iş mantığını açıklar.


View: Verilerin sunumudur.
Controller: Kontrol mekanizmasıdır.
ja

Bu katmanlı yapı diğer katmana en az etki ile maximum esnekliği sağlar.

Model, iş mantığında işlanmasi gereken veriye erişimi sağlar. Veri ekleme ve


w.

güncelleme işlamleri için kullanılan araçlarla uyumu sağlar.

View, modelden kullanıcıya görüntülenmesinden sorumludur. View aynı


zamanda verinin kullanıcıdan controller’a gitmesini sağlar. Bu bağlamda istem de
cevap da view’ın önderliğinde yapılır.
ww

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.

The Model-View-Controller Yapısı

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

sayesinde, kendi uzmanlik alanlarında diğer alanlarla ilgilenmeden çalışabilirler. Aynı


zaman da bu örüntünün adımları ve yapısı iyi bir şekilde tanımlandığı için rahatlıkla
anlaşılabilir ve gerekli değişiklikler yapılabilir.
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
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

2.1.1. Struts controller


Struts’ın ilk controller sınıfı ActionServlet’tir. Bu sınıf bütün kullanıcı istemlerini
ele alır. Konfigrasyon dosyasındaki bilgileri kullanarak, ActionServlet sınıfı istemin bir
w.

parçası olan verileri toplayan “RequestProcessor” sınıfını alır ve “ActionForm” a


koyar. ActionForm kullanıcıdan gelen ve kullanıcıya giden verileri içeren bir bean’dir.
Son adımda controller istem türüne göre uygun “handler” a controlü
devreder(delegate). Handler “action” sınıfının alt sınıfıdır. Action sınıfı controller’ın
çalıştığı asıl yerdir. Kullanıcı istemi burada çalıştırılır ve işlamlari yapılır.
Gerekli action çalıştırıldıktan sonra action sınıfı uygun view’e geri döner. Struts
controller’ın parçaları aşağıda gösterilmiştir.
ww

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

2.1.3. Struts Model

Strutsdaki hiçbir şey modelin nasıl gerçekleştirileceğini belirtmez. Bunun için


va
birçok yöntem kullanılır. En çok kullanılan yöntem: veriyi ve işlemler JavaBean ile
sarmalamakdır. Veri ve işlem aynı veya farklı sınıflarda bulanabilirler.

İşlemler uygulamanın tanımladığı iş mantığının sunumudur. Bir iş belirli


özellikte uygulanması gereken kurallar şaklinde düşünülebilir.

™ 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

Neden struts kullanmalıyım?


Struts ile;
w.

• JSP sayfalarında bulunan Java kodları en aza inmekte


• Kullanıcı arayüzünde (JSP) iş mantığını barındıran kodların bulunması
engellenmekte
• Arayüz tasarımcısının tasarıma yoğunlaşması sağlanmakta
• Web tabanlı uygulamanın olay akışının tek bir XML dosyası (struts-config.xml)
üzerinden kontrolü sağlanmakta
• Yaygın olarak kullanılan form kontrolleri (e-posta adresi, boşluk, sayı, karakter
ww

kontrolleri v.b. ) tanımlanmış olarak gelmekte


• Form kontrolleri sunucu (Java) veya istemci (JavaScript) tarafında
kullanılabilmekte
• Birden fazla dili destekleyen uygulamalarda kullanıcı arayüzünde gösterilen
mesaj ve etiketlerin yönetimi properties dosyalarından yapılmakta (id8n)
• UTF - 8 kodlamasına (Internalization) destek verilmektedir

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:

ƒ JDK’yı indirin ver kurun


ƒ Tomcat 5.0’ı indirin ve kurun

o
ƒ Tomcat’in çalıştığından emin olun

Bu uygulamaları bulabileceğiniz web adresleri:


¾ http://java.sun.com/javase/downloads/index.jsp

i.c
¾ http://jakarta.apache.org/tomcat

Kurulumu dahada basitleştirmek adına aşağıda bu adımların Windows için


kurulumları yer almaktadır.

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.

3.2. Tomcat Kurulumu


va
JDK makinenize kurulduktan sonra artık Tomcat kurulumuna hazırsınız.
Windows kurulum sihirbazı kurulumun ayrıntılarını ele almak için uygundur.
Windows’un kurulum sihirbazını kullanmak için tomcat’in .exe sürümünü
indirmelisiniz.Daha sonra indirilen bu exe dosyanın üzerine çift tıklamalısınız.
Tomcat’in standart kurulumu birçok kişi için yeterlidir, bu yüzden kurulum
genelinde next’e tıklama şeklindedir. Aşağıda sizdem yapmanız beklenen işlemler
yer almaktadır, bu işlemleri sizden nelerin beklendiğini anlamanız adına açıklıyoruz.
ja

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.

ayarları seçip, “next” e tıklayın.


4. Size ana klasörü seçmek için seçenek sunulacaktır. Normal seçim(defoult)
genelde C:\ProgramFiles\ Apache Software Foundation\Tomcat5.5
olacaktır. Bu adres birçok kullanıcı için uygundur. Eğer adres değişikliği
yapacaksanız sadece sürücü harfi değiştirmeniz tavsiye edilir ki daha
sonra rahat bir şekilde takip edebileiniz. Ama adres değişikliği
ww

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.

Tomcat kurulumu tamamlandı şimdi Tamcat’i test etmelisiniz. Tomcat’i


öncelikle çalıştırmanız gerekir bunun için Windows kurulum sihirbazı tomcati başlat

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.

3.3. Struts Kurulumu

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.

4. BASİT BİR STRUTS ÖRNEĞİ


dil
Anlatılanların pekişmesi adına bir tane struts örneği verilecektir. Bu örnek çok
basit bir giriş uygulaması olacaktır. Örnekte kullanıcının ismi ve şifresi isteniyor. Şifre
iki kere isteniyor eğer girilen şifreler birbirinin aynı ise doğru giriş aksi durumda yanlış
giriş oluyor ve ilgili sayfalara yönleniliyor. Ama öncelikte eclipse de bir struts projesi
va
açılacaktı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
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.

Aşağıda giriş sayfasının ilgili bölümünün görünümü yer almaktadır:


ww

Bu sayfanın yapılması için gerekli kod aşağıda verilmiştir. Bu kod baslangic.jsp


de tutulmaktadır.

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

Kullanıcının girdiği iki parola birbirinden farklı ise hata.html’e yönlenilenecektir.


Hatalı olma görünümü ve ilgili kod aşağıda verilmiştir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
27
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

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>

Baslangic.jsp deki bilgiler bir formda kendiliğinden tutulurlar. Bu form


baslangic.jsp’den alınan veriler üzerinde oynama imkanı sağlar. Bu formu kullanarak
va
bu verileri elde edebiliriz. Bu şekilde verileri jsp’den almaya çaba harcamayız veriler
zaten formda olduğu için biz bu verileri kullanırız. Bu formun içeriği ise şöyledir.

RegisterForm.java

package app;
import org.apache.struts.action.*;
ja

public class RegisterForm extends ActionForm {

protected String username;


protected String password1;
w.

protected String password2;

public String getUsername () {return this.username;};


public String getPassword1() {return this.password1;};
public String getPassword2() {return this.password2;};

public void setUsername (String username) {this.username =


ww

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.*;

public class RegisterAction extends Action {


public ActionForward perform (ActionMapping mapping,

i.c
ActionForm form,
HttpServletRequest req,
HttpServletResponse res) {

// b Cast the form to the RegisterForm


RegisterForm rf = (RegisterForm) form;
String username = rf.getUsername();

dil
String password1 = rf.getPassword1();
String password2 = rf.getPassword2();

// c Apply business logic


if (password1.equals(password2)) {
try {
// d Return ActionForward for success
va
//UserDirectory.getInstance().setUser(username,password1);
return mapping.findForward("success");
} catch (Exception e) {
return mapping.findForward("failure");
}
}
// E Return ActionForward for failure
ja

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.

Struts-config.xml de 3 tür bilgi bulunur:


ww

Genel Yönleniciler(Global Forwards)


<forward name="JSP için Ad" path="/JSP Ad .jsp"/>
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:
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
29
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
<html:link forward="genel yönlenicilerde tanımlı değer">
görüntülenecek bağlantı adı

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 E lemleri(Action Mappings)


Bunun 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"
scope="request"
input="tümle ik JSP nin yolu"> dil
<forward name="bir isim" path="/JSP nin yolu"/>
</action>
va
Bunun bir örneği:
<action path="/KullanıcıEkle"
type=" com.ogrenci.Action.KullanıcıEkleAction "
scope="request"
input="/jsp/KullanıcıEkle.jsp">
<forward name="basarılı " path="/jsp/KullanıcıEkle.jsp"/>
ja

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

Girdi kabul eden JSP ActionMapping formu:


<action path="bu sayfay ça rmak için kullanılan mantıksal yol"
type="action sınıfın yolu" scope="request"
input="actiona ulaşılmasını sağlayan JSP nin yolu"
name= Action formun adı>
<forward name="bir isim" path="/JSP nin yolu"/>
</action>
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
30
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

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

Eylemler, kanal korumalı tarzda programlanmalıdır; çünkü denetçi, eşanlı çoklu


istemler için atnı nesneyi paylaşır.
Bu yüzden;
* Olgu( instance) ve durağan değerler (static variables) istem durumuyla ilgili
bilgileri saklamamk için kullanılmammalıdır. Aynı eylem için istemlerin evrensel
kaynakları (global resources) için kullanılabilirler.

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

ActionForm, bir ya da daha fazla ActionMappings’le ilişkilendirilen bir JavaBean’dir.


Özellikleri, uygun Action.execute yordamı çağrılmadan önce uygun istem parametreleri
(temel değişkenleri) ile ilklendirilir.

Bu çekirdeğin özelliklerine değer atandıktan sonra, execute yordamı çağrılmadan önce bu

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.

mapping) yerine uzantı eşlemesi (extension mapping) kullanılıyorsa “aramaAction.do”


yazılır. *.do uzantılılar özdevinir (otomatik) olarak ActionServlet’e yönlendirilir. Bunun
yanında method, focus, type, scope gibi pek çok nitelik de kullanılabilir. Varsayolan
method değeri POST’tur. Scope değeri olarak “request” ya da “session” seçilebilir.

6. GİRDİLERİN ELE ALINMASI


ww

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.

6.2. Açılır Kutu Girdisi(Drop-Down Combo Box Input)

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.

Select aşağıdakilerle kullanılabilir:


• Dizgi kümesi(collection of strings), dizi listesi(arraylist)
• Her biri dizgi alanlar içeren çekirdek kümesi
• Kod içine gömülü(hard coded) değerler
ja

• Yukarıdakilerin birleşimi

Dizgilerin dizi listesi ile:

Dizi listesinin adı isimListesi olsun. Bu liste istem veya oturumdan birinin içine
w.

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">
<html:options name="isimListesi" />
</html:select>
ww

Dizgi dizi listesi ile seçilen value nasıl ilişkilendirilir:

Select şu sekilde değiştirilir:


<html:select property="seçilenDeğer" value="birİisim">
<html:options name="isimListesi" />
</html:select>

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:

Çekirdeklerin dizgi alanları şunlarla ilgilidir:


• görüntülenenDeğer
• kimlikDeğeri

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>

Select şu şekilde değiştirilir: dil


Çekirdeklerin dizi listesi ile seçilenDeğer nasıl ilişkilendirilir:

<html:select property="seçilenDeğer" value="birÖzellik">


<html:options collection="isimListesi" property="kimlikDeğeri"
va
labelProperty="görüntülenenDeğer"/>
</html:select>

birÖzellik options etiketinde collection niteliği tarafından belirlenen listedeki


çekirdeğin alanlarındaki dizgilerden biridir.
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.
w.

<html:select property="seçilenDeğer">
<html:option value="değer1"/>
<html:option value="değer2"/>
<html:option value="değer3"/>
</html:select>

İlişkilendirilmiş dizgilerle SeçilenDeğer’in İlişkilendirilmesi


ww

Select şu şekilde değiştirilir:


<html:select property="selectedValue" value="değer2">
<html:option value="değer1"/>
<html:option value="değer2"/>
<html:option value="değer3"/>
</html:select>
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
35
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
6.3. Radyo Düğmesi Girdisi

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:

<html:radio property="seçim value= ssk />


<html:radio property="seçim value= emeklisand />

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.

6.4. Onay Kutusu Girdisi

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:

<html:checkbox property= öğeEkle value= on />


va
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çilmelidir.
value bu onay kutusunun seçilip seçilmediğini belirler. Hiç bir şey yapılmazsa değeri
“on” dur.

7. ÇIKTILARIN ELE ALINMASI


ja

7.1. Metin Çıktısı(Text Output)


bean:write etiketi metnin yazdırılması için kullanılır.Bir örnek:
w.

<bean:write property="isim" filter="true"/>

Form çekirdeğindeki “isim” alanının değerini yazmak içindir. filter niteliği


html’de problem yaratacak karakterleri otomatik kodlamaya izin verir. Hiç bir
değişiklik yapılmadığı takdirde(default) değeri 0 (false)’tır.
ww

7.2. Struts’ ta Tablo Yaratma


Struts’ta iterate etiketi tablo yaratmak için kullanılır. Aşağıda basit bir örnek var.

<logic:iterate id="öğrenci" name=”ÖğrenciListesi” scope="session"


type="hubm.ogrenci.proje.ÖğreciListeForm">
<tr>
<td><bean:write name="öğrenci" property="ad" filter="true"/></td>
<td><bean:write name="öğrenci" property="soyad" filter="true"/></td>
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
36
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
<td><bean:write name="öğrenci" property="numara" filter="true"/></td>
<td><bean:write name="öğrenci" property="bölümkodu” filter="true"/></td>

m
</tr>
</logic:iterate>

bean:write etiketinin name niteliği property’i form çekirdeğinde aramak yerine


iterate etiketi tarafından yaratılan çekirdeği kullanmak için kullanılıyor. scope değeri
verilmemişse etiket çekirdeği sırayla sayfa(page), istem(request), oturum(session)

o
veya uygulama(application) etki alanlarında arıyor. Type değeri formun fiziksel yolunu
verirken; name formun mantıksal ismini veriyor.

7.3. Iterate Etiketinin Etki alanında(scope) İndisli Nitelik Kullanma

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.

7.4. Bir Tabloda Onay Düğmeleri Kullanma


dil
Bir tablonun elemanları düzenlenmek veya silinmek üzere sunulduğu zaman,
tablodaki her satıra karşılık bir ya da iki onay düğmesinin olmasını isteyebilirsiniz.
Aşağıda bunun örneği var.
va
<logic:iterate id="öğrenci" name=”ÖğrenciListesi” scope="session"
type="hubm.ogrenci.proje.ÖğreciListeForm">
<tr>
<td> <html:submit indexed="true" property="komut" value="Düzenle" />
</td>
<td> <html:submit indexed="true" property="komut" value="Sil" /> </td>
ja

<td>
<bean:write name="öğrenci" property="ad" filter="true"/> </td>
<td>
<bean:write name="öğrenci" property="soyad" filter="true"/> </td>
<td>
w.

<bean:write name="öğrenci" property="numara" filter="true"/>


</td>
<td> <bean:write name="öğrenci" property="bölümkodu” filter="true"/>
</td>
</tr>
</logic:iterate>
ww

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:

private int secilenDeger = 0;


private String komut = “”;

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

Bazı durumlarda aşağıdaki tablo benzeri tablolar yaratılmak istenebilir.


Durum
Muaf Geçti Kaldı Form elemanı
0 * 0 Genel ders durumu
* 0 0 Akademik ders durumu
w.

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.
ww

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.

8.1. Zincirlenmiş(Chained) aykırı durumların Kullanılması


Bazen bir aykırı durumu ele alıp farklı bir aykırı durum fırlatmak istenebilir.
va
Kullanıcının esas aykırı durumu umarsamıyor veya bilmek istemiyor olabilir. Örneğin
kullanıcı veritabanına bir resim eklemek istesin ve ekleme yapan yordam şu şekilde
çağrılsın:

• public void updateImageFile( String imagePath ) throws UploadException;

Methot çağrıldığında bir hata oluştuğunda UploadException fırlarılır. Ama esas


ja

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;
}

public void setRootCause(Throwable anException) {

o
rootCause = anException;
}

public Throwable getRootCause( ) {

i.c
return rootCause;
}

public void printStackTrace( ) {


printStackTrace(System.err);
}

}
dil
public void printStackTrace(PrintStream outStream) {
printStackTrace(new PrintWriter(outStream));

public void printStackTrace(PrintWriter writer) {


super.printStackTrace(writer);
va
if ( getRootCause( ) != null ) {
getRootCause( ).printStackTrace(writer);
}
writer.flush( );
}
}
ja

Bu sınıfın öğeleri ile gerçek aykırı durum gizlenebilir ve bu aykırı durumun


ayrıntılı yapısından souyutlanılabilir. Bu yapı aynı azamanda kullanıcıya vakit
kazandırır.
w.

8.2. Haber veren(declarative) veya programsal(programmatic) aykırı


durumlar
Haber veren aykırı durumların nasıl ele alınacağı, hangi aykırı durumların
fırlatılacağı nasıl ele alınacağı, prohramın dışında bir dosyada genellikle XML
dosyasında belirtilir. Bu yaklaşım aykırı durumlar üzerinde koda dokunmadan daha
ww

rahat bir şekilde değişiklik yapılmasına olanak verir.


Programsal aykırı durumlar bunun tam tersidir. Aykırı durumu ele alan method
kodun içerisindedir, dış bir dosyada ele alınmaz. Struts için bu yaklaşımın kullanımı
biraz daha zordur.
Diğer struts biçim(configration) seçenekleri gibi, haber veren aykırı durumlar
da struts-configuraion dosyasında yer 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
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" ?>

<!DOCTYPE struts-config PUBLIC


"-//Apache Software Foundation//DTD Struts
Configuration 1.1//EN"

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

“Exception” elementinin içindeki path aykırı durum oluştuğunda programın


yönleneceği sayfayı gösterir. Mesela “ExpiredPasswordException” oluştuğunda,
controller control’ü changepassword.jsp’ye yönlendirir.
Aykırı durum Action sınıfının içinde programsal olarak ele alınmadığı zaman
RequestProcessor bu aykırı durum türünde bir “exception” elemenamı var mı diye
bakar. Eğer varse control bu elemanın path’indeki yere yönlendirilir. Aşağıdaki örnek
RequestProcessor’ün processException metodunu göstermekteir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
41
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
protected ActionForward processException
(HttpServletRequest request,

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;

throw (ServletException) exception;


}else{
throw new ServletException(exception);
dil
}else if (exception instanceof ServletException){
va
}

// Use the configured exception handling


try {
Class handlerClass = Class.forName(config.getHandler( ));
ExceptionHandler handler =
(ExceptionHandler)handlerClass.newInstance( );
ja

return (handler.execute(exception, config, mapping,


form,request, response));
}catch (Exception e){
throw new ServletException(e);
}
w.

Exceptionconfig nesnesi biçim(configration) dosyasındaki exception nesnesi


için bellek alanıdır. Eğer findExcetion metodu bu aykırı durum için bir exception
nesnesi bulamaz ise aykırı durum struts aykırı durum ele alıcısına gönderilmeden
ww

kullanıcıya geri fırlatılır.


Eğer oluşan aykırı durumun türünde bir exception elemanı ver ise
findException metodundan “ExceptionConfig” nesnesi döner. Rdından bu nese
üzerinden getHandler metodu çağrılır ve aykırı durum işlenir.
Eğer sizin kendi yanılmadığınız yoksa Ssruts çatısı kendi aykırı durum ele
alıcı(handler) sınıfını kullanır. Struts’ın kendi ele alıcı sınıfı
org.apache.struts.action.ExceptionHandler’dır. bu sınıfın execute() metodu bir
ActionError yaratır, bunu uygun alanda saklar ve exception elemanının path niteliği
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
42
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
ile ilişkili ActionForward nesnesini döndürür. Özetlersek, eğer action elemanın içine
exception elemanını tanımlarsanız, aykırı durum ele alıcısı ActionError yaratır ve

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

facility that allows

of its dil
* class and its subclasses support the chained exception

* a root cause Throwable to be wrapped by this class or one

* descendants. This class also supports multiple exceptions


via the
* exceptionList field.
va
*/
public class BaseException extends Exception{

protected Throwable rootCause = null;


private List exceptions = new ArrayList( );
private String messageKey = null;
private Object[] messageArgs = null;
ja

public BaseException( ){
super( );
}
w.

public BaseException( Throwable rootCause ) {


this.rootCause = rootCause;
}

public List getExceptions( ) {


return exceptions;
ww

public void addException( BaseException ex ){


exceptions.add( ex );
}

public void setMessageKey( String key ){


this.messageKey = key;
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
43
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
}

m
public String getMessageKey( ){
return messageKey;
}

public void setMessageArgs( Object[] args ){

o
this.messageArgs = args;
}

public Object[] getMessageArgs( ){

i.c
return messageArgs;
}

public void setRootCause(Throwable anException) {


rootCause = anException;
}

public Throwable getRootCause(

}
return rootCause;

public void printStackTrace( ) {

}
printStackTrace(System.err);
dil ) {
va
public void printStackTrace(PrintStream outStream) {
printStackTrace(new PrintWriter(outStream));
}

public void printStackTrace(PrintWriter writer) {


super.printStackTrace(writer);
ja

if ( getRootCause( ) != null ) {
getRootCause( ).printStackTrace(writer);
}
writer.flush( );
w.

}
}

BaseException, sınıfı strutsın kaynaklarına bir anahtar olan, messageKey


içerir. Bu anahtar ActionError sınıfının yapılandırıcısına(constructor) geçilir ve struts
ww

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
{

protected ActionForward execute(Exception ex,


ExceptionConfig config,
ActionMapping mapping,
ActionForm formInstance,
va
HttpServletRequest request,
HttpServletResponse
response)
throws ServletException {
ActionForward forward = null;
ActionError error = null;
String property = null;
ja

/* Get the path for the forward either from the


exception element
* or from the input attribute.
*/
w.

String path = null;


if (config.getPath( ) != null) {
path = config.getPath( );
}else{
path = mapping.getInput( );
}
ww

// Construct the forward object


forward = new ActionForward(path);

/* Figure out what type of exception has been thrown.


The Struts
* AppException is not being used in this example.
*/
if( ex instanceof BaseException) {
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
fatihg@cs.hacettepe.edu.tr
45
HACETTEPE ÜNİVESİTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
// This is the specialized behavior
BaseException baseException = (BaseException)ex;

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( );
}

// Store the ActionError into the proper scope

class

}
dil
// The storeException method is defined in the parent

storeException(request, property, error, forward,


config.getScope( ));

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.

8.3. Programsal Aykırı Durumlar


Bu yaklaşımda aykırı durumlar kodun içerisinde ele alınır. Bunun anlamı siz bir
va
çatıyı uygulamanız için genişletmelisiniz(extend). Bu yaklaşımda yine actionError
yaratılır ve uygun alanda saklanır ve kontrol uygun ActionForwarda devrediliyor.
Uygulamanın aykırı durumları yine BaseException’dan türemişlerdir. Aykırı
durumu yakalamak kolaydır çünkü aykırı durumu yakalamak için sadece bir catch
bloğu kullanırsınız. Eğer aykırı durum BaseExceptiondan türeyen bir durum değise,
bunun sistem aykırı durumu olduğu anlanır ve öyle davranılır. Action sınıfının
try/catch blokları ve aykırı durumun ele alınışı aşağıdaki gibidir.
ja

try{

// Peform some work that may cause an application or system


exception
w.

}catch( BaseException ex ){
// Log the exception

// Create and store the action error


ActionErrors errors = new ActionErrors( );
ActionError newError = new ActionError( ex.getErrorCode(),
ww

ex.getArgs( ) );
errors.add( ActionErrors.GLOBAL_ERROR, newError );
saveErrors( request, errors );

// Return an ActionForward for the Failure resource


return mapping.findForward( "Failure" )

}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 );

// Return an ActionForward for the system error resource


return mapping.findForward( IConstants.SYSTEM_FAILURE_PAGE

i.c
);
}

Bu yaklaşımdaki hata her Action sınıfının içinde kod fazlalığı oluşturmasıdır.


Bu fazlalığı yok etmenin yolu haber veren yöntemin kullanımınıdır. Eğer bu yöntemi
kullanamıyor ya da kullanmıyorsanız bu fazlalıktan kurtulmak için bir yöntem daha
vardır.

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

• O’Reilly Programming Jakarta Struts


• Struts in Action- Ted Husted, Cedric Demoulin, George Franciscus, David
Winterfeldt
ja

• Jakarta Struts for Dummies- Mike Robinson, Ellen Finkelstein


• http://www.forumta.com/programlama/99196-struts-sisteminin-
kurulumu.html
• www.ibm.com
• www.cs.unc.edu
w.

• 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

You might also like