8. Servlet İşlemleri

Bu bölümde servlet ile ilgili bazı konular ele alınacaktır.

Servlet Cookie İşlemleri

Cookie NetScape firması tarafından oluşturulmuş genel olarak web-browser programına küçük verileri göndermek için kullanılan bir kavramdır. Cookie browsera özgü bir kavramdır yani bir browser için oluşturulmuş Cookie aynı makina içerisindeki başka bir browserda görülemez. Browserların cookie desteklemesi zorunlu değildir, hatta cookie destekleyen browserlar için cookie desteği istenirse kapatılabilmektedir.

Cookie işlemleri javax.servlet.http.Cookie isimli sınıfla temsil edilmektedir. Cookie aslında bir isim ve değer çiftidir. Cookie ilişkin isim ve değer standart olmamakla birlikte boşluk karakteri, [ ] ( ) = , " / ? @ : ; karakterleri isimlendirmede kullanılamaz. Genel olarak asci alpha numeric karakterlerinden oluşmak zorundadır.

Servlet ile HttpServletRequest sınıfının getCookies() isimli metodu ile ilgili browserın tüm cookie değerleri elde edilebilir. Bu metod browserda hiç cookie bulunmazsa null değerine geri döner. getCookies metodu cookie[] türünden bir dizi döndürür. Hiç değer bulunmazsa null döner.

Cookie oluşturma adımları;

  1. Cookie sınıfı türünden bir nesne yaratılır. Cookie sınıfının name(key) ve value parametreli bir başlangıç metodu ile bu işlem kolaylıkla yapılabilir. Bu parametreler String türünden olmalıdır.
  2. Cookie sınıfının setMaxAge() metodu ile cookie'nin ömrü belirlenir. setMaxAge metodunun parametresi int türden saniye parametresidir. Eğer setMaxAge ile cookie'nin ömrü belirlenmezse bu durumda ilgili session kapatıldığında cookie yok olur. Session kavramı ilerde ele alınacaktır.
  3. Yaratılan cookie HttpServletResponse sınıfının addCookie() metodu ile cevaba eklenip browser'a gönderilir. Cookie Map tarzı bir collection'dır, bir anahtara ilişkin tek bir değer tutulabilir.
  4. Cookie sınıfının getName ve getValue metotları ile sırasıyla bir cookie için isim ve değer elde edilebilir.

Sınıf Çalışması: Ürünlerden oluşan bir veri tabanı oluşturunuz collection olarak, bu veri tabanı içerisinde bir form üzerinden gelen isim arama bilgisi ile veri tabanı içerisindeki o ismin geçtiği tüm ürünleri karşı tarafa listeletiniz. Eğer boş bir arama yaparsa daha önceden cookie ile kaydedilmiş olan ürün isminden ürünü aratınız.

003-FindProductsWithCookie

Cookielerin Silinmesi

Cookielerin silinmesi oldukça basittir. Cookieleri silmek için, setMaxAge metoduna 0 değeri geçilerek, aynı cookie yeniden eklenmelidir.

Anahtar Not: Bir butona basıldığında bir iş yaptırmak için, onclick=" " elemanına işlem verilir. onclick elemanında submit yapabilmek içinse, aşağıdaki gibi bir bot yazılabilir. document.frmTest.submit() burada formun name elemanı frmTest olarak belirlenmiştir. Aşağıdaki programda delete cookie butonuna basıldığı zaman bir saklı kontrol ile (hidden control) bir değer iletilip, tüm cookielerin ömürleri "0"'a çekilerek silinmesi sağlanmıştır.

004-DeleteCookie

Servlet Session İşlemleri

Session client tarafından her bağlantıya verilen genel bir isimdir. Http protokolü durum tutmayan "stateless" bir protokol olduğundan server programa ne kadar clientın bağlandığını da tutmamaktadır. Buna göre servlet ile yapay olarak 3 şekilde Session oluşturulabilir.

  1. Cookie Yöntemi

Bu yönteme göre her bağlanan client'a bir cookie değeri atanır, bu cookie değeri tekrarsız verilirse o browser için o clienttan bağlantı takip edilmiş olur. Fakat bunun dezavantajları bulunmaktadır, çünkü her browser cookie desteklemeyebilir.

  1. Saklı Form Elemanı

Bu yönteme göre bir saklı form elemanı ile bir değer elde edilebilir, bu yöntem de çok elverişli değildir.

  1. URL Rewriting (yeniden yazımı)

Bu yöntemde ilgili URL sonuna başka bir yazı eklenerek oluşturulur. Bu yöntemde çok elverişli değildir, ilerde ele alınacaktır. Bu 3 yöntemde kendi içlerinde bir takım dezavantajları bulunmaktadır. Servlet için en iyi yöntem HttpSession yöntemini kullanmaktır.

HttpSession sınıfı ile herhangi bir andaki session HttpServletRequest sınıfının getSession metodu ile elde edilebilir. getSession metodu HttpSession türünden nesne vermektedir. getSession metodunun iki tane versiyonu vardır, getSession metodunun parametresiz versiyonu session yaratılmışsa aynı sessionı alır, yaratılmamışsa yeniden yaratır. getSession metodunun boolean parametreli versiyonuna true geçmekle eşdeğerdir. HttpSession sınıfının isNew isimli metodu ile o session in yeni bir session mı yoksa varolan bir session mı olduğunu test edebiliriz. HttpSession sınıfının getCreationTime ve getLastAccessTime metotları ile session'ın yaratılma zamanı ile son erişim zamanına ilişkin 1.1.1970 gece yarısı ile (epoch time) o ana kadar ki milisaniye sayısı elde edilebilir.

Anahtar Not:

java.util paketi içerisinde Date isimli bir sınıf bulunmaktadır. Bu sınıfın long türden milisaniye parametreli bir başlangıç metodu ile elde bulunan milisaniyeden bir Date nesnesi elde edilebilir. Şüphesiz programcı isterse Java 8 ile birlikte gelen yeni sınıfları da elindeki milisaniyeye uygun olacak metodları çağırarak kullanabilir.

Bir session'a ilişkin id bilgisi getId metodu ile elde edilebilmektedir. Ayrıca bir session içerisine setAttribute metodu ile bir isim ve değer çifti gömülebilir. İsme ilişkin değer getAttribute metodu ile elde edilebilir.

Buna göre örneğin bir session'ın kaç kez bağlandığına ilişkin bilgi aşağıdaki gibi bir programla yapılabilir.

005-SampleSession

Not: Calender ve GregorianCalender Sınıfı

Tarih zaman işlemlerine ilişkin kullanılan önemli 2 sınıf Calender ve GregorianCalender sınıflarıdır. Date sınıfı bir takım problemleri olduğundan gerekli bazı metotları "deprecated" durumdadır. Şüphesiz Java8 ile birlikte gelen API'ler bu sınıflardan çok daha iyi tasarlanmıştır. Fakat daha henüz yaygın olarak kullanılmadığından geçmişte çok fazla kod yazılmış olduğundan, Calender ve GregorianCalender hatta Date sınıfı Java programcısı açısından önemli bir sınıftır.

Calender sınıfı abstract bir sınıftır, GreCal sınıfı ise bu sınıftan türetilmiştir. Calender sınıfını Date sınıfından elde edebileceğimiz yararlı metotlar da bulunmaktadır. Programcı genel olarak GreCal türünden bir nesne yaratır ve bu nesneyi Calender referansına atayarak yoluna devam eder. GregCal sınıfının yararlı bir çok başlangıç metodu bulunmaktadır. GregCal sınıfının yıl, ay, gün parametreli başlangıç metodu ile bir nesne oluşturulabilir.

Calender sınıfının(dolayısıyla GregCal sınıfının) get metodu çeşitli sabitler ile tarihe ilişkin bilgileri alabilmektedir, örneğin Calender metoduna DAY_OF_MONTH isimli sabit geçirilerek o tarihe ilişkin gün bilgisi alınabilir. GregCal sınıfının default constructorı çağrıldığı zamanki anı elde etmektedir.

/*----------------------------------------------------------------------------------------------------------------------
    GregorianCalender sınıfı
----------------------------------------------------------------------------------------------------------------------*/
package org.csystem;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class App {
    public static void main(String[] args) 
    {
        GregorianCalendar gc = new GregorianCalendar();

        System.out.printf("%d.%d.%d%n", gc.get(Calendar.DAY_OF_MONTH), gc.get(Calendar.MONTH), gc.get(Calendar.YEAR));
    }
}

Calender sınıfının setTime metodu ile Date sınıfından bilgi elde edilebilir.


package org.csystem;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class App {
    public static void main(String[] args) 
    {
        GregorianCalendar gc = new GregorianCalendar(2015, 4, 5);

        gc.setTime(new Date());

        System.out.printf("%d.%d.%d%n", gc.get(Calendar.DAY_OF_MONTH), gc.get(Calendar.MONTH), gc.get(Calendar.YEAR));
        System.out.printf("%d:%d:%d%n", gc.get(Calendar.HOUR), gc.get(Calendar.MINUTE), gc.get(Calendar.SECOND));
    }
}

Sınıfın getTime metodu ile GregCal nesnesinden Date referansı elde edilebilir.

Calender sınıfının set metotları ile içsel bilgiler değiştirilebilmektedir.

Sınıf Çalışması:

Session kullanarak bir bağlantıya ilişkin Session Id ve IP değerini bir collection'da saklayınız, buna göre aynı IP'den gelen bağlantılar için en son bağlanma zamanını da sayfada gösteren bir uygulama yazınız.

006-SampleSessionInfoLog

Her bir Session'ın bir Time-Out süresi vardır. Bir Session'ın zamanı getMaxInactivyInternal metodu ile saniye cinsinden elde edilebilir. Session time-out zamanı setMaxInactiveInternal metodu ile değiştirilebilir. Session sınıfının invalidate metodu ile Session sonlandırılabilir. invalidate olmuş bir Session için artık nesne yaşamıyor demektir. invalidate edildikten sonra artık aynı metod için diğer metodlar kullanılmaz hale gelmiştir. Bir Session'a eklenmiş olan bir attribute remove attribute metodu ile eklenmiş olan bir değerde removeValue isimli bir metodla silinebilir.

HttpServletResponse Sınıfının Ayrıntıları

HttpServletResponse sınıfı server'a gelen isteklerin cevabını vermeye ilişkin bir sınıf olduğundan önemli bir sınıftır. Bilindiği gibi bu sınıfın addCookie metodu ile istekte bulunan browser için cookie eklemesi yapılabilir, getWriter metodu ile browser'a gönderilicek datalara ilişkin printWriter referansı elde edilebilir.

Sınıfın setIntHeader ve setHeader metotları ile client'a ilişkin gönderilen bilginin başlık kısmına veri yazılabilir. setHeader metodu ile String türden bir değer atanabilir. setIntHeader metodu ile header'a int türden bir takım değerler eklenebilir. Örneğin "refresh" başlık elemanına saniye cinsinden bir değer eklenerek gönderilen saniye değeri periyotta otomatik tazeleme işlemenin yani otomatik istekte bulunma işleminin gerçekleşmesi sağlanabilmektedir.

  • Anahtar NOT:

Sınıf Çalışması: Aşağıdaki gibi açıklanan sınıfı yazınız. -QuestionInfo

  • Bir soru, sorounun metni, 4 adet seçeneği ve doğru cevabından ve seviye bilgisinden oluşacaktır oluşacaktır. Bu sınıfa göre kullanıcı siteye bağlandığı zaman veri-tabanı içerisinden rastgele soru belirleyen, ve o Session içerisinde doğru cevapları, yanlış cevapları istatiksel olarak tutan ve soruları saniyede bir yineleyen bir Servlet programını yazınız.

HTTP Servlet Request Sınıfı

Bu sınıf gelen requeste ilişkin bir takım bilgileri içermektedir. Sınıfın bir çok yararlı metodu bulunmaktadır. Gelen requeste ilişkin başlık dosyasında, çeşitli attiributelara ilişkin bilgiler bulunmaktadır. Örneğin hostHeader elemanında, post ve port bilgileri bulunmaktadır.

  • Tüm header elemanları getHeaderNames isimli bir metot ile elde edilebilir. getHeaderNames metodu Enumeration<String> türünden bir referans döndürür.
  • Tüm header bilgileri şu şekilde dolaşılabilir: >
  • Header elemanları içerisinde bir takım elemanların desteklenebilmesi için ekstra bazı belirlemeler gerekmektedir.

Timer Sınıfı

Timer kavramı belirli bir periyotta tekrarlanan bir işin yapılması için kullanılmaktadır. Şüphesiz Timer yerine Thread kullanılabilir, fakat Timer thread'e göre hem daha hassas hem daha kolay bir kullanıma sahiptir.

  • Timer sınıfı aslında arka planda kendi Thread'ini yaratır.
  • Timer sınıfının başlangıç metotları ile Timer sınıfına ilişkin yaratılan Thread'inde bir takım belirlemeleri yapılabilir.
  • Timer sınıfının yarattığı Thread default olarak Non-Deamon threaddir. Fakat programcı isterse boolean parametreli başlangıç metotları ile tanımlanabilir.
  • Timer sınıfı ile yapılacak işler scheduleXXX metotları ile belirlenebilir. scheduleXXX metodları TimerTask abstract sınıfı türünden referans parametrelidir.
  • scheduleXxx metodlarının TimerTask parametrelerini yapılacak sınıfa ilişkin görevin referanslarıdır.
  • delay parametreleri metod çağrıldıktan ne kadar zaman sonra(milisaniye) çalışmaya başlıyacağını, period parametreleri ise ne kadarda bir bu görevin gerçekleştireleceğini belirten parametrelerdir.
  • Metodun Date türünden parametreleri Timer'ın belirlenen zamanda başlatılması için kullanılmaktadır.
  • period parametreli olmayan versiyonlar görevin bir kez yerine getirileceğini belirtir.
  • Timer sınıfının cancel metodu Timer'ı sonlandırmak için kullanılmaktadır.
  • Timer sınıfı görev bitse bile ilgili Thread'i sonlandırmaz, bunu programcının kendisi yapması gerekir. Örn:
package org.csystem;

import java.util.Timer;
import java.util.TimerTask;

public class App {
    public static void main(String[] args) 
    {
        final Timer t = new Timer("MyTimer");

        t.schedule(new TimerTask() {

            @Override
            public void run()
            {
                System.out.print(".");
                t.cancel();                
            }
        }, 2000);
    }
}

Sınıf Çalışması: Basit bir digital saat uygulamasını Timer sınıfını kullanarak yapınız.

package org.csystem;

import java.time.LocalTime;
import java.util.Timer;
import java.util.TimerTask;

public class App {
    public static void main\(String\[\] args\) 
    {
        final Timer t = new Timer\("MyTimer"\);


    t.schedule(new TimerTask() {

        @Override
        public void run()
        {
            LocalTime dt = LocalTime.now();

            System.out.printf("%02d:%02d:%02d\r", dt.getHour(), dt.getMinute(), dt.getSecond());
        }
    }, 0, 1000);
}

Sınıf Çalışması Saniyede bir [0, 100] aralığında sayı üreten bir Timer yazınız. Toplam üç kez asal sayı üretildiğinde sonlanan ve ekrana mesaj yazdıran programı yazınız.

package org.csystem;

import java.time.LocalTime;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class App {
    public static void main\(String\[\] args\) 
    {
        final Timer t = new Timer\("MyTimer"\);


    t.schedule(new TimerTask() {            
        private int m_count;
        private Random m_r = new Random();

        @Override
        public void run()
        {
            if (m_count == 3) {
                t.cancel();
                return;
            }

            int val = m_r.nextInt(101);

            if (val % 2 != 0)
                return;

            System.out.println(val);
            ++m_count;
        }
    }, 0, 1000);
}

Sınıf Çalışması İsim ve numarası tutulan kişilerden oluşan küçük bir veritabanı oluşturunuz, buna göre bir form içerisinden bir numara ile giriş yapılsın. Bu numaraya ilişkin kişi vertabanında varsa 2 saniyede çalışacak bir Timer ile veritabanından rastgele kişi seçilsin, giriş yapılan kişiye ilişkin numara seçilmişse Timer durdurulsun ve kişi bilgilendirilsin. Eğer 5 kez üretim sonunda o kişi gelmemişse üzgün bir şekilde, maalesef kazanamadınız mesajı verilsin.

Servlet ile Giriş(Hit) Sayısının Elde Edilmesi

Server program çalıştırıldığı zaman bir kez Servlet nesnesi yaratılmaktadır. Buna göre bir hit sayısı Servlet sınıfının bir veri elemanı olarak tutulup, her doGet ve doPost metodu çağrımında arttırılarak giriş sayısı elde edilebilir. Tam kalıcılığın sağlanması için programcının giriş sayısını kalıcı bir belleğe aktarması gerekebilir. Örn veritabanı, dosya.

Anahtar Not:

Taban sınıfta bildirilmiş olan bir metodu Override ederken erişim hakkı arttırılabilir fakat azaltılamaz, yani örneğin protected olarak bildirilmiş bir metod public olarak Override edilebilir, fakat bunun tersi mümkün değildir.

Sınıf Çalışması

Herhangi bir uygulama için toplam kaç kez bağlanıldığı ve yeni bir Session olarak kaç kez bağlanıldığı bilgilerini tutan ve talep durumunda istemciye ileten Servlet programını yazınız.

011-SessionGeneralHitCounts

Sınıf Çalışması Devam:

Sayaçları bir dosyada saklayan ve saniyede bir bu sayaçları dosyaya kaydeden ve server başlatıldığında tekrar dosyadan okuyan programı yazınız. (Veri elemanın senkranizasyonu önemsenmemektedir, bu durum ilerde ele alınacaktır.)

012-SessionGeneralHitCountsSaveFile

013-SessionGeneralHitCountsSaveFileTimer

Sınıf Çalışması

Üstteki uygulamayı değişiklik olmuşsa, değişiklik olanı dosyaya yazacak şekilde yeniden yazınız. RandomAccessFile kullanın.

014-SessionGeneralHitCountsRandomAccessFile

015-SessionGeneralHitCountsRandomAccessFile

Sayfa Yeniden Yönlendirilmesi(Page Redirection)

Bazı durumlarda bir sayfaya erişildiğinde o sayfanın başka bir sayfaya yönlendirilmesi gerekebilir. Bu işleme sayfa yeniden yönlendirilmesi denilmektedir. Bu işlemi yapabilmek için, HttpServletResponse sınıfının, sendRedirect metodu kulla. sendRedirect metodunun parametresi yönlendirilecek adresi temsil etmektedir.

016-PageRedirectionSenRedirect

Bu işlem ayrıca setStatus ve setHeader metotları ile de yapılabilmektedir.

017-RedirectionHeader

Sınıf Çalışması

Bir sayfaya bağlanıldığında karşı tarafa çok basit bir arama motoru sayfası gönderiniz, belirli bir süre arama işlemi tamamlanmazsa başka bir sayfaya yönlendirilerek işleminiz iptal edildi diye mesaj veren Servlet'i yazınız.

  • Anahtar Not : Uygulama içerisinde WebContent'in işletim sistemi üzerindeki tam path ifadesi session.getServletContext().getRealPath("sample.html"); metoduyla onun içinde bulunan herhangi bir dosyanın yada dizinin tam yol ifadesi şu şekilde alınabilir.

  • Bu Uygulamada bir form dinamik olarak yönlendirilmiştir ve bu form içerisinde "Refresh" isimli header'a bilgi yazılarak otomatik request'te bulunması sağlanmıştır.

Servlet Üzerinden Mail Atılması

Servlet üzerinden mail atılabilmesi için Java Mail API ve Java Activation Framework isimli JAR dosyalarının kullanılması gerekmektedir. Bu JAR dosyaları Oracle'ın resmi sitesinden indirilebilir. Bu dosyaların esas Jar isimleri, Java Mail API için mail.jar java app framework için JavaActivation.jar dosyalarıdır. JAF, Java Beans Activation Framework olarak da kullanılmaktadır.

Bir mail atılabilmesi için, mail gönderebilen bir servera ihtiyaç vardır. Bu hizmet gmail gibi global serverlardan elde edilebilir. Mail göndermek için şu adımlardan geçilmelidir.

019-SendEmail

  • Sisteme ilişkin propertylerden mail.smtp.host property'si ilgili server olarak verilmelidir.

  • MimeMessage sınıfı türünden bir nesne yaratılmalıdır. Bu sınıf başlangıç metodu içerisinde Session referansı beklemektedir.

  • Sınıfın setFrom, metodu ile mail'in hangi mail adresinden gideceği bilgisi InternetAdress sınıfı türünden verilmelidir.

  • Bir mail birden fazla kişiye gönderilebileceği için gönderilecek adresler (recipient) için bir Collection tutulmaktadır. Bu Collection nesnesine addRecipient metodu ile gönderilecek adresler eklenmelidir.

  • Sınıfın setSubject metodu ile mail'a ilişikin subject bilgisi eklenebilir.
  • Sınıfın setText metodu ile mesaja ilişkin text bilgileri eklenebilir.
  • Mail göndermek için Transport sınıfının send isimli metoduna MimeMessage nesnesi eklenerek gönderme işlemi tamamlanabilir.
  • javax.mail isimli paket içerisinde Session isimli sınıf yardımıyla elde edilen propertylere ilişkin bir session elde edilebilir. Bu Session yardımıyla setProperty ile verilmiş olan server biliniyor olur.
  • Activation.jar ve mail.jar dosyaları external library olarak eklenmeli ayrıca web-inf içerisindeki lib isimli dizin altındada bulunması gerekmektedir. Bu tarz jar dosyaları daha sonra açıklanacaktır.

  • Mail göndermek için bir server gerekmektedir. Bu serverın özellikle mail gönderme izninin bulunması gerekir.

Dosya Upload İşlemleri

Bilindiği gibi HTML içerisinde input elemanı file isimli tag ile dosya seçimine izin vermektedir. Bunun için form elemanın enctype özelliğinin multipart\/form-data olarak eklenmesi gerekmektedir. Dosya transferi için web.xml dosyasına şu bildirimlerin yazılması gerekir:

Ayrıca commons-fileupload.x.x.jar ve commons-io-x-x.jar isimli dosyaların bulunması gerekmektedir. Burada x.x versiyon numarasını temsil etmektedir.

web.xml'e yazılacak olan bildirimlerde max dosya boyutu da belirtilebilmektedir. web.xml üzerinde belirtilen dizinin bulunması gerekmektedir.

results matching ""

    No results matching ""