18.12.2010

Model View and Controller Deseni Nedir ?

Bu yazımda büyük projelerin bundan sonra olmazsa olmazı, ilk kullandığımızda bize çok karmaşık gelecek; ama zamanla kullandıkça ne kadar çok yararlı olduğunu anlayabileceğimiz bir desenden bahsedeceğim.



MVC

        Genellikle büyük çaplı projelerde kullanılan bir desendir  ve katmanlı yapıyı destekler. Classları görevlerine göre sınıflarına ayırır peki  bu bize ne sağlar ? Öncelikle projenin kontrolü kolaylaşır binlerce satır kodu yönetmek biraz daha kolay hale gelir, performans da sağlar, daha güvenli bir yapı oluşturur. 
MVC mimarisinden dolayı; iş mantalitesini ve görünümü birbirinden izole etmiş olur.




Model: 

Veritabanıyla yapılacak tüm veri alışverişini bu katman sağlamaktadır. Oluşturduğumuz veritabanı şeması sayesinde veritabanımızdaki tüm tablolar ve ilişki olduğu başka tablolar field'larına kadar Class yapısına dönüştürülür ve bir dosyada saklanır. Sadece Controller katmanı ile çalışır. Güncel hayattan örnek vermek gerekirse mesela biz  üşüdüğümüzü hissettik. Bu durumda biyolojide az çok görmüştük ne olur ? Öncelikle 5 duyu organımızdan birisi olan deri bunu algılar, sonra sinirlerle beyne gönderir ve  beyinde gelen bilgiler incelenip üşüdüğümüz kanısına varılır ve gerekli cevap yine sinirlerle duyu organımız olan deriye aktarılır ve titreme ya da benzeri bir üşüme tepkisi gösterilir. MVC modelinin bu gerçek hayattaki işlemeden hiçbir farkı bulunmamaktadır. Buradaki olayın mantalitesi dışarıdan alınan duyular içeride(beyinde) işlenir ve geriye bir sonuç(tepki) döner ve ne olup bittiğini dışarıdaki anlayamaz, böylece bizim işlemlerimiz izole edilmiş olunur;)  


Controller: 
Kullanıcı tarafından gelen ya da kullanıcıya döndürülecek verinin işlenmesi bu katmanda yapılır. 

View: 
Kullanıcı arayüzünün bulunduğu layerdır  görevi gösterilecek olan tepkiyi (veriyi) dışarıya sunmaktır.

Kullanıcı > View > Controller > Model > Controller > View > Kullanıcı

        MVC mimarisi ilk olarak JAVA tarafından geliştirilmiştir. Bu başarılı mimariyi Microsoft'da Framework 3.5 sürümü ile piyasaya sunmuştur. Yeni sürümleri hızla geliştirilmekte olup MVC2  piyasaya sürülmüştür ve diğer yeni sürümler için çalışmalar yapılmaktadır.

Büyük projelere katkıları:
- Kod karmaşıklığını çözmek en büyük amacı olduğundan; daha düzenli, daha anlaşılır ve daha sistematiktir.
- Kod karmaşıklığı çözüldüğü için performans artmaktadır.


Kısa bir örnekle açıklamak gerekirse;
Kullanıcı http://herhangibiradres/iletisim.xml  şeklinde bir request'te bulundu benim kullandığım MVC mimarisi bu isteği aldı frameworkde nereye gideceği yazılı olduğundan bu isteğin işlenmesi gereken Controller'a gitti bu da genellikle servletlarımızdır(Java classları) burada işlendi ve return olarak bize contact.jsp'yi gönderdi ve burada da gerekli bilgiler mevcut. Kullanıcının gönderdiği request http://herhangibiradres/iletisim.xml iken geriye dönen cevap http://herhangibiradres/contact.jsp ve kullanıcın görüntülemek istediği verilerde ekranda..

Burada servleta gelen istek, isteğin orada işlenmesi ve döndürdüğü response izole edilmektedir.
Büyük web projelerinin olmazsa olmazıdır:)

Teşekkürler..









12.12.2010

Aspect Oriented Programming'e Bakış

   Aspect Oriented Prog.(Bağlam Yönelimli Programlama) yeni nesil programlama mantığı olarak görülmektedir, yazılım dünyasının hergün gelişen ihtiyaçlarına cevap vermek için tasarlanmış yeni bir mantalite denilebilir.

  Önce fonksiyonları keşfeden yazılım dünyası birçok ihtiyacını bu fonksiyonlar sayesinde gidermiş; ama zamanla isteklerin çoğalması, daha kapsamlı kodlama yapılması ihtiyacı; Nesne Yönelimli programlamayı çıkarmıştır.

  Uzun süreden beri ihtiyaçlara cevap veren bu modelle, kodlamada modern dünya gibi düşünülüp, herşey nesne tabanlı modellenmiş ve fonksiyonel programlamaya göre daha kapsamlı ve daha esnek yazılımlar ortaya çıkmıştır.

  İlerleyen zamanla, OOP de ihtiyaçlara cevap veremez duruma gelmiştir, yakın zamana kadar çoğu yazılımın baştacı olan bu mantalite yerini yavaş yavaş AOP'ye bırakmaktadır. Peki nedir bu AOP ?

Bu yazımda biraz olsun bilgi vermeye çalışacağım :)


   Yazılım mühendisliğinde kullanılan bir programlama yaklaşımıdır. Türkçe literatüründe bağlam /cephe/ kesit /görünüm yönelimli programlama kelimelerinin hepsi farklı kaynaklarda kullanılmıştır.(Bağlam Yönelimli daha hoşuma gitti).  1990'lı yılların ortalarında özellikle JAVA ve nesne yönelimli programlama ile ivme kazanmış bir yaklaşımdır. Kısaca AOP’yi tanımlamak gerekirse bir program geliştirilmesi sırasında iki farklı yaklaşım görülmektedir.

 *Birinci tip yaklaşım fonksiyonel ve programın yapacağı işlere ait yaklaşımdır. Yani programı yazdığımızda ve program çalıştığında karşılayacağı ihtiyaçlar, yapacağı işlemler şeklindeki ve iş mantığı (business logic) olarak isimlendirilebilecek bakıştır. 
 *İkinci bakış ise teknik bakıştır (technicak concerns) yani programın çalıştığı ortam, işletim sistemi, veri tabanı gibi unsurlardır.
    Aop kısaca bu iki unsurun programa başlarken birbirinden ayrılmasını ve sonradan modüler olarak bu iki yapının birleştirilmesini sağlar. AOP sınıfların; metotlarını ve özelliklerini sadece hangi bakış açısıyla modelleneceğini belirler.
Kod yayılması (Code scattering):
Kestirme Fonksiyonellikler (Crosscutting Functionalities)
Yukarıdaki bu iki durumda klasik OOP yaklaşımının AOP yaklaşımına göre geri olduğu söylenebilir. Öncelikle Fonksiyonel programlama ortaya çıkar ve bunun zamanla yeterli olmadığı anlaşılır. İlerleyen zamanda bu fonksiyonelliğe nesneye yönelim eklenir OOP ve Nesneye yönelimli programlamanında yeterli olmadığı görülünce son model olarak söylenen durum AOP'dir. AOP bir adım daha öteye giderek  -->  Noktakesim(pointcut),  Birleşme noktası(joinpoint)  &&  tavsiye(advise) eklentilerinde bulunuyor.


Şimdilik kısa bir giriş yaptık, ilerleyen zamanlarda bu konuyla sık ilgileneceğiz ;)



Teşekkürler..

10.12.2010

Apache Tomcat'e Detaylı Bakış

Apache Tomcat
               Javayla web uygulaması geliştirmek isteyenlerin en çok kullandığı client sunucusu diyebiliriz. Developerı biraz uğraştırır; ama bu uğraşmaya da alıştıktan sonra zamanla sevilir. J
Yazdığımız tüm kodlar buraya gider ve burada derlenir bize browserda çıktısını verir Tomcat. Bir açık kaynak kodlu yazılım topluluğu olan Apache Yazılım Topluluğu’nun  geliştirmiş bir servlet  container /servlet barındırıcıdır.
Yapısına bakmak gerekirse 3 ana bileşeni bulunmaktadır(4.X sürümlerinin  4.1.31’nden bahsediyorum):
            Coyote :
   Tomcat’in Http bağdaştırıcısı, kullanıcıdan ya da Http proxyden (TCP portlarından) gelen istekleri ayrıştırarak Catalina(Java’lar buraya yönlendirilecektir.) ve Jasper’e(Jsp’ler buraya) yönlendirir. Aynı şekilde Catalina ve Jasper’den gelen bilgileri de görüntüleyebileceği sayfalar halinde kullanıcıya gönderir.(Kullanıcı ile işlem yapan kısım arasında ara katman denilebilir)                Coyote, Tomcat’in dönüştürme ve iletişim işlerini yapan front end uygulama kısmıdır.
            Jasper:
   JSP motorudur, JSP sayfalarını alır, ayrıştırır ve derleyebileceği şekillerde Catalina’ya gönderir.(Şöyleki; JSP’deki java classlarını servletleri gönderir, html gibi java classı olmayan bileşenleri kendisi yorumlayabilir).  Çalışma zamanında (runtime) Jasper eğer JSP üzerinde bir değişiklik algılarsa bunu alır ve yeniden derler.
Catalina:
   Tomcat’in Servlet Container’ı yani özü ,Tomcat servlet içeren sayfalar için en iyi servlet containerdır ve bu işi de Catalina yapar.(Esas işi yapan kısım denilebilir, java classlarını burası anlar, ayrıştırır ve feedback olarak diğer birimlere gönderir).,

Aşağıdaki resimde yukarıda bahsedilenler ve Tomcat'in iç yapısı gösterilmektedir,



Teşekkürler ;)

8.12.2010

Hibernate Nedir ?

   Öncelikle bu konu hakkında pek bilginiz yoksa, bu bahsedeceğimiz Hibernate Ne değildir sorusuna cevap verelim sonra gerekli açıklamalara geçelim.
*Windows'un kapatma seçeneği olan bilgisayarı kapatırken ram'deki tüm veriyi harddiske atan seçenek gelebilir aklınıza, bu da güzel bir seçenektir bilgisayarımız hızlı açılır farkedilir biçimde ama bu hibernate'den bahsetmeyeceğim..( not: Veriler hdde kayıtlı olduğundan, notebookun pilinin de şarjının da bitmesi durumunda dahi, verilerin kaybolmamasını sağlayan güzel özellik:)
*Latince kökenli olan hibernatusi yani kış uykusuna yatmak da değil bu bahsedeceğimiz Hibernate.
~ ~ ~ ~
   Bir ORM aracı olan (Object Relational Mapping), çok kullanışlı, transaction yönetimini kendisi yapan orta katman bir framework diyebiliriz. Bizim veritabanımız var ve biz buna ulaşmak istiyoruz, database ile aramızda
bir framework olan Hibernate bize birçok kolaylıklar sağlamaktadır, hız bakımından artısı yok denilebilir ama kod yazan bir Java'cı için kodları azaltmak demektir Hibernate:)

-ORM, nesne odaklı (object oriented) dillerdeki nesnelerin, ilişkisel veritabanlarındaki (relational databases) kayıtlara nasıl karşılık geldiğini yürüten bir teknolojidir kısaca.
-Hibernate gibi ORM araçlarıyla, bir nesneyi veritabanına kaydetmek, yeni halini güncellemek ve sorgulama yapmak düz SQL bağlantılarına göre çok kolaydır ve bu zamana kadar yazmış olduğumuz klasik sql sorgularını kullanmıyoruz.

Örneğin, JDBC ile veritabanına bir kayıt eklemek için aşağıdakine benzer bir kod yazılır:
stmt.executeUpdate( "INSERT INTO KAHVE VALUES ('Turkish', 101, 9.99, 0, 0)");

Burada, "KAHVE" tablosuna bir kayıt eklenmekte, böyle bir işlemi Hibernate ile yapmak için:
session.saveOrUpdate(kahve);
kahve, bildiğimiz düz bir java nesnesidir (POJO - Plain Old Java Object).

-Hibernate gibi ORM araçlarının en önemli faydası, kod yazmayı kısaltmak veya kolaylaştırmanın yanında, yazılım bakımını kolaylaştırmasıdır.  Veritabanı temelli uygulamalarda, kodun 1/3´ü veritabaný erişimine yöneliktir diyebiliriz:)

-Veritabanındaki bir kolonunun tipinin değişmesi, yeni bir kolon eklenmesi gibi değişiklikler, bütün veri erişim kodunu tekrar gözden geçirmeyi gerektirir. Hibernate ile bu gözden geçirmeden çok yüksek oranda tasarruf edilebilir.

- Hibernate kullanılan yazılımlarda, veritabanındaki değişikliklerde yapılması gereken sadece nesnelerle tabloların birbirine nasıl eşleştirildiğinin (mapping) gözden geçirilmesidir.(Mapping iki türlü olmaktadır, yeni çıkan mapping yöntemi olan annotationdan sonraki yazılarda bahsedeceğim inş.)

**Hibernate ile alakalı bazı bilgiler vermeye çalıştım, kullanmıyorsanız ve bilginiz yoksa zaman kaybetmeden bakın derim ;)

Teşekkürler..

JSP'nin Yorumlanmasına özet Bakış

   Jsp'de sadece Html kodları arasına Java kodları yazarak programming yazmak zordur. Bu zorluktan mütevellit, Jsp bize Java kod blokları yazmayı da sağlar.

Bu işlemi <%  //INSERT CODE    %> ile yaparız ve bunlara scriptlet denmektedir.

Eğer scriplets'den html kodu üretmeyi istiyorsak bunu out ile yapabilirz.
out.println(String.valueof( date )); //Example

Yukarıdaki scriplets'de bulmuş olduğumuz date variables'ını burada kullanabiliyoruz.
                                        
  ~ ~ ~ ~ ~ ~


                                    Mixing Scriplets and Html
<TABLE>
<%

int n = 5;

for( int i=0; i<n; i++)
{

%>

<TR>

<TD>Number=<%= i+1 %></TD>

</TR>

<% } %>

</TABLE>

   ~ ~ ~ ~ ~ ~
*Aynı zamanda kütüphanelerin import edilmesi durumu da farklıdır.
Normal Java'da import java.util.* şeklinde import edilirken; Jsp'de <%@page contentType="text/html; charset=cp1254" pageEncoding="cp1254" import="com.mtb.util.*"%>  şeklinde edilmektedir.

Jsp direktifleri <%@ ile başlar ve yukarıda da gördüğümüz gibi bu direktif bir "page direktifidir".



    ~ ~ ~ ~ ~ ~

<%@ include file="somePageOfText.text" %>  -->Bu .jsp sayfasına herhangi birşey ekleme ve çıkarma gibidir. Bir dosyası buraya yapıştırıp içeriği generate etmeden önce,  merge eder..


<jsp:include page="loginKontrol.jsp"/>-->Farklı servletlar çalıştığı zaman bu action kullanılabilir.

<%@include file="herhangibirsey.herhangibiruzanti" %>
Yukarıda ise eklenme direktifi mevcut olmakla birlikte, eklenen herhangi uzantılı dosyanın tek başına çalışması beklenmez. Bu direktifdir sadece!                                                                                                                                              

                   <<<  JSP DECLARATIONS  >>>
Bu Deklarasyon içerisine degisken ve metot ekleyebiliriz.!

<%@ page import="java.util.*" %>
<HTML>
<BODY>
<%!
    Date theDate = new Date();
    Date getDate()
    {
        System.out.println( "In getDate() method" );
        return theDate;
    }
%>
Hello!  The time is now <%= getDate() %>
</BODY>
</HTML>

*Declaration'un scriplets'den en mühim farkı load aşamasında bir değer alır ve daha sonra biz ne kadar reload etsek de bu değer değişmez. (Java'da ki final anahtar kelimesi gibi)

Halbuki scriplets'de olaylar bu şekilde değildir!


<td>Going to include solbar Buarad!.jsp...<BR>
<jsp:include page="incLeftBar.jsp"/></td>

Bu kodu istediğim sayfaya ekleyerek, bu satır içerisinde incleftbar.jsp'yi görebilirim..
yani incLeftBar.jsp sayfasını buraya include etmiş oluyorum.

*Şimdi de -> <td><jsp:forward page="index.jsp"/></td> Buradaki forward ne işe yarar ona bakmamız lazım,

Açıklama: Bu <jsp:forward page="index.jsp"/> ise hangi sayfada yazılırsa bu sayfayı index.jsp'e forward etmektedir.





JSP'DE SESSION TUTMA VE TUTULAN SESSION'LARIN GÖSTERİLMESİ



<HTML>
<BODY>
<FORM METHOD=POST ACTION="SaveName.jsp">
What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20>
<P><INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>
--->Buradan username SaveName.jsp'e gider..
--->SaveName.jsp'de aşağıdaki şekilde tutulur,

<%
   String name = request.getParameter( "username" );
   session.setAttribute( "theName", name );
%>


Mesela bu sayfadan başka bir sayfaya yönlendirme yapıldı ve tutulan sessions nasıl retrieved olacak onu görelim

--->Yönlendirilenpage.jsp'de sessionları şu şekilde okuyabiliriz;
<HTML>
<BODY>
Hello, <%= session.getAttribute( "theName" ) %>
</BODY>
</HTML>

Jsp'yi özet bir şekilde, çok detaya girmeden açıklamaya çalıştım,

Teşekkürler.