Arşivler: Ağustos 2009

ASP.NET AJAX’A GENEL BAKIŞ:

Yorum Yapılmamış

26/08/2009 at 01:26Kategori:.Net

Asp.net ajax çok duyduğum ama bir türlü çalışmaya zaman bulamadığım bir konu olmuştu. Sebebi ise benim mükemmeliyetçi anlayışımdan kaynaklanıyor biraz. Bir konuya çalışmam için o konu hakkındaki kitapların ,makalelerin, frameworkler bulunmuş ve eğer gerekliyse IDEler in indirilmiş olması gerekir  Ama bu kez yeni başladığım asp.net kitabında (sadece 1800 sayfacık J) Ajax konusunun 250 sayfada anlatılması , konuyu küçümsememe yol açtı ve başladım okumaya. (20 yıllık hackerlar işi gücü bıraktılar Ajax yazıyorlar sözü konuyu fazla önemsememe sebep oldu herhalde) Şimdi kısa yoldan sitenizi nasıl AJAX kullanan bir site haline getirebilirsiniz ve gerçekten de profesyonel şeyler ortaya çıkarırsınız konusunda öğrendiklerimi paylaşacağım.

AJAX nedir?

Normalde asp.net sayfalarımızda sayfa ilk yüklendiğinde sayfamız tamamen serverdan isteniyor ve server bize sayfaları  hmtl,javascript karışımı bir şekilde gönderiyordu. Sitemize bir server kontrolü yerleştirdiğimizde ve bu server kontrolünün servera istekte bulunmasıyla sayfamızda bazı veriler servera gönderiliyor ve verilere göre sayfamız  kullanıcının tarayıcısında yorumlanacak şekilde tekrar gönderiliyordu. Bu işleme Post-Back deniyordu. Post-Back işleminde bir butonun ya da herhangi server kontrolünün post back işlemini tetiklemesi sayfamızın tamamen yenilenmesine yol açıyordu. Özellikle form sayfalarında her kontrolün yeni verilere ihtiyaç duymasıyla sayfa post-back işlemlerinden dolayı yenileme işlemini çok sık yapıyor ve bu da can sıkıcı bir durum olarak görünüyordu. AJAX ile bu durum değişti çünkü klasik request-response yapısı yine çalışıyordu fakat dili oluşturanlar serverlardaki frameworklere ve tarayıcılara Asenkron cevaplama(Asynchronous Response) veAsenkron İstek yapma( Asynchronous Request) kabiliyetini eklediler. Böylece konuyu açacak olursak , sayfada kısmi istekler oluşabiliyor aynı zamanda  alınan kısmi cevaplarla sayfamızın bir bölümü güncellenmiş oluyor.  Burada AJAX arkaplanda iki teknolojiyi kullanıyor. Birincisi XMLHttpRequest nesnesi.Bu nesne tarayıcının server ile haberleşmesini sağlıyor. Bu nesne aslında IE5 sürümünden beri kullanılıyordu. (MSXML  ActiveX Component). Tabiki asıl bileşen ve ikinci teknolojimiz JavaScript. Bu nesne de haberleşme esnasında mesajların paketlenmesini sağlıyor. Diğer yararlanılan teknolojiler ise  DTHML, DOM ve JSON.  AJAX dilden bağımsız bir teknoloji. Yani AJAXı  JSP, PHP ya da ASP.NET ile kullanabiliyoruz. (20 yıllık hackerlar AJAXı  Google tarafında  geliştiriyorlar tabiki J ) Ama dillerin kendilerine göre Frameworkleri var AJAX üzerine. ASP.net 3.5 ile de Visual Studio IDE yi kullanacak olursak ASP.net sitelerimizin geliştirme sürecinde TOOLBOX içerisinde Ajax Extensions  hazır halde geliyor. Tabiki serverda .net framework  3.5 bulunuyorsa sitemiz AJAX için hazır demektir.  Ayrıca MS tarafından geliştirilen kodlarını görebildiğiniz ama gelişimine katkıda bulunamadığınız bir AJAX Toolkit, CodePlex üzerinden ücretsiz indirilebiliyor. Şimdi hikaye kısmını başarıyla tamamladıktan sonra Microsoft’un bizim için hazırlamış olduğu server kısmı için kontrolleri biraz inceleyelim.

AJAX Server Kontrolleri

ScriptManager: Her asp.net ajax özelliği aktif sayfada bulunması gereken bir kontrol.  Script Manager client bilgisayarına göderilecek olan javascriptleri göndermekle görevlidir.  Her sayfada n fazla bir adet ScriptManager olabilir.

ScriptManagerProxy: AltSayfada yada iç sayfada SciriptManagerin yaptığı işi yapar. Eğer master page içinde ScriptManager tanımlanmışsa master page üzerinden türetilmiş sayfalarda  ScriptManagerProxy tanımlanmalıdır.

Timer: Timer kontrolü belirli zaman aralıklarında client-tabanlı olayları gerçekleştirmek için kullanılır. Update ya da refresh gibi işlemler örnektir. UpdatePanel içinde kullanılır ve OnTick ile her tick için yapılması gereken event tanımlanabilir. Interval özelliği için 1000 = 1 sn demektir.

UpdatePanel: Bu kontrol asp.net ajax için bir kontejnır pozisyonundadır. Kısmi postback işlemlerinde sayfanın tamamını postback etmeden güncelleme işlemini ScriptManager ile haberleşerek yürütür.

UpdateProgress: Bu kontrol  ajax kısmi postback işlemleri yaparken son kullanıcıya görsel bir öğe gösterilmesine izin verir. Uzun süren işlemlerde kullanmak mantıklıdır. Bir yazı hareketli bir resim ya da daha farklı etkinlikler düzenlenebilir. Hayal gücünüze bırakılmıştır. İçerisinde tüm asp.net kontrollerini de kullanabiliyoruz.

Burada en basit olarak yapılabilecek bir ajax saat uygulamasının kodlarına yer veriyorum.

<div>

<asp:ScriptManager ID="ScriptManager1" runat="server">

asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<asp:Label ID="saat" runat="server" >asp:Label>

<asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="timerTicked">

asp:Timer>

ContentTemplate>

asp:UpdatePanel>

<script runat="server" >

protected void page_Load( object sender, EventArgs e )

{

saat.Text = System.DateTime.Now.ToString();

}

protected void timerTicked( object sender, EventArgs e )

{

saat.Text = System.DateTime.Now.ToString();

}

script>

div>

Burada kod ve .aspx sayfalarını ayırmak yerine aspx sayfasında  script tagları arasına yazdım kodları. Bu aspx.cs dosyasında yazmakla aynı amaca hizmet ediyor. (NET2003 için varsayılan kodlama bu şekildeydi.) Benim bu yöntemi seçme sebebim ise makalede kodları bütün halinde gösterebilmek.

Burada dikkat edersek ScRiptManager kontrolüne sadece sayfamızda yer verdik.Ajax kullanacağımız kontrolleri updatepanel içerisindeki ContentTemplate içerisine yazdık. AJAX Timer ‘ın Interval özelliği sayesinde son kullanıcının bilgisayarında her saniyede bir serverdan saati sormasını tetikledik.

Örnek:2 Burada da butonla tetikleyerek saati istedik ama sayfada tamamıyle bir postback gerçekleşmediğine dikkat edin.

<div>

<asp:ScriptManager ID="ScriptManager1" runat="server">

asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<asp:Label ID="Label1" runat="server" Text="Label">asp:Label>

<br />

<br />

<asp:Button ID="Button1" runat="server" Text="Saati Ajax ile getir" onclick="ajaxla" />

ContentTemplate>

asp:UpdatePanel>

div>

<script runat= style="color:aqua;font-weight:bold;">"server">

protected void ajaxla( object sender, EventArgs e )

{

Label1.Text = System.DateTime.Now.ToString();

}

script>

Burada UpdatePanel   içerisinde buton kontrolüne de yer verdik. UpdatePanel içerisinde Triggers kısmında dışarıda tanımladığımış olduğumuz butonları da ajax update panelimiz için tetikleyici olarak kullanabiliryoruz. Aşağıdaki örnekte bu şekilde bir kullanım söz konusu:

Bu örnekte senaryoyu biraz daha genişlettim ve veritabanından verileri ajax Update panel içerisinde çekmek istedim.   UpdateProgress kontrolünün de nasıl kullanılacağına güzel bir örnek oluşturuyor.  Butona basıldığında 10 saniye kadar bekleme olacaktır bu da gerçek hayatta karşılaşabileceğimiz bir senaryo. Verilerin serverdan yüklenmesi uzun sürüyor olabilir ayrıca sorgunun  da çok komplez bir sorgu olduğunu varsayabiliriz. Bunu görebilmek için ben ipliği 10 saniye kadar beklettim.

<div>

<asp:scriptmanager ID="Scriptmanager1" runat="server">asp:scriptmanager>

<asp:UpdateProgress ID="UpdateProgress1" runat="server">

<ProgressTemplate>

Güncelleme yapılıyor...

<asp:Image runat="server" ID="updatePic" ImageUrl="resim.jpg" />

ProgressTemplate>

asp:UpdateProgress>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<asp:GridView ID="GridView1" runat="server">

asp:GridView>

ContentTemplate>

<Triggers>

<asp:AsyncPostBackTrigger ControlID="Button1" EventName="click" />

Triggers>

asp:UpdatePanel>

<asp:Button ID="Button1" runat="server" OnClick="getir" Text="Button" />

<script runat="server">

protected void getir( object sender, EventArgs e )

{

System.Threading.Thread.Sleep( 10000 );

System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Data Source=ATCI-LAPTOP\SQLEXPRESS;Initial Catalog=siteDB;Integrated Security=True");

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();

cmd.Connection = con;

cmd.CommandType = System.Data.CommandType.Text;

cmd.CommandText = "Select otomobil.ID, otomobil.MarkaAdi, otomobil.PlakaNo from otomobil ";

System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter( cmd );

System.Data.DataSet ds = new System.Data.DataSet();

con.Open();

adp.Fill( ds );

GridView1.DataSource = ds;

GridView1.DataBind();

}

script>

div>

Çoklu UpdatePanel Kullanımı

Diğer bir konu ise çoklu UpdatePanel kullanımı. AJAX tekniğini sayfalarımızda kullanmamızın sebeplerinden en önemlisi sayfada kısmi postback işlemlerine izin vemesiydi. Birden fazla UpdatePanel kullanımında dikkat edilmesi gereken noktalardan en önemlisi yine ScriptManage nesnesinin tekrar yazılmaması gerektiği. Bir sayfada bir tane ScriptManager olmalı. Diğer bir konuda  butonların tetiklenmesi sırasında birkaç noktaya dikkat etmek gerekli.

"Conditional" ID="UpdatePanel2" runat="server">

Burada gördüğümüz gibi aslında UpdatePanel in UpdateMode adında bir özelliği daha var. Bu özellik biraz tetiklenme şekli hakkında bilgi veriyor.  Eğer herhangi bir butonun yada tetikleyicinin UpdatePaneli Triggers bölümünde yer almadan tetikleyebilmesini istiyorsak UpdateMode=”Always” modunda olmalı. Varsayılan olarak da Always modunda geliyor.

Aşağıdaki örneğe bakalım.

<div>

<asp:ScriptManager ID="ScriptManager1" runat="server">

asp:ScriptManager>

<asp:UpdatePanel UpdateMode="Always" ID="UpdatePanel1" runat="server">

<ContentTemplate>

<asp:Label ID="Label1" runat="server">asp:Label>

ContentTemplate>

<Triggers>

<asp:AsyncPostBackTrigger ControlID="Button1"

EventName="Click" />

Triggers>

asp:UpdatePanel>

<asp:UpdatePanel UpdateMode="Conditional" ID="UpdatePanel2" runat="server">

<ContentTemplate>

<asp:Label ID="Label2" runat="server">asp:Label>

ContentTemplate>

asp:UpdatePanel>

<br />

<br />

<asp:Button ID="Button1" runat="server"

Text="Click  to  initiate  async  request"

OnClick="Button1_Click" />

<script runat="server">

protected void Button1_Click(object senderEventArgs e)

{

Label1.Text = "Tetiklenme zamanı:  " + DateTime.Now;

Label2.Text = "Tetiklenme zamanı:  " + DateTime.Now;

}

script>

div>

Bu örnekte eğer UpdatePanel kontrollerinin her ikisi de UpdateMode=”Always” olarak ayarlanmış olsaydı  Butona tıklandığında her iki label kontrolünde de zaman güncellenecekti. Fakat şu anki kodlarda UpdatePanel2 sadece ken
di Triggers bölgesinde tanımlanmış olan tetikleyicilerle tetiklenecektir. Ki şu an bir tetikleyici tanımlanmadığı için örnekte hiçbir zaman tetiklenemeyecektir.

Sonuç

AJAX konusunda hızlı bir başlangıç yapmış olduk. Bu kısımım başarıyla anlaşılması web sayfalarımızda AJAX kullanmak için bir başlangıç olabilir.   Makaledeki örnekleri uygularken tarayıcıda gördüğümüz sayfaların kaynak kodlarına  da bakılması html ve JavaScript tarafında da neler döndüğünü görmek açısından yararlı olabilir. Çünkü ASP.NET bize arka tarafta birçok kolaylık sağlıyor ve JavaScript kısmını tamamen kendisi hallediyor diyebiliriz. Bir başka makalede görüşmek üzere.

makalenin pdf versiyonu

ORM , O/RM, O/R Mapping (Object Relational Mapping)

Yorum Yapılmamış

03/08/2009 at 13:13Kategori:Bilgisayar | Java

ORM aslında uzak olmadığımız bir teknik. Ne işe yaradığından kısaca bahsetmek gerekirse, sınıflarımızdan türettiğimiz nesnelerimizin ilişkisel veritabanımız ile daha iyi iletişim kurması anlamına geliyor. Veritabanları hala nesneye yönelik bir tasarımda olmadıkları için programlardaki nesneleri veritabanına tek hamlede değil de parça parça atıyorduk. ORM ile bu işi bir kere yapıp sonrasında veritabanından nesneler sorgulayıp veritabanına nesneler kayıt ediyoruz ve nesneler siliyoruz. ORM sadece tekniğin adı. Java ile haşır neşir olduğumda Hibernate terimini duymuştum. Aynı zamanda .net ile Linq kullanmış ve kolaylıklarını görmüştüm. Bu frameworklerin yaptığı işlem kısaca ORM olarak tanımlanıyor. Linq frameworkte de veriye erişim katmanı çok kolay ve görsel olarak tasarlanabiliyor. Bize kalan lambda ifadelerini öğrenmek ve nesnesel bakış açısına sahip olmak.
ORM üzerine tartışmalar da yok değil. 1 ayda bitecek çalışmayı 1 haftaya indiren teknik acaba performansı etkiler mi sorusu tartışılıyor. Tabiki arada bir çeşit çevirme işlemi olduğu için performans kaybı olacaktır ama bankacalık sistemlerinde bile java hibernate kullanılıyorsa sanırım Türkiye gibi işi bitir de nasıl biterse bitsin bakış açısında işlerin yaygın olduğu bir yerde sanırım ORM kullanmamak kendine haksızlık etmek olacaktır.
ORM ile deneyim ettiğim başka bir konu ise yazdığınız kodun güvenilirliği. Veri erişim katmanı kullanmış olduğunuz için yazdığınız kodun güvenilirliği de artıyor. Linq örneğinde olduğu gibi en küçük projede bile veri erişim katmanı kullanmanız kaliteyi artırıyor.
Aynı şekilde son zamanların yükselenlerinden biri de MVC frameworkler. Artık amaç profesyonelliği en alt seviyede bile gösterebilmek. Orta düzey bir kurum web sitesinde katmanlı bir mimariyi MVC framework sayesinde sağlayabiliyorsunuz. Bu da yaptığınız işin daha kalıcı ve yenilenebilir olmasını sağlıyor.
Son gelişmeleri merakla izliyorum ve bu tür kolaylıkların kullanılması gerektiğine inanıyorum. MS silverlight , linq , MVC framework gibi çalışmalarla hem yazılımcıların çalışmalarının -dolaylı olarak da kendi yazılımlarının- kalitesini artırıyor. Türkiye de sektörden beklenense biraz daha "iş bitsin , sistem çalışsın da nasıl çalışırsa çalışsın" anlayışının tersine kaliteye, mühendisliğe ve alt yapıya da önem veren işlere daha yüksek puan vermesi.