IntelliJ IDEA 11.1

28 Mart 2012 itibariyle IntelliJ IDEA IDE’sinin son sürümü 11.1 piyasaya sürüldü.

Android Lint, Hibernate 4.0 gibi iddialı desteklerle karşımıza çıkan IntelliJ IDEA’yı denemenizi tavsiye ederim.

Yaklaşık 180 MB olan son sürümü aşağıdaki bağlantı yardımıyla indirebilirsiniz.

[box type=”download”] IntelliJ IDEA 11.1[/box]

Java kodu içerisinde SQL, HTML içerisinde JavaScript kodunu tamamlayarak programcıya güzel bir kolaylık sağlıyor.

IDE hakkında daha fazla bilgiye ulaşmak ve yenilikler hakkında detaylı bilgi edinmek isterseniz şu adresi ziyaret edebilirsiniz.

OCE, Oracle Certified Expert Sınavı

Oracle, Java Enterprice Edition 6 için Web Component Developer sınavının güncellendiğini açıkladı. Eski kodu 1z0-894 olan uzman sınavının yerine 1z0-899 kod numarası ile yeni bir sınav getirildiğini açıkladı.

Sınavın süresi 120 dakika ve 57 tane soru var. Bu soruların %61’ine doğru yanıt verirseniz web dalında uzman ünvanına sahip olabiliyorsunuz. Bu da 35 soruya tekabül ediyor.

Sınav içeriğine bakmak isterseniz konu başlıklarını bulabileceğiniz şu sayfayı inceleyebilirsiniz.

Sınavın ücreti 202 pound ya da 300$. Pearson VUE sınav merkezlerinden birinde sınava girebilirsiniz.

Henüz Oracle’ın resmi sitesinde bu sınav için alıştırma soruları bulunmuyor. Ayrıca Java EE 6 Web Component Developer Expert sınavına girebilmek için OCP şartı aranıyor.

Web Servisleri, SOAP, UDDI, WSDL Nedir?

Web Servisleri, HTTP protokolü ile XML gönderip alarak iki uzak cihaz arasındaki iletişimi sağlayan bir haberleşme yöntemidir.

XML olması sayesinde değişik platformlar ve programlama dilleri arasında haberleşme sağlanabilir.

Web’in yaygınlaşmasından sonra farklı platformarın birbirleriyle haberleşme ihtiyacı artmıştır. Bunun için web uygulamaları geliştirilmiştir. Web sevisleri ile de web uygulamalarımız kendi fonksiyonalitelerini dış dünya ile paylaşabilir hale gelmiştir.

Web servislerinde veriler XML olarak tutulur ve SOAP kullanılarak bir yerden diğerine taşınır. Web servislerinin yapısı itibariyle farklı serverlardaki farklı platformlarda çalışan uygulamalar birbirleri ile haberleşebilirler.

Web Servislerinin 2 farklı kullanım şekli vardır :

  1. Uygulamaların sıkça ihtiyaç duydukları işler vardır. Bunları sürekli tekrar tekrar yapmaktansa servisler tarafından yapılıp uygulamalardan çağrılırlar. Örneğin hava durumunu anlık olarak öğrenen program gibi.
  2. Başka platformda çalışan bir uygulama ile haberleşilerek veri alış verişinde bulunulur.

Web Servisleri, Service Orianted Architecture (SOA)’nın implement edilmiş halidir.

SOA’da iki farklı yazılım birbirleriyle haberleşir. Bu yazılımlardan bir tanesi istemci bir tanesi ise sunucudur. İstemci sunucuya istekte bulunur, sunucu da istemciye cevabı döner.

Sunucular servis açıklamalarını özel bir dizinde tutarlar. İstemciler ise bu dizine sorgu çekerek aradıkları servis, servis sağlayıcısında var mı diye kontrol ederler.

Web Servis platformunda kullanılan standartlar şunlardır :

1-    SOAP : Simple Object Access Protokol

2-   UDDI : Universal Description, Discovery and Integration

3-   WSDL : Web Services Discription Language

SOAP :

HTTP üzerinden uygulamaların bilgi alış verişinin gerçekleşmesini sağlayan XML tabanlı bir protokoldür. Yani web servislere erişmek için kullanılan protokoldür diyebiliriz.

UDDI :

UDDI, web servislerini tanımlamak, interneti kullanarak iş servislerinin hangilerinin kullanılabilir olduğunun listelenmesi için kullanılan platform bağımsız bir frameworktür. Web servisleri hakkındaki bilgilerin depolandığı bir dizindir. İstemci ve sunucu ile SOAP ile haberleşir.

WSDL :

XML formatında yazılmış Web Service’lerin yerlerini, ne iş yaptıklarını yani metotlarını belirleyen bir dildir. 2007 yılında standart hale gelmiştir. 4 ana elemandan oluşur.

  • <types> : Web servis tarafından kullanılan veri tipleri belirlenir.
  • <message> : Web servis tarafından kullanılan mesajlar yazılır.
  • <portType> : Web servis tarafından gerçekleştirilen işlemler yazılır.
  • <binding> : Web servis tarafından kullanılan haberleşme protokolleri yazılır.

Ana Yapı

[codesyntax lang=”xml” lines=”no”]

<definitions>

	<types>
	  tip açıklamaları ........
	</types>

	<message>
	  mesaj açıklamaları ........
	</message>

	<portType>
	  port açıklamaları .......
	</portType>

	<binding>
	  binding açıklamaları .......
	</binding>

</definitions>

[/codesyntax]

Bir WSDL dokümanı bunların dışında başka elemanlar da içerebilir. Örneğin bir dokümanda birden fazla web servis tanımı yapılabilir.

WSDL İşlem Türleri :

En çok kullanılan yöntem request-response yöntemi olsa da  WSDL’de 4 çeşit işlem tipi vardır.

Tip Açıklama
One-way İşlem istek mesajını gönderir fakat cevap dönmez.
Request-response İşlem istek mesajını gönderir ve cevap döner.
Solicit-response İşlem istek mesajını gönderir ve cevap için bekler.
Notification İşlem istek mesajını gönderir fakat cevap için beklemez.

Veri Saklama Alanları

Uygulama geliştirirken verilerimizi bir şekilde saklamamız gerekir. Saklama süremize ve verilerimizin boyutuna göre hafızanın bazı bölümlerini ya da sabit diski kullanırız.

1-      Yığın : (Stack) RAM (Random Access Memory) yani hafıza içerisinde bir bölgedir. Yığında  nesnelerin referansları tutulur. Java derleyicisi programı oluşturmadan önce yığın üzerinde oluşturulacak olan verilerin boyutlarını ve ömürlerini bilmek zorundadır. Yığın, dinamik değişkenleri saklamanın yanında, metotların geri dönüş adresini saklamak, yerel değişkenleri depolamak ve metotlara parametre göndermek için de kullanılır.
Yığın bellek alanı, program çalışmaya başladığı anda belirlenir ve daha sonra bu alanın boyutu değiştirilemez. Bu alan, işletim sistemi tarafından genellikle kısıtlı şekilde belirlenir. Bu sebeple yığın üzerindeki işlemlerde hafıza birimi taşması sorunu yaşanabilir (stack overflow).

2-      Yığma bellek : (Heap) Yığma bellek alanı daha geniş alanlı ve kalıcı bir alandır. Genellikle ne kadar yer kaplayacağı belli olmayan nesnelerin geçici olarak saklanması için kullanılır. Programcı new saklı kelimesiyle oluşturduğu tüm nesneleri bu alanda saklar. Yığma bellek alanının okunması veya yazması yığın alanı kadar hızlı değildir.

3-      Statik Alan : Bu alan da bellek üzerinde bulunur. Statik alanda yer alan veriler, programın çalışması süresince burada saklanırlar. Nesne hafızaya yüklendiği anda statik tanımlanan değişken ve metotlar yaratılırlar.

4-      Programın kod alanı : Verileri hafızada sakladığımız alanlardan bahsettik. Ancak bu verileri işlemciye gönderebilmek için makine kodunun göndereceği komutların da bir yerlerde saklanması gerekir. İşte Code Segment denilen kod alanında da işlemciye gönderilecek komutlar saklanır.

5-      Sabit disk : Bazı durumlarda uygulamaların içerisinde oluşturduğumuz nesnelerin, uygulama sonlandıktan sonra bile varlıklarını sürdürmelerini isteriz. Bu gibi durumlarda sabik disk dediğimiz fiziksel alanlarda veriler depolanır.

Çöp Toplayıcısı (Garbage Collector)

Eskiden hafıza yönetimi tamamen programcının elindeydi. Hafızadan yer ayırma işlemleri, belleğin kullanıldıktan sonra serbest bırakılması gibi işlerin yapılması gerekiyordu. Nesneye yönelik programlama dilleriyle beraber çöp toplama mekanizmaları geliştirildi. Bu sayede referanslarını kaybeden, kullanılmayan tüm nesnelerin hafızadan silinmesi Garbage Collector denilen yapı sayesinde ele alınıyor. Yazılımcı sadece kodunu yazıyor ve silinmesi gereken nesnelerle ilgilenmiyor. Java’nın her versiyonu ile beraber GC mekanizmasının algoritması da geliştiriliyor. Nesnelerin hafızadan ne zaman silineceğini programcı bilmiyor.

gc() metodu :

Çöp toplama mekanizmasını tetiklemek mümkündür. System sınıfındaki gc() metodu çağrıldığında çöp toplayıcısına “hadi bakalım çalış” demiş oluruz. Ancak bizim bunu dememiz çalışacağı anlamına gelmez. Hafıza aşırı yüklendiğinde ya da belli süre sonunda değil, tamamen kendi algoritmasına göre çalışır.

finalize() metodu :

Temizlik işlemleri başladığında çöp toplayıcısı, silinecek nesne içerisinde finalize() adında özel bir metot arar. Nesne hafızadan silinmeden hemen önce bu metot çalıştırılır. Dolayısıyla kullandığımız nesne hafızadan silinmeden hemen önce yapılmasını istediğimiz işler varsa, bu metodu tanımlayarak içerisinde yapmalıyız. Metodun tanımı aşağıdaki gibidir.

[codesyntax lang=”java” lines=”no”]

@Override
protected void finalize() throws Throwable {
	// yapılacak işler
	super.finalize();
}

[/codesyntax]

finalize() metodu bir defa, nesne hafızadan silinirken çalıştırılır.

OCP, Java SE 7 Programmer Sertifikası

Oracle Java SE 7 için sertifika sınavını duyurdu.

Eğer daha önceden OCA, SCJP sertifikalarından bir tanesini almışsanız Java SE 7 için upgrade sınavına girebilirsiniz. Daha önceden sertifikanız yoksa OCP için ön koşul olan OCA sınavına girmeniz gerekiyor.

Sınava Pearson VUE test merkezlerinden girebilirsiniz.

Java SE 7 Programmer II sınavı detayları için tıklayın.

Java SE 7 Programmer Update sınavı detayları için tıklayın.

Sınav fiyatları için detaylı bilgiye şu adresten ulaşabilirsiniz.

Cookie API

Cookie’ler web sunucularının istemci tarafında bilgi depolamalarını sağlarlar. Veriler tarayıcılarda anahtar – değer (key-value) şeklinde saklanır.

 

  • Cookie’ler sunucudan response içerisinde gönderilirler.
  • İstemci bilgisayarlarında saklanırlar.
  • Cookie’ler web sunucusunun domain ismine atanmış bir bölümde saklanırlar.
  • O domain için her istekte cookie’ler de gönderilirler.
  • Tarayıcı bazında ve yaşam döngüleri boyunca geçerlidirler.
  • JavaScript gibi scripting dilleriyle erişilemezler.

 

Java’da Cookie adında bir sınıf vardır. İstemci tarafında Cookie saklamak için önce bu sınıfın bir instance’ı yaratılır. Sonra HttpServletResponse nesnesi üzerinden addCookie() metodu çağrılır ve parametre olarak bir isim ve nesnenin değeri gönderilir.

Bir Servlet sınıfında yazılması gereken kod aşağıdaki gibidir.

 [codesyntax lang=”java” lines=”no”]

String isim = request.getParameter("kullaniciAdi");
Cookie c = new Cookie("bnmIsmim", isim);
response.addCookie(c);

[/codesyntax]

Daha sonra başka bir sınıftan ya da sayfadan erişmek istediğimizde bu sefer HttpServletRequest nesnesi üzerinden getCookies() metodu çağrılır. Bu bize son kullanıcıdaki tüm cookie’leri döndürür. Sonra bir döngü ile her bir Cookie nesnesine erişilebilir.

 [codesyntax lang=”java” lines=”no”]

Cookie[] cookies = request.getCookies();
for(int i=0; i < cookies.length; i++){
	if(cookies[i].getName().equals("bnmIsmim")){
		isim = cookies[i].getValue();
	}
}

[/codesyntax]

Request üzerinden getSession() metodu çağrıldığında Web Container, Session nesnesini bulabilmek için jSessionId ismindeki cookie’yi arar. Bir web projesi tasarladığınızda isteği ilk gönderdiğinizde adres satırına dikkat ederseniz sonunda ;jsessionId=1234 şeklinde bir parametre görürsünüz. İşte gönderilen bu parametreyi sunucu saklar. Aynı kullanıcıdan bir istek daha gönderildiğinde sunucu kendi sakladığı id ile gelen id’yi karşılaştırır. Aynı ise aynı kullanıcıdan geldiğini anlar. İşte session da her kullanıcı için bu şekilde oluşturulur. Son kullanıcı diğer yaptığı isteklerde bu parametreyi görmez. Fakat id isteğin header bilgisi içinde gönderilir.

Web Uygulamalarında Scope Kavramı

HTTP stateless bir protokoldür. Yani tarayıcı üzerinden gönderilen her istek birbirinden bağımsızdır. Bu da sunucular için iyi bir ölçeklenebilirlik sağlar. Aynı tarayıcıdan bile olsa isteklerin birbirlerinden haberleri yoktur. Bu yöntem, avantajlarının yanında bazı web uygulamaları için dezavantaja dönüşebilir. Örneğin bir alış veriş sitesinde gezerken beğendiğimiz ürünleri sepete atmak isteriz. Fakat sunucunun, isteklerin aynı kullanıcıdan geldiğini bilmesi gerekir.

Java EE ortamındaki web sunucuları, her son kullanıcının kendi verisini saklayabilmesi için mekanizmalar geliştirmiştir. HttpSession API bu mekanizmalardan birisidir.

Aslında son kullanıcının verileri saklayabildiği 4 tane ortam vardır.

1-      page scope

2-      request scope

3-      session scope

4-      application scope

Herbir ortamın verileri set edecek setAttribute() ve set edilen nesneleri geri alacak getAttribute() metotları vardır.

1-      page scope : Adından da anlaşılabileceği gibi page scope sayfa değişkenlerini saklayabildiğimiz  bir alandır. Örneğin Servlet sınıflarında yaratılan lokal değişkenler ya da bir JSP sayfasındaki hidden input değerleri bu alanda tutulurlar.

2-      request scope : Yapılan istek bazında veri saklamak için kullanılan bir alandır. Örneğin veri tabanına sorgu çekip gelen kayıtları web sayfasında gösteren bir uygulamamız olsun. Kayıtları alarak sayfaya yönlendirme yapan bir Servlet sınıfı düşünün. Veri tabanı işlemleri tamamlandıktan sonra gelen cevabı sayfaya yönlendirmeden önce kayıtların da yönlendirilecek sayfaya bir şekilde aktarılması gerekir. Bunun için request scope kullanılabilir. HttpServletRequest tipindeki nesne üzerinden setAttribute() – getAttribute() metotları kullanılarak nesneler bu alanda tutulabilir.

3-      session scope : Bir kullanıcının yapmış olduğu tüm istekler için geçerli olan bir ortamdır. Yazının başında belirttiğim HttpSession nesnesi sayesinde session scope kullanılabilir. HttpSession nesnesine, HttpServletRequest nesnesi üzerinden getSession() metodunu çağırarak erişebiliriz.

getSession() metodu boolean tipte parametre alır. true gönderildiğinde eğer kullanıcı için daha önceden bir session nesnesi oluşturulmuşsa o nesne döner. Oluşturulmamışsa yenisi yaratılarak döndürülür. false gönderildiğinde eğer kullanıcı için daha önceden bir session nesnesi oluşturulmuşsa o nesne döner. Oluşturulmamışsa null döndürülür. Yenisi yaratılmaz. Daha çok true parametre gönderildiğinden bu metot overload edilmiş ve parametre almayan çeşidi yazılmıştır. Parametre almayan getSession() metodu true parametre alan ile aynı işi yapar.

Session ‘da bir nesne saklamak için setAttribute() metodu kullanılır. Daha sonra session’da saklanan nesneye getAttribute() metodu ile erişilebilir.

Örneğin yazdığımız web uygulamasında kullanıcının giriş yaptığı, kullanıcı adı ve parola soran bir ekranımız var. Kullanıcı sisteme bir defa girdikten sonra erişebildiği her sayfada ismini yazdırmak istiyoruz. Giriş yapıldığı anda kullanıcı bilgilerini session scope’da saklarsak daha sonra erişmek istediğimiz sayfalardan getAttribute() metodu ile erişebiliriz. Uygulamamız sonlandıktan sonra ya da kullanıcı sistemden çıkış yaptığında session nesnesini kapatmak gerekir. Bunun için invalidate() metodu kullanılır. Bir session nesnesi invalidate() edildikten sonra içerisinde saklanan tüm nesneler referanslarını kaybeder.

Session kapatma işlemleri birkaç farklı şekilde yapılabilir.

Örneğin invalidate() metodunu çağırmak bu yöntemlerden biridir.

Bir diğeri ise session üzerinden setMaxInactiveInterval(int) metodunu çağırmaktır. Herhangi bir Servlet sınıfında session nesnesine erişerek bu metodu çağırırken parametre olarak saniye cinsinden int tipinde değer gönderilir. Gönderilen değer süresince istek gelmezse session invalidate() edilir.

Bunun dışında uygulamanın konfig dosyasına session timeout süresi dakika cinsinden verilerek set edilebilir. Aynı şekilde konfig dosyasında (web.xml) verilen bu süre zarfında istek gönderilmediğinde session invalidate edilir.

[codesyntax lang=”java” lines=”no”]

<session-config>
      <session-timeout>30</session-timeout>
</session-config>

[/codesyntax]

4-      application scope : Tüm uygulama bazında yaratılan bir geçerlilik bölgesidir. Bu bölgeye tüm Servlet sınıfları istedikleri zaman erişebilir. Application Scope’a set edilmek istenen değişkenler uygulamanın konfig dosyasında tanımlanabilir. Servlet sınıflarından da ServletContext nesnesi üzerinden bu bölgedeki değişkenlere erişilebilir.

[codesyntax lang=”java” lines=”no”]

<context-param>
    <param-name>isim</param-name>
    <param-value>erkin</param-value>
</context-param>
<context-param>
    <param-name>parola</param-name>
    <param-value>denemeParola</param-value>
</context-param>

[/codesyntax]

Geçerlilik bölgeleri ile işlemler yaparken ihtiyaçlar iyi bir şekilde analiz edilmelidir. Sunucunun hafızasını güzel kullanmak adına gerekmedikçe session oluşturulmamalı, uygulama ortamında değişkenler saklanmamalıdır.

NetBeans 7.1.1

Glassfish sunucusunun son sürümünün piyasaya çıkmasından kısa bir süre sonra NetBeans de 7.1.1 versiyonunu piyasaya çıkardı.

NetBeans 7.1.1 ile Glassfish 3.1.2 desteğinin yanında küçük performans geliştirmeleri yapıldı. En son patch’lerin entegrasyonu sağlandı ve bazı bug’lar giderildi.

Giderilen bug listesi için tıklayın.