Struts Mgulec Wwwjavadilicom

  • Uploaded by: www.javadili.com
  • 0
  • 0
  • December 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Struts Mgulec Wwwjavadilicom as PDF for free.

More details

  • Words: 8,518
  • Pages: 48
ww w. ja

va

dil

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

2007, Ankara

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

1

HAZIRLAYANLAR

E-Posta [email protected] [email protected] [email protected]

Tarih

21.01.2007

ww w. ja

va

dil

1. Ekip

İsim - Soyisim Harun Reşit Zafer Sertaç Demir Karahan Öztürk

i.c o

Ekip 2.Ekip

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

2

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

i.c o

İÇİNDEKİLER

ww w. ja

va

dil

İÇİNDEKİLER....................................................................................................................... 3 STRUTS HIZLI BAŞLANGIÇ .............................................................................................. 5 Struts Nedir? ....................................................................................................................... 5 MVC (Model-View-Controller) Mimarisi ......................................................................... 5 Model: ............................................................................................................................ 5 Görünüm: ....................................................................................................................... 5 Denetçi: .......................................................................................................................... 5 Geliştirme Ortamını Kurma ............................................................................................... 6 JDK’yı Kurma ................................................................................................................ 6 Tomcat’i Kurma ............................................................................................................. 6 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 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 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 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 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. [email protected]

3

ww w. ja

va

dil

i.c o

m

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 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 8.3. Programsal Aykırı Durumlar ..................................................................................... 47 KAYNAKLAR..................................................................................................................... 48

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

4

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

m

STRUTS HIZLI BAŞLANGIÇ Struts Nedir?

i.c o

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.

MVC (Model-View-Controller) Mimarisi

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

dil

modelde gerçekleştirilir. Veri erişimi, veri doğrulama ve veri saklama model tarafından gerçekleştirilir.

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.

va

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

ww w. ja

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.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

5

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

i.c o

Geliştirme Ortamını Kurma

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.

Tomcat’i Kurma

Strurts’ı Kurmak

dil

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.

va

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, strutsexample.war…).

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

ww w. ja

Denetçiyi Anlamak

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. <servlet> <servlet-name>action <servlet-class>org.apache.struts.action.ActionServlet <param-name>config <param-value>/WEB-INF/struts-config.xml <param-name>debug <param-value>2 <param-name>detail <param-value>2 2 Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected] 6

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

<servlet-mapping> <servlet-name>action *.do
i.c o

Bu servlet, struts için tüm istemlerden sorumludur. Kullanıcı web.xml dosyasında <servletmapping> 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.

Hosgeldin.jsp

dil

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 mapping definitions) herhangi bir eylemi eşlemek için kullanılır. Bir Hosgeldin.jsp sayfası oluşturup istemi “Hosgeldin.do”ya yönlendirelim.

ww w. ja

va

<%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <bean:message key="welcome.title"/>



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. Aşağıda etiketleri kullanılarak istem, Hosgeldin.jsp’ye yönlendirilir.

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. [email protected]

7

Buraya Tıkla

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

i.c o

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.

Eylem Sınıfını (Action Class) Anlamak

Eylem Sınıfı Nedir?

va

dil

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

ww w. ja

Eylem Sınıfı Oluşturmak

Ö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 strutsconfig.xml dosyasında da tanımlanacaktır.

YonlendirEylemi.java

package anapaket;

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import import import import

org.apache.struts.action.Action; org.apache.struts.action.ActionForm; org.apache.struts.action.ActionForward; 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"); [email protected] } }

8

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

i.c o

Eylem sınıfının imzası aşağıdaki gibidir. public ActionForward execute(ActionMapping mapping, ActionForm form, javax.servlet.http.HttpServletRequest request,

javax.servlet.http.HttpServletResponse response) throws java.lang.Exception

Temel Değişkenler (Parameters):

dil

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.

va

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

ww w. ja

Struts-config.xml Dosyasına Eylem Eşlemesi Eklemek Uygulamamızı sınama için anasayfaya (index.jsp) aşağıdaki bağlantıyı ekleyelim: Yönlendir Struts-config.xml:



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

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. [email protected]

9

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

m

ActionForm Nedir? 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.

ww w. ja

va

dil

i.c o

AdresForm.java

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

10

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.*;

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

dil

public String getAd(){ return this.ad; }

i.c o

public class AdresForm extends ActionForm { private String ad=null; private String adres=null; private String e_iletiAdresi=null;

m

package form;

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

va

public String getAdres(){ return this.adres; }

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

ww w. ja

public String getE_iletiAdresi (){ return this.e_iletiAdresi; }

public void reset(ActionMapping mapping, HttpServletRequest request) { this.ad=null; this.adres=null; this.e_iletiAdresi =null; }

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 ) { 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. [email protected]

11

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜ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.

i.c o

AdresEylemi.java package anapaket;

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import import import import

org.apache.struts.action.Action; org.apache.struts.action.ActionForm; org.apache.struts.action.ActionForward; org.apache.struts.action.ActionMapping;

va

dil

public class AdresEylemi extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{ return mapping.findForward("basarili"); } }

Struts-congig.xml dosyasında form çekirdeğini tanımlayalım.:

ww w. ja



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

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. [email protected]

12

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %>

i.c o

<bean:message key="welcome.title"/>

ww w. ja

va

dil

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

36

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

m



i.c o

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

dil

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

va

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.

ww w. ja



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. [email protected]

37

dil

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ public void setKomut (int index, String deger) { secilenDeger = indis; komut = deger; } public String getKomut (int indis) { return komut; } public String getKomut() { return komut; } public int getIndis() { return secilenDeger; }

va

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.

ww w. ja

7.5. Radyo Düğmeleri Tablosu Yaratma

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

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. 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. [email protected]

38

8. AYKIRI DURUMLARIN ELE ALINMASI

m

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.

dil

i.c o

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



va

Bazen bir aykırı durumu ele alıp farklı bir aykırı durum fırlatmak istenebilir. 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;

ww w. ja

Methot çağrıldığında bir hata oluştuğunda UploadException fırlarılır. Ama esas 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 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 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. [email protected]

39

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ protected Throwable rootCause = null; protected BaseException( Throwable rootCause ) { this.rootCause = rootCause; }

public Throwable getRootCause( return rootCause; }

i.c o

public void setRootCause(Throwable anException) { rootCause = anException; } ) {

dil

public void printStackTrace( ) { printStackTrace(System.err); }

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

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

ww w. ja

}

}

va

public void printStackTrace(PrintWriter writer) { super.printStackTrace(writer);

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.

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 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. [email protected]

40

m

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:

i.c o



dil

<struts-config> <exception key="security.error.changepassword" path="/changePassword.jsp"

va

type="com.oreilly.struts.framework.exceptions.ExpiredPasswordE xception"/> <exception key=" security.error.loginfailed"

ww w. ja

type="com.oreilly.struts.framework.exceptions.InvalidLoginExce ption" path="/login.jsp"/> <exception key="security.error.accountlocked" type="com.oreilly.struts.framework.exceptions.AccountLockedExc eption" path="/accountLocked.jsp"/>


“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. [email protected]

41

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ protected ActionForward processException (HttpServletRequest request, HttpServletResponse response, Exception exception, ActionForm form, ActionMapping mapping) throws IOException, ServletException { // Is there a defined handler for this exception? ExceptionConfig config = mapping.findException(exception.getClass( )); if (config == null){ if (log.isDebugEnabled(

)){

va

dil

log.debug(getInternal().getMessage("unhandledException",except ion.getClass( ))); } if (exception instanceof IOException){ throw (IOException) exception; }else if (exception instanceof ServletException){ throw (ServletException) exception; }else{ throw new ServletException(exception); } }

));

ww w. ja

// Use the configured exception handling try { Class handlerClass = Class.forName(config.getHandler( ExceptionHandler handler = (ExceptionHandler)handlerClass.newInstance( ); return (handler.execute(exception, config, mapping, form,request, response)); }catch (Exception e){ throw new ServletException(e); } }

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 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. [email protected]

42

i.c o

m

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

va

dil

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 * 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. This class also supports multiple exceptions via the * exceptionList field. */ public class BaseException extends Exception{ );

ww w. ja

protected Throwable rootCause = null; private List exceptions = new ArrayList( private String messageKey = null; private Object[] messageArgs = null; public BaseException( super( ); }

){

public BaseException( Throwable rootCause ) { this.rootCause = rootCause; } public List getExceptions( return exceptions; }

) {

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. [email protected]

43

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ public String getMessageKey( return messageKey; }

m

} ){

i.c o

public void setMessageArgs( Object[] args ){ this.messageArgs = args; } public Object[] getMessageArgs( return messageArgs; }

){

dil

public void setRootCause(Throwable anException) { rootCause = anException; } public Throwable getRootCause( return rootCause; }

) {

va

public void printStackTrace( ) { printStackTrace(System.err); }

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

ww w. ja

public void printStackTrace(PrintWriter writer) { super.printStackTrace(writer); if ( getRootCause( ) != null ) { getRootCause( ).printStackTrace(writer); } writer.flush( );

}

}

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 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. [email protected]

44

javax.servlet.ServletException; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; org.apache.struts.action.ExceptionHandler; org.apache.struts.action.ActionForm; org.apache.struts.action.ActionError; org.apache.struts.util.AppException; org.apache.struts.action.ActionForward; org.apache.struts.action.ActionMapping; org.apache.struts.config.ExceptionConfig;

i.c o

import import import import import import import import import import

m

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ı vekillendirerek(substituning) nasıl özel özellik kazandırılıcağını ele almaktadır. package com.oreilly.struts.chapter10examples;

dil

import com.oreilly.struts.framework.exceptions.BaseException; public class SpecialExceptionHandler extends ExceptionHandler {

ww w. ja

va

protected ActionForward execute(Exception ex, ExceptionConfig config, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws ServletException { ActionForward forward = null; ActionError error = null; String property = null; /* Get the path for the forward either from the exception element * or from the input attribute. */ String path = null; if (config.getPath( ) != null) { path = config.getPath( ); }else{ path = mapping.getInput( ); } // 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. [email protected]

45

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ // This is the specialized behavior BaseException baseException = (BaseException)ex; String messageKey = baseException.getMessageKey( ); Object[] exArgs = baseException.getMessageArgs( ); if ( exArgs != null && exArgs.length > 0 ){ // If there were args provided, use them in the ActionError error = new ActionError( messageKey, exArgs ); }else{ // Create an ActionError without any arguments error = new ActionError( messageKey ); } }else{ error = new ActionError(config.getKey( )); property = error.getKey( ); }

class

dil

// Store the ActionError into the proper scope // The storeException method is defined in the parent storeException(request, property, error, forward, config.getScope( ));

}

va

return forward; }

ww w. ja

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

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

46

dil

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

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

ww w. ja

va

Bu yaklaşımda aykırı durumlar kodun içerisinde ele alınır. Bunun anlamı siz bir ç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. try{ // Peform some work that may cause an application or system exception }catch( BaseException ex ){ // Log the exception

// Create and store the action error ActionErrors errors = new ActionErrors( ); ActionError newError = new ActionError( ex.getErrorCode(), 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. [email protected]

47

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ // Log the exception

); }

i.c o

// Create and store the action error ActionError newError = new ActionError( "error.systemfailure" ); ActionErrors errors = new ActionErrors( ); errors.add( ActionErrors.GLOBAL_ERROR, newError ); saveErrors( request, errors );

// Return an ActionForward for the system error resource return mapping.findForward( IConstants.SYSTEM_FAILURE_PAGE

KAYNAKLAR

O’Reilly Programming Jakarta Struts Struts in Action- Ted Husted, Cedric Demoulin, George Franciscus, David Winterfeldt Jakarta Struts for Dummies- Mike Robinson, Ellen Finkelstein http://www.forumta.com/programlama/99196-struts-sistemininkurulumu.html www.ibm.com www.cs.unc.edu www.oracle.com www.athensgroup.com www.sitepoint.com www.jakarta.apache.org/struts http://www.roseindia.net

ww w. ja

• •

va

dil

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

• •

• • • • • • •

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

48

Related Documents

Struts
June 2020 26
Struts
November 2019 49
Struts
May 2020 36
Alanları Doldurunuz
Name
Address
E-mail address
Kaydet

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

13

i.c o

m

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 etiketiyle jsp sayfasında görüntülenir. Metin alanı oluştyrmak için etiketi kullanılır. 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. Addres Formuna Git

Struts HTML Etiketleri

Struts HTML Etiketleri

dil

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.

ww w. ja

va

İleti kaynağında, anahtara karşı gele iletiye bakar. üzere bir şifre alanı oluşturur. üzere bir metin alanı oluşturur. Gönder “Gönder” isimli bir düğme oluşturur (submit button). Reset Bir “Reset” düğmesi oluşturur. Sayfadaki hataları yazdırır. Formda dosya yükleme öğesi oluşturur. Bu öğe org.apache.struts.upload.FormFile’dan türemelidir. türleri dizisi olmalı, kullanıcı bir çok varlık seçebilmeli. Varlıkları tanımlamak için kullanın. Taban etiketi oluşturur.. tarayıcıya, nu sayfanın bulunduğu yeri temel almasını sağlar. Diğer referanslar bu tabana göre hesaplanır. HTML öğesi oluşturur.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

14

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

m

1. STRUTS NEDİR?

1.1 Web uygulaması nedir?

i.c o

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.

va

dil

Web uygulaması özünde, web sunucu tarafında çalışan, kullanıcının isteğine 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:

ww w. ja

Web container web uygulamasının elemanlarını yönetmeye yarayan araçtır. 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 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 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. [email protected]

15

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

i.c o

m

Java tabanlı web uygulamalarına baktıktan sonra framework’ün ne olduğu da 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 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ç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 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. Struts konfigrasyon dosyasının belleğindeki configrasyon config sınıflarını içerir. Struts tag libraryleri için tagleri ele almaya yarayan taglib sınıfları içerir. Başlık frameworkü tarafından kullanılan sınıfları içerir tiles Browser kullanarak yerel dosya sisteminden dosya indirmek ya upload da dosya yüklemek için gerekli olan dosyaları içerir. 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.

ww w. ja

va

dil

action

“uygulama frameworkü” uygulama geliştirici tarafından düzenlenen uygulamanın 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.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

16

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

dil

i.c o

2. MVC TASARIM ÖRÜNTÜSÜ

va

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ü kulanıcı arayüzü gerektiren sistemde kullanılabiliyor. MVC örüntüsü adından anlaşıldığı gibi üç katmandan oluşur:

ww w. ja

Model: veri ve iş mantığını açıklar. View: Verilerin sunumudur. Controller: Kontrol mekanizmasıdır.

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 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. 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. [email protected]

17

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MVC örüntüsünün çalışma mantığı aşağıdaki şakilde görülebilir.

va

dil

i.c o

The Model-View-Controller Yapısı

ww w. ja

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

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

18

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

m

2.1. Struts ve MVC

ww w. ja

va

dil

i.c o

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.

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

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

19

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

2.1.2. Struts View

2.1.3. Struts Model

dil

Struts özel bir sunuş teknolojisi içermez. Birçok struts JSP’yi kullanır ki bu JSP’ler Struts tag library(Struts and Struts-EL), JSTL (java standart tag library) ve JSF (Java server faces) tabanlıdırlar

va

Strutsdaki hiçbir şey modelin nasıl gerçekleştirileceğini belirtmez. Bunun için 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.

ww w. ja

™ Controller ve Model sınıfları arasındaki tüm etkileşim action sınıfı ile olur

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

20

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

va

dil

i.c o

Struts MVC örüntüsü ile yapılmış login işlemi bir çizim ile aşağıda örneklenmiştir.

Neden struts kullanmalıyım?

Struts ile; • • • • • • • •

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 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. [email protected]

21

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

3. STRUTS KURULUMU

JDK’yı indirin ver kurun Tomcat 5.0’ı indirin ve kurun Tomcat’in çalıştığından emin olun

i.c o

ƒ ƒ ƒ

m

Struts’ın kurulumu için java development kit(jdk), modern bir web container (ö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:

Bu uygulamaları bulabileceğiniz web adresleri: ¾ http://java.sun.com/javase/downloads/index.jsp ¾ http://jakarta.apache.org/tomcat

dil

Kurulumu dahada basitleştirmek adına aşağıda bu adımların Windows için kurulumları yer almaktadır.

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.

va

3.2. Tomcat Kurulumu

ww w. ja

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. 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) 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 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. [email protected]

22

m

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

i.c o

3.3. Struts Kurulumu

dil

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ç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/strutsconfig.xml dosyasına koyabilirsiniz. Böylelikle tamamen fonksiyonel bir Struts uygulamasına sahip olmuş olursunuz.

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

ww w. ja

va

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 açılacaktır.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

23

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

4.1. Eclipse’de Struts Projesi

ww w. ja

va

dil

i.c o

m

Eclipse’de bir struts projesi oluşturmak için indirmiş olduğunuz struts dosyaları 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.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

24

ww w. ja

va

dil

i.c o

m

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.

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.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

25

va

dil

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

4.2. Örnek Uygulama

ww w. ja

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

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

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. [email protected]

26

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="form" %>

i.c o

Kullanici Adi:
Parola Giriniz:
Parolayi Tekrarlayiniz:


dil

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.

ww w. ja

va

Basari.html: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> BASARİ Giris Basarili!!!!

yeniden dene?



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. [email protected]

27

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Hata.html:

dil

<TITLE>HATA! Giris Basarisiz!

yeniden dene?



RegisterForm.java

va

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

ww w. ja

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

public class RegisterForm extends ActionForm { protected String username; protected String password1; 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 = 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. [email protected]

28

m

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 hata ya da basarı durumuna yönlenmeyi sağlar. Programın ilgili action sınıfı ise: package app; import org.apache.struts.action.*; import javax.servlet.http.*; import java.io.*;

i.c o

RegisterAction.java

public class RegisterAction extends Action { public ActionForward perform (ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) {

dil

// b Cast the form to the RegisterForm RegisterForm rf = (RegisterForm) form; String username = rf.getUsername(); String password1 = rf.getPassword1(); String password2 = rf.getPassword2();

va

// c Apply business logic if (password1.equals(password2)) { try { // d Return ActionForward for success

ww w. ja

//UserDirectory.getInstance().setUser(username,password1); return mapping.findForward("success"); } catch (Exception e) { return mapping.findForward("failure"); } } // E Return ActionForward for failure return mapping.findForward("failure"); }

}

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 strutsconfig.xml dosyası verilmeden önce bu dosya hakkında bazı bilgile açıklanacaktır. Struts-config.xml de 3 tür bilgi bulunur:

Genel Yönleniciler(Global Forwards) bir örnek: 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. [email protected]

29

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ görüntülenecek bağlantı adı Bir örnek: Kullanıcı eklemek için tıkla

Çekirdek Bildirimleri Bir örnek: Kullanıcının girdilerini kabul edecek her JSP sayfanız için bunlardan bir tane olmaıdır.

va

dil

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.

ww w. ja

Bunun bir örneği: 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 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ı");

Girdi kabul eden JSP ActionMapping formu: Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

30

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

i.c o

Bunun bir örneği:

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. Bu bilgilerin işiğinde oluşturulan struts-config.xml dosyamız:


ww w. ja

va

dil

"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> <struts-config>

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.

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. [email protected]

31

m

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.

i.c o

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 kaynaklar temizlenmiş olur.

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.

va

5.2. ACTIONSERVLET

dil

Bu çekirdeğin özelliklerine değer atandıktan sonra, execute yordamı çağrılmadan önce bu ç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.

ww w. ja

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.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

32

5.3. HTML FORM

dil

i.c o

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

va

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 forml ögelerince yerleştirilir. Struts HTML etiket kitaplığı, html formları oluşturacak etiketleri içerir.

ww w. ja



Burada action ile bu formun gönderileceği URL girilir. Eğer yol eşlemesi (path 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

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. [email protected]

33

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

6.1. Metin Girdisi(Text Input)

i.c o

JSP ye bir metin kutusu değeri girmek için şu struts etiketini kullanabilirsiniz.

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

va

dil

Açılır kutular kullanıcının birden çok eleman arasından birini seçmesi için 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 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.

ww w. ja

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 • Yukarıdakilerin birleşimi

Dizgilerin dizi listesi ile:

Dizi listesinin adı isimListesi olsun. Bu liste istem veya oturumdan birinin içine koyulacak. Kullanıcının seçimiyle atamak için kullanılan form çekirdeğindeki alanın adı seçilenDeğer. Formda bu değer seçim öncesi değer olarak atanır.

Dizgi dizi listesi ile seçilen value nasıl ilişkilendirilir: Select şu sekilde değiştirilir: Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

34

m

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ Burada birİsim dizi listesindeki isimlerden biridir.

Çekirdeklerin dizgi alanları şunlarla ilgilidir: • görüntülenenDeğer • kimlikDeğeri

i.c o

Çekirdek dizi listesi ile:

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

dil



Çekirdeklerin dizi listesi ile seçilenDeğer nasıl ilişkilendirilir: Select şu şekilde değiştirilir:

va



ww w. ja

birÖzellik options etiketinde collection niteliği tarafından belirlenen listedeki çekirdeğin alanlarındaki dizgilerden biridir. İ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.



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

Select şu şekilde değiştirilir: Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]

35

HACETTEPE ÜNİVESİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

m

6.3. Radyo Düğmesi Girdisi 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:

i.c o



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.

7.2. Struts’ ta Tablo Yaratma

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