Sayfalar

13 Eylül 2010 Pazartesi

AJAX: Web Uygulamalarında Yeni Yaklaşım

Web uygulamalarında var olan olumsuz taraflar günden güne yokolup bunların yerlerini yeni yaklaşımlar alıyor. Masaüstü uygulama yazanlar web uygulama yazanlara göre çok daha fazla zenginliğe sahiptirler. Bu fark web geliştiricilerin sağladığı deneyimler ile masaüstü uygulamalarını kullanan kullanıcıların arasında bir boşluk yarattı. Fakat bu boşluk gitgide kapanıyor. Örneğin Google Suggest siz arama textbox'ına girdiğiniz karakterelere göre, size neredeyse aynı anda size önerdiği terimler, güncelleniyor. Ya da Google Maps. Haritayı daha da yaklaştırdığınızda, farenin imlecini oynatın yada haritayı tutup sağa sola oynatın. Sanki her şey bir anda gerçekleşmiş gibi değil mi? Hem de sayfa tekrar yüklenmeden. Aslında bunların hepsi sunucu tarafında oluyor. Aynı anda oluyor zannetmeniz sadece gerekli metotların sunucu tarafından işlenmesi sayesindedir.

Google Suggest ve Google Maps gibi bu yeni web uygulamarındaki yaklaşımın iki örneğin kullandığı uygulamaya Ajax adı verilir. Asenkron olarak JavaScript + XML'i kullanır. Bu web ortamında yapılabileceklerin temel değişikliklerini temsil eder.

Ajax'ı Tanımlayalım

Ajax bir teknoloji değildir. Bir kaç teknolojiyi içinde barındırır. Her birinin yeniliklerini ve gelişmelerini birlikte kullanıp yeni ve güçlü bir yol yaratır. Ajax şunları barındırır.

•XHTML ve CSS'i kullanarak standart web temelini sunar.

•Dinamik gösterim ve Document Object Modeli (DOM) u kullanarak dinamik etkileşim.

•XMLHttpRequest'i kullanarak asenkron (eş zamanlı olmayan) veriyi tekrar alır.

•ve JavaScript her şeyi bind edebilir.

Klasik web uygulamaları şu şekilde çalışır: Kullanıcıların çoğu uygulamanın ara yüzünde bir olayın olmasını sağlayarak web sunucusuna bir HTTPRequest gönderir. Sunucu bazı işlemler yapar (data alır, çeşitli sistemlerle etkileşime girer...) ve istemcinin sayfasına HTML döndürür.



Klasik Web uygulaması modelinde, sunucu kendine ait işlemler yaparken kullanıcının yaptığı tek şey beklemek oluyor. Uygulamayı kullanırken attığı her adımda bekliyor. Aslında eğer web'i web uygulamaları için en başından inşa etseydik , kullanıcıları bekletmezdik. Öncelikle bir ara yüz yüklenir daha sonra kullanıcı uygulama ile etkileşime girer ve ihtiyacı olan şeyleri sunucudan alır. Peki neden kullanıcı uygulamanın sunucuya gitmesini seyretmek zorunda?

Ajak'ın Farklı Yönleri

Bir Ajax uygulaması kullanıcı ve sunucu arasında bir Ajax Motoru kullanarak Web üzerinde sunucu-istemci arasında sürekli gidip gelmesini ortadan kaldırır. Bir web sayfasını açtığınızda bir oturum açarsanız bu sırada bir web sayfası yüklenir. İşte bu yüklenen web sayfası JavaScript ile yazılmış ve gizli bir frame içine yerleştirilmiş Ajax Motorunu yükler.Ajax motoru sunucu ile iletişimi bağımsızdır. Böylece kullanıcı asla boş browser penceresine ve kum saati ikonuna bakmaz. Sunucunun gerekli işlemleri yapmasını bekler.



Bu yeni web yaklaşımında her bir kullanıcının yarattığı olay normal olarak HTTP isteği yaratır ve bu isteği Ajax motoru olarak adlandırılan JavaScript'den alır. Kullanıcının yarattığı herhangi bir isteğin cevabı için -basit veri geçerliliği, hafızadaki veriyi düzenlemek- sunucuya gitmesi gerekmez. Eğer Ajax motoru herhangi bir cevap için sunucuya ihtiyaç duyarsa- herhangi bir verinin işlenmesi, ek kullanıcı ara yüz kodlarının yüklenmesi, yeni verinin alınması gibi- Ajax motoru tüm bu istekleri asenkron biçimde, genellikle XML kullanarak, kullanıcının uygulama ile etkileşiminde herhangi bir gecikme olmaksızın yerine getirir.

Kimler Kullanıyor

Google Ajax yaklaşımının gelişmesi için büyük yatırımlar yaptı. Google'ın geçen yıl tanıttığı önemli ürünlerin hepsi, Orkut,Gmail, Google Groups, Google Suggest ve Google Maps, ajax yaklaşımı kullanılarak geliştirilmiştir. Diğerler örnekler ise; Fickr Ajax tabanlıdır ve Amazon'un A9.com arama motoru da aynı teknik kullanılarak yazılmıştır.

Yukarıda bahsettiğimiz örnekler Ajax'ın sadece teknik bir terim olmadığını aynı zamanda gerçek hayata (real-world) uygun uygulamalar için de pratik olduğunu gösterir. Ajax uygulamalarını buyüklüğü değişen her tür uygulamada; Google Suggest gibi basit bir uygulamdan Google Maps gibi karışık bir uygulamaya kadar kullanabilirsiniz.

Basit bir Ajax örneği yapalım. bu örnekte ajax kullanmak için sayfa ve web.config ayarlarının nasıl olması gerektiğini ve nasıl çalıştığını basit bir şekilde bulabilirsiniz.

HttpHandler kurulumu

HttpHandler'ın nasıl çalıştığı hakkında detaylı bilgi vermeden ASP.NET isteklerini nasıl karşıladığını örnekle anlatalım. Örneğin; *.aspx sayfaları için tüm istekler (request) System.Web.UI.PageHandlerFactory sınıfı tarafından kontrol edilip yönetilir. Benzer şekilde bizde web.config sayfasında yapacağımız ekleme ile ajax/*.ashx'a yapılan istekler Ajax.PageHandlerFactory sınıfı ile kontrol edilecektir.

<httpHandlers>

<add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax"
/>

</httpHandlers>


Yukarıdaki kod parçası Ajax.PageHandlerFactory sınıfı tarafından ele alınan (ajax/*.ashx) ile belirtilmiş path'i,varsayılan handler factory yerine,herhangi bir request ile illişkilendirir. Bunun için herhangi bir ajax dizini yaratmanıza gerek yoktur. Bu, Diğer HttpHandler sınıfları .ashx eklentilerini kendi alt dizinleri ile kullanılabilsin diye söylencesel(mythical) basit bir dizindir.

Sayfa Ayarları

Artık kod yazmaya hazırız.Bunun için yeni bir sayfa yaratın veya varolan bir sayfayı codebehind'da açın. Aşağıdaki kodu codebehind'a ekleyin.



public class Sample : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
Ajax.Utility.RegisterTypeForAjax(typeof(Sample));
}


İstemci taraflı çağrıda eş zamanlı olmayacak bir şekilde sunucu taraflı bir fonksiyon oluşturalım. Code behind'da aşağıdaki fonksiyonu yazalım.



[Ajax.AjaxMethod()]
public string HelloServerSide(string Name, string Surname)
{
return "Merhaba! "+ Name + " " +Surname;
}


Bu fonksiyon Ajax.AjaxMethod özelliğine sahiptir. Bu özellik, istemci tarafından bu tür metotların çağrılabilmesi için JavaScript vekaletleri yaratmak için kullanılır.

En son adımda, istemci tarafında JavaScript kullanılarak sunucu tarafında kullanacağımız metodu yazacağız.

<body>

<form id="Form1" method="post" runat="server">

<script language="javascript">

function HelloClientSide(result)

{

if(result.error != null)

{

alert(result.error);

return;

}

document.getElementById("hello").innerHTML = result.value;

}

</script>


Adı:<asp:TextBox id="txtname" runat="server"></asp:TextBox>

Soyadı:<asp:TextBox id="txtsurname" runat="server"></asp:TextBox>

<input type="button" id="submit" value="ClientSubmit"
onclick="Sample.HelloServerSide(txtname.value,txtsurname.value,HelloClientSide)
">

<asp:Button id="Button1" runat="server" Text="ServerSubmit"></asp:Button>

</form>

Client Side Result: <span id="hello" style="COLOR: #993300;
FONT-FAMILY: Tahoma"></span><br>

Server Side Result:

<asp:Label id="lblserverside" runat="server" style="COLOR:
#993300; FONT-FAMILY: Tahoma"></asp:Label>

</body>

Yukarıda yazdığım kodun design tarafında görüntüsü şu şekildededir.



Burada iki tane TextBox kontrolü ve 2 tane'de Button vardır. Bu butonlardan ClientSubmit butonu sunucu taraflı çalışmayacak, diğeri ise sunucu tarafında çalışacak şekilde tasarlanmıştır. OnClick() olayı gerçekleştirildiği zaman sunucu tarafında Sample.HelloServerSide metodu çağrılacaktır ve HelloClientSide JavaScript fonksiyonuna "result" değişkenini döndürecektir. TextBox'lara değerler girip ClientSubmit() butonuna tıkladığı zaman sadece çalışması gereken metot çalışacak ve geriye Merhaba! yazısı ile birlikte TextBox kontrollerine yazdığınız değerler dönecektir. Yani tüm sayfadaki herşey sunucuya gidip gelmez, sadece gerekli kontroller ve metotlar çalışır. Böylece sunucu gereksiz yere çalışmaz. Sizde ServerSide ve ClientSide butonunu tıklayarak işlemlerin nasıl gerçekleştiğini daha iyi anlayabilirsiniz. Aşağıda bu uygulama ile ilgili örnek kod verilmiştir. Uygulama içindeki bin dizininde yer alan Ajax.dll'i de bulunmaktadır. Eğer Ajax'ı web uygulamasında kullanacaksanız bu dll'i projenize eklemeyi unutmayın.

CLng() Fonksiyonu

CLng(Sayı)


CLng fonksiyonu girilen sayı değerini Long değerine dönüştürür.

Girilen sayıların aralığının -2,147,483,648 ve 2,147,483,647 olması gereklidir.

Code:

<% orneksayi=1234.5 %>

<% =CLng(orneksayi) %>

Çıktı:

1234.5

CInt() Fonksiyonu

CInt(Sayı)


CInt fonksiyonu herhangi bir sayı değerini integer yapar.

Döüştürme değerleri -32,768 ve 32,767 arasındadır. Girilen sayı yuvarlanır.

Örnek Kod:

<% orneksayi=1234.567 %>

<% =CInt(orneksayi) %>

Çıktı:

1235

Chr() Fonksiyonu

Chr(ANSIdeğeri)


Chr fonksiyonu verilen ANSI karakter kodu değerini karaktere çevirir.

Örnek Kod:

<% =Chr(98) %>

Çıktı:

b

CDbl() Fonksiyonu

CDbl(Sayı)


CDbl fonksiyonu geçerli değişkeni Double olarak tanımlamamıza yarar.

Dönüştürülen değerlerin aralığı :

Negatif değerler için -1.79769313486232E308 to -4.94065645841247E-324 ve pozitif değerler için 4.94065645841247E-324 to 1.79769313486232E308.

Örnek Kod:

<% orneksayi=1234.5 %>

<% =CDbl(orneksayi) %>

Çıktı:

1234.5

CDate() Fonksiyonu

CDate(Gün)


CDate fonksiyonu geçerli herhangi bir tarih veya saat formatını Date yani gün değişkeni olarak tanımlamamıza yarar.

Geçerli olan tarih formatı çoğunlukla şu şekildedir : **/**/** ve geçerli saat formatı : **:**:** *M .

Ayrıca kabul edilen tarih aralığı da 1 ocak 100 ile 31 Aralık 9999'dur.

Örnek Kod:

<% ornekgun = "Ocak 26, 1943" %>

<% =CDate(ornekgun) %>

Çıktı:

6/26/43

Örnek Kod:

<% ornekgun = #6/26/43# %>

<% =CDate(ornekgun) %>

Çıktı:

6/26/43

Örnek Kod:

<% orneksaat="2:23:59 PM" %>

<% =CDate(orneksaat) %>

Çıktı:

2:23:59 PM

CCur() Fonksiyonu

CCur(Sayı)


CCur fonksiyonu girilen herhangi bir sayi değerini Currency yani para birimine dönüştürmeye yarar.

Yapılabilecek sayi aralığı ise :

-922,337,203,685,477.5808 to 922,337,203,685,477.5807

Örnek Kod:

<% orneksayi=(12345) %>

<% =CCur(orneksayi) %>

Çıktı:

12345

Bu fonksiyon 4 desimal değere yuvarlama yapar.

Örnek Kod:

<% orneksayi=(55555.123456) %>

<% =CCur(orneksayi) %>

Çıktı:

55555.1235

CByte(Sayı)

CByte fonksiyonu 0 ile 255 arasında herhangi bir sayıyı byte değişkenine dönüştürür.


Örnek Kod:

<% orneksayi=(9.876) %>

<% =CByte(orneksayi) %>

Çıktı:

10

Örnek Kod:

<% orneksayi=(255) %>

<% =CByte(orneksayi) %>

Çıktı:

255

CBool() Fonksiyonu

CBool(Sayı)


CBool fonksiyonu girilen sayıyı boolean değişkenine dönüştürmeye yarar.

Boolean değişkeni için çıktı iki şekilde olmaktadır: "True" veya "False". Eğer dönüşüm başarılı ise "true", hatalı ise "False" veya bir hata mesajı çıkacaktır.

Örnek Kod:

<% sayi=7.77 %>

<% =CBool(sayi) %>

Çıktı:

True

Örnek Kod:

<% sayidegil=abc %>

<% =CBool(sayidegil) %>

Çıktı:

False

Atn() Fonksiyonu

Atn(Sayı)


Atn fonksiyonu verilen sayısının arc-tanjantını bulmaya yarar.

Örnek Kod:

Çıktı:

1.54857776146818

Ayrıca negatif sayılarda kullanabilirsiniz.

Örnek Kod:

Çıktı:

-1.54857776146818

Asc() Fonksiyonu

Asc(String)

Asc bir string ifadenin ilk karakterinin ANSI karakter kodunu vermektedir.

Aşağıdaki iki örnekte görüldüğü gibi sadece ilk karaktere bakılmaktadır.

Örnek Kod:

<% =Asc("abcde fghij klmno pqrst uvwxyz") %>

Çıktı:

97

Örnek Kod:

<% =Asc("a") %>

Çıktı:

97

Array() Fonksiyonu

Array(Liste)

Array fonksiyonu tek boyutlu statik dizi(array) yaratmaya yarar. Array Fonksiyonunu kullanarak dinamik dizi tanımlayamazsınız.

Unutmayın ki; dizinin ilk elemanı her zaman sıfır("0") olarak tanımlanmalıdır. Örneğin ; deneme(0)

List terimi dizinin elemanı olacak değerleri listelemeye yarar.

Örnek Kod:
Çıktı:
A
B
C
D

Örnek Kod:

Çıktı:
111
222
333
444
555

Dinamik yapıda bir dizi Dim ve ReDim fonksiyonlarının kullanımı ile olabilir. Öncelikle dinamik diziyi tanımlamak için Dim fonksiyonunu boş parantezler kullanarak çağırmanız gerekir. Ardından programın herhangi bir noktasında ReDim fonksiyonunu çağırarak eleman sayısını tanımlarsınız. Ayrıca istediğiniz zaman dinamik dizinizi tekrardan tanımlayabilirsiniz.

Örnek Kod:
Diziler 60 boyuta kadar desteklenmektedir. Eğer çok boyutlu bir dizi tanımlamak istiyorsanız, yine Dim tanımını kullanmalısınız.
Örneğin aşağıda bulunan dizi 3 boyutludur. ılk elemanın 23, ikincinin 15 ve üçüncünün 201 elemanı bulunmaktadır. Sonuç olarak, bu dizide toplamda 23x15x201 = 69345 eleman bulunmantadır

Yarattacağınız boyut sayısı mevcut olan bellek ile sınırlıdır.Eğer varolan bellek değerini aşarsanız bir hata mesajı alırsınız.

Örnek Kod:

Abs() Fonksiyonu

Abs(Sayı)

Abs fonksiyonu verilen sayının mutlak değerini bulmamıza yarar.

Negatif sayılar pozitif olur, pozitif sayılar ise değişmeden pozitif olarak kalır.

Örnek Kod:
<% =Abs(-127.89) %>

Çıktı:
127.89

Örnek Kod:
<% =Abs(127.89) %>

Çıktı:
127.89

ASP ile Neler Yapabilirsiniz

Asp’nin avantajlarıdan ve çalışma mantığından bir önceki konuda söz ettim. Bu avantajlar göz önüne alındığında elelktronik ticaret için en kullanışlı dil olma avantajı vardır. Çünkü güvenlik bu tür uygulamalarda çok önemlidir ve Asp de bize bu güvenliği sağlamaktadır. Diğer avantajı ise çok kolay bir dil olmasıdır. Gerçekten bir perl ile program geliştirebilecek kişi sayısı sınırlıdır ama Asp’yi biraz programlama bilgisi olan herkes çözebilir ve çok kısa zamanda iyi işler ortaya koyabilir.
Asp ile veritabanına bağlanıp gelen verilerden faydalanarak sayfalar üretebilirsiniz. Bunun için SQL, Access veya Oracle kullanabilirsiniz. ODBC bağlantısı yapabileceğiniz tüm veritabanlarına Asp kullanarak erişebilirsiniz.

Asp ile her şeyin başında dinamik sayfalar hazırlayabilirsiniz. Böylece her kullanıcıya farklı bir sayfa gösterebilirsiniz. Html ile bunu ypamanız imkansızdır ancak farklı sayfalar yaparak bu sorunu çözebilirsiniz. Bu da zamandan ve yerden büyük kayıp demektir.

Asp kullanarak elinizdeki bilgiyi kolayca diğer insanların kullanımına açabilirsiniz. Sizde bulunan bir uygulama programını Asp ile entegre çalıştırabilirsiniz. Bu da sizin B2B ve B2C uygulamalar geliştirmenizi sağlar.
Bing'ı Seviyoruz. :)
Google'ı Seviyoruz. :)