ALIŞTIRMA UYGULAMALARI
Bu bölümde, birinci kitapçıkta öğrendiklerimizi küçük ASP uygulamalarında kullanacağız; ve böylece son iki bölümde yer alan nisbeten daha büyük ASP Programları için hazırlık yapmış olacağız. Bu bölümdeki örnekleri mutlaka kendiniz yazmalısınız ve açıklanmamış kodlardan anlamadıklarınız olursa mutlaka daha önceki bölümlere dönerek gözatmalısınız. Bu bölümdeki kodları dikkatle incelerseniz, çoğunda daha önce ele aldığımız temel VBScript komutlarının veya ASP nesnelerine ait metodlarının kimi zaman değişik tarzda kullanımına yer verdiğimizi göreceksiniz. Temel kullanım biçimlerini öğrendikten sonra, mutlaka Microsoft’un MS-Developers Network sitesinde (
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]) VBScript ve ASP konularındaki belgeleri ve eğitim metinlerini incelemelisiniz.
Doğum Günü Hesabı
VBScript’in dil olarak bize sağladığı bazı kolaylıkları ASP teknolojisi ile birleştirebiliriz. ASP sayfalarımızda istediğimiz gibi HTML kodları da kullanırız. Bu örnekte, bu iki unsuru da birarada göreceğiz. Aşağıdaki kodu dogumgunu01.asp adıyla kaydedin:
<% @LANGUAGE=VBscript %>
<%
Option Explicit
Response.Expires = 0
Dim serverSaat, kalanSaat
serverSaat = Time
' aşağıdaki satırda işaretler arasındaki yere kendi doğum gününüzü yazın
kalanSaat = DateDiff("h",Now,#7/8/2000#)
%>
<HTML>
<HEAD>
<TITLE>Dogum Günü Hesabı!</TITLE>
<META http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<META http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<H3>
<CENTER>
<p>Selam:</p>
<p>Şu anda saat: <%=ServerSaat%></p>
<%
If kalanSaat > 0 Then
Response.Write "Doğum gününüze " & kalanSaat & " saat var." & VbCrLf
ElseIf kalanSaat < 0 Then
Response.Write "Doğum gününüz " & kalanSaat & " geçmiş buluyor." & VbCrLf
Else
Response.Write "<b>Doğum gününüz kutlu olsun!</b>" & VbCrLf
End If
%>
</CENTER>
</H3>
</BODY>
</HTML>
Bu kodda bulunan ASP nesnelerini ve metodlarını kolayca görüyor olmalısınız. Tanımlamadığımız bir değişken kullanmayı veya değişken adlarını yanlış yazmayı önleyen Option Explicit ifadesi dikkatinizi çekiyor olmalı. Sayfamızda bir hesap yapılacağı için Browser tarafından geçici Internet dosyaları arasında (cache) saklanmasını istemediğimizi, Response.Expires’ın değerini 0 yaparak belirtiyoruz. iki değişken tanımlıyoruz (serverSaat ve kalanSaat) ve bunlardan birincisine Server’ın o andaki saatini Time fonksiyonu ile atıyoruz. İkinci değişken ise hesaplama sonucu belirlenecek. Bu arada ASP programının hangi tarihe kaç saat kaldığını hesaplamasını istiyorsak, kalanSaat’i belirleyecek formüle o tarihi yazıyoruz. Bu formüle dikkatle bakalım:
kalanSaat = DateDiff("h",Now,#7/8/2000#)
DateDiff ve DateAdd, VBScript’in vereceğiniz iki tarih arasında, yine vereceğiniz biçime göre farkı bulmasını veya toplamasını sağlar. Buradaki “h” hesap sonucunun saat olarak verilmesini istediğimiz gösterir. “d” ise sonucu gün olarak istediğimiz anlamına gelir. Now, Server’ın o andaki saatidir; ”#” işaretleri arasında ise hesabın yapılacağı tarih, veya buradaki örnekte doğum gününüz yer alıyor. kalanSaat değişkeninin değeri bu hesaplama sonucu olarak doğum gününüze kalan saat olacaktır.
Kodumuzun geri kalan bölümünde ise elde ettiğimiz sonucu Browser’a yollayan bir If seçimi var: doğum gününüze kalan saat 0’dan büyükse veya küçükse bunu farklı cümlelerle belirtiyoruz. Kalan süre 0 ise, bugün doğumgününüz demektir! (ASP ile bu kadar uğraşırsa, insanın doğum gününü filan unutması normaldir. üzülmeyin!)
Daha önce VBScript’in metin ve değişkenleri birbirine “&” işareti ile eklediğini görmüştük. VBScript ile yazdırdığımız satırların sonuna kimi zaman <BR> kodu koyarak, yeni satırın bir satır aşağıdan başlamasını sağladığımızı hatırlıyor olmalısınız. Burada & VbCrLf şeklinde gördüğümüz ifade de bunu sağlar. Bu, Visual Basic’in “alt satıra geç, başa git!” (Carriage Return, Line Feed) komutudur.
Dedik ki, DateDiff ve DateAdd fonksiyonlarının, sonucu gün olarak vermesini istiyorsanız, “d” argümanını kullanmanız gerekir. Şimdi burada öğrendikleriniz bu programı doğumgününüze kalan saati değil de günü hesaplayacak şekilde değiştirebilir misiniz? (Ortaya çıkartacağınız kodu bu kitapçığın kodları arasındaki dogumgunu02.asp dosyası ile karaşılaştırabilirsiniz.)
Çift Tırnak Gerekince!
Kimi zaman ASP yoluyla ziyaretçininr Browser’ına HTML kodu göndermek gerektiğinde HTML’in gerektirdiği çift tırmak işaretini yazdırma sorunuyla karşılaşırız. VBScript’in gereği olan çift-tırnak işaretinin içine koyacağımız HTML’in gereği olan çift tırnak, ASP hatasına yol açar, C'den türetilen dillerde ters bölü işaretiyle yaptığımız türden, kontrol karakterlerinin metin olarak anlaşılmaması işini (ESCape-ing'i) VBScript’te türlü şekillerde yapabiliriz. Burada, yerine göre, üç yöntemden yararlanabiliriz işe yarar:
1. Tırnak işareti gereken yerde iki kere tırnak yazmak;
2. İçerdeki tırnak yerine tek-tırnak kullanmak
3. İçerdeki tırnak yerine & Chr(34) & kullanmak. (Bu yöntemi kullandığımızda "dışardaki" tırnak diye bir şey kalmadığına dikkat etmek gerekir.)
Örnekler:
objMetin.WriteLine("<%@ LANGUAGE=""VBScript""%\>")
objMetin.WriteLine("<%@ LANGUAGE='VBScript'%\>")
objTsOut.WriteLine("<%@ LANGUAGE=" & Chr(34) & "VBScript" & Chr(34) & "%\>")
HTML Dışında İçerik
HTTP iletişiminde istemci Browser ile Server arasında her talep ve sunuşla birlikte bir dizi HTTP Header (başlık) bilgisi gönderildiğini biliyoruz. Bu bilgiler arasında neler bulunduğunu dabu kitapçığın kodları arasında bulunan SerDeg.asp dosyasını çalıştırarak inceleyebilirsiniz. Browser penceresinde beliren bilgilere dikkat ederseniz, Browser, Server’a HTTP yoluyla kabul edebileceği bilgi türlerini de sıralıyor:
HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*
Burada düzyazı (text/plain) türünün bulunmadığını görüyorsunuz. Fakat ASP yoluyla, sayfanıza düz yazı gönderebilirsiniz. Aşağıdaki kodu duzyazi.asp adıyla kaydedin, ve çalıştırın:
<% @LANGUAGE=VBscript %>
<%
Response.ContentType = "text/plain"
Response.Expires = 0
%>
Bu dosyada HTML etiketi kullanmıyoruz. Metin tamamen bir düz yazıdan ibaret. İçinde <BR> kodu bulunmadığı halde satırlar Enter'a bastığımız yerde alt satıra geçecektir. Bu kodu yazarken buradaki örnekte gördüğünüz satır sonlarında Enter’a basmalısınız.
Genellikle HTML sayfalarımızı tasarlarken içerik türünü belirten Content-Type özelliğini yazmayız; çünkü Browser, içerik türü belirtilmemişse gelen belgenin mutlaka “text/html” olduğunu varsayar. Fakat burada olduğu gibi, içinde bir tek HTML etiketi (hatta <HTML> etiketi bile) olmayan bir metni Browsar’a gönderebilir ve istediğimiz şekilde görüntületebiliriz. Bunu Response.ContentType = "text/plain" ifadesi sağlamaktadır.
Response nesnesi, varsayılan türler dışında sadece düz yazı türü göndermekle kalmaz, Browser’ın kabul edebileceği ve HTTP’nin aktarılmasına elverişli olduğu her türlü dosyayı gönderebilir. Bu dosya türlerinin hangileri olabileceğini çevre değişkenlerinden HTTP_Accept’in içinde görebilirsiniz. Bunu sınamak için duzyazi.asp’nin Content-Type satırını şu şekilde değiştirin ve dosyayı msword.asp adıyla kaydedin:
Response.ContentType = "application/msword"
Bu dosyayı çalıştırdığınızda, Broewser türünüze ve ayarlarınıza ve sisteminizde MS-Word programının bulunup bulunmamasına bağlı olarak, ya doğruca ya da size sorarak, bilgisayarınız MS Word kelime işlemcisini açacaktır:
Bu imkandan ziyaretçiye resim veya diğer tür dosyaları göndermek için yayarlanabiliriz. Ancak bir resim dosyasını gönderirken, metin vermek yerine dosya yolu ve adını belirtmemiz gerekir.
Başka Sayfaya Yönlendirme
Diyelim ki ziyaretçilerimizin Web programımızda belirli işleri yapabilmeleri veya eski ifadesiyle sitemizde belirli bir sayfaya erişmek için kayıt yaptırmış olmaları gerekiyor; bu kaydı yaptırmamış olanları kayıt sayfasına yönlendirmek istiyoruz. Birazdan form yoluyla ziyaretçiden bilgi alma ve bunu işlemeyi göreceğiz, ama şimdilik sadece bu senaryonun ikinci kısmını ele alalım: ziyaretçimizi başka sayfaya yönlendirelim. Bunun için iki ayrı sayfa yapacağız. Önce şu kodu, gonder.asp adıyla kaydedin:
<% @LANGUAGE=VBscript %>
<%
Response.Redirect("yeni.asp")
Response.Expires = 0
%>
<HTML>
<HEAD>
<TITLE>ASP ILE YONLENDİRME</TITLE>
</HEAD>
<BODY>
Bu sayfada yazılı olanları okumanız mümkün olmayacak<br> çünkü bu sayfa sizi başka sayfaya gönderecek..
</BODY>
</HTML>
Şimdi şu kodu da yeni.asp adıyla kaydedin:
<HTML>
<HEAD>
<TITLE>YENİ SAYFA</TITLE>
<META http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<META http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<%= “Sizi buraya başka sayfa gönderdi.. <BR>”%>
</BODY>
</HTML>
gonder.asp’yi çağırın; karşınıza yeni.asp’nin içeriği gelecektir; çünkü gonder.asp kendisinden beklediğimizi yapacak ve sizi yeni.asp’ye gönderecektir. Bunu “Response.Redirect” metodu yapmaktadır. Bu metodun argümanı olarak kendi programımızın bir başka sayfasını verebileceğiz gibi, bir Internet sitesinin URL’ini de verebiliriz.
Ziyaretçiden Bilgi Alma
İstersek adına Web Programı diyelim, sitemize ziyaretçilerin bilgi ulaştırması ancak HTML’in Form etiketi yoluyla olur. Klasik HTML+CGI yöntemleri ile ASP tekniğinde Form etiketlerinin işlevleri arasında bir fark yoktur. Ancak aralarındaki benzerlik de hemen hemen bundan ibarettir. Klasik HTML+CGI yönteminde Form’larımızın Action özelliğine değer olarak çoğu zaman bir CGI programının yolunu ve adını yazarız; oysa ASP’de Form bu bilgileri kendisinin de içinde bulunduğu ASP sayfasına gönderebilir; ve örneğin formun eksik doldurulup doldurulmadığını sınayabilir.
HTML bilgilerinizi tazelerseniz; bir Form’dan Server’a iki metodla bilgi gelebilir: Get ve Post yöntemleriyle. Get, Browser’ın bilgileri yumak yapıp, aradaki boşlukları kaldırarak ve ASCII olmayan karakterleri URL koduyla şifreleyerek Query_String içine yazdırmasını sağlar. Diğer yöntemi birazdan ele alacağız.
Küçük bir form oluşturalım ve bu formdan Get yoluyla gelecek bilgileri daha sonra nasıl kullanabileceğimizi görmek için, şimdilik sadece sayfamıza yazdıralım. Şu kodu miniform_get.asp adıyla kaydedin:
<% @LANGUAGE=VBscript %>
<%
Option Explicit
Response.Expires = 0
Dim strAdi, strSoyadi, hamBilgi, islenmisBilgi
If Request.ServerVariables("QUERY_STRING") <> "" Then
strAdi = Trim(Request.QueryString("adi"))
strSoyadi = Trim(Request.QueryString("soyadi"))
hamBilgi = Trim(Request.QueryString("mesaj"))
islenmisBilgi = Replace(hamBilgi, vbcrlf, "<BR>" & vbcrlf)
%>
<html>
<head>
<title>Mini Form</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</head>
<body>
Script'imize Form'dan bilgi ulaştı <BR><BR>
Gelen bilgiler:<BR>
Formu dolduran kişinin adı: <%= strAdi%> <BR><BR>
Formu dolduran kişinin Soyadı: <%= strSoyadi%> <BR><BR>
Ham Bilgiler: <%= hamBilgi%> <BR><BR>
İşlenmiş Bilgiler: <%= islenmisBilgi%> <BR><BR>
"Query_String" olarak gelen bilgi: <BR>
<%= Request.ServerVariables("QUERY_STRING")%>
</body>
</html>
<%
Else
%>
<html>
<body>
Bize bilgi verir misiniz?<BR>
<FORM ACTION= "<%= Request.ServerVariables("SCRIPT_NAME") %>" METHOD="GET">
Adınız: <INPUT TYPE="Text" NAME="adi"><BR>
Soyadınız: <INPUT TYPE="Text" NAME="soyadi"><BR>
Mesajınız: <TEXTAREA NAME="mesaj">Mesajınızı buraya yazın!</TEXTAREA><BR>
<INPUT TYPE="Submit" NAME="Gönder" VALUE="Gönder">
</FORM>
</body>
</html>
<% End If %>
Kodumuzun bir değişken tanımladığımız ve Form’dan gelen bilgileri işleyen bölümü, bir de henüz bu bilgi gelmeden önce Form’u oluşturan bölümü olduğuna dikkat ediyor musunuz? Bu iki bölümü bir If sınama deyimiyle oluşturduğumuzu da görüyorsunuz.
ASP tekniği ve VBScript’in kolaylıkları birleşince, CGI’da olduğu gibi, Formdan gelen bilgileri özel fonksiyonlar yazarak ayıklamamız gerekmez. ASP’nin anladığı şekliyle, Query_String Form’dan GET metoduyla gelen bilgileri Form’un bilgileri atadığı değişkenlerin adlarıyla eşleştirerek tutar; ve bize sadece Form’daki değişkenlerin değerlerini, istiyorsak, başka değişkenlere atamak kalır. Burada Form’un “adi” olan değişkenini bir String değişkeni olan strAdi değişkenine, yine Form’un “soyadi” olan değişkenini başka bir bir String değişkeni olan strSoyadi değişkenine atıyoruz. Bunu yapmamızın sebeplerinden biri iki dizi değişkenden hangisinin ASP tarafında kullanıldığını bilmektir.
Form’un üçüncü değişkeni olan “mesaj” ise ASP tarafından işlenirken, iki şekilde ele alınacak: hamBilgi değişkeninin değeri olarak, ve bunu Replace() fonksiyonu ile işledikten sonra atayacağımız islenmisBilgi değişkenini değeri olarak.
Replace() fonksiyonu, bir değişkende bir değeri bulur ve arzu ettiğimiz bir başka değerle değştirir. Üç argüman alır: içinde arama ve değişiklik yapılacak değişken, aranacak değer ve yerine konacak değer. Burada iki veya daha fazla paragraf içeren bir mesajın içindeki satırbaşı-yeni paragraf karakterini, HTML’in anlayacağı <BR> ve satırbaşı karakteri ile değiştiriyoruz.
Şimdi miniform_get.asp’yi çalıştırın, doldurun (mesaj bölümünde iki paragraf oluşturmak için bir yerde Ctrl+Enter’a basmayı unutmayın! Yoksa işlenmiş bilgi ile ham bilginin farkını göremeyiz!) ve Gönder tuşunu tıklayın. Bu arada Browser’ınızın URL hanesine bakın. Bu Get metodunun bilgi gönderme şeklidir. Bilgiler URL-kodu olarak değiştirilir ve gideceği sayfanın adına, soru işareti ile eklenerek, gönderilir. (Tabii ziyaretçiniz yıldızlar halinde görüntülenen bir parola yazdıysa onu da burada açık şekilde görecektir!)
Bizim Form bilgilerimiz hangi sayfaya gönderiliyor? Yine kendisine. Bunu Form etiketinin Action özelliğinin karşısında yazılı olan VBScript kodu sağlıyor. Bu yolla gelen bilgi, şuna benzer olmalıdır:
Script'imize Form'dan bilgi ulaştı
Gelen bilgiler:
Formu dolduran kişinin adı: Kroninukus
Formu dolduran kişinin Soyadı: Computerium
Ham Bilgiler: Merhaba Ben üniversiteyi yeni bitirmiş bir gencim!
İşlenmiş Bilgiler: Merhaba
Ben üniversiteyi yeni bitirmiş bir gencim!
"Query_String" olarak gelen bilgi:
adi=Kroninukus+&soyadi=Computerium+&mesaj=Merhaba% 0D%0ABen+%FCniversiteyi+yeni+bitirmi%FE+bir+gencim %21+%0D%0A&G%F6nder=G%F6nder
Replace() fonksiyonunun, mesajın içindeki CRLF karakterini bulup yerine <BR> koyduğuna dikkat edin. Query_String’in yazdığınız ad ve soyad ile mesajı nasıl yumak (tek String) yaptığına bakın. Ve programımızın bu yumaktan bilgileri alıp, yeni değişkenlere atayarak Browser penceresinde nasıl görüntülediğini inceleyin.
Bu programın canalıcı noktası, Request nesnesinin ServerVariables kolleksiyonunda, Query_String koleksiyonunu kullanmasıdır. Çünkü Get, Form’un sağladığı bilgileri bu koleksiyona kaydetmiş bulunuyor.
Şimdi aynı işi Post metodu ile yapalım. Bunun için biraz önce kaydediğiniz kodda şu değişiklikleri yapın ve miniform_post.asp adıyla kaydedin:
<% @LANGUAGE=VBscript %>
<%
Option Explicit
Response.Expires = 0
Dim strAdi, strSoyadi, strBilgi
If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then
strAdi = Trim(Request.Form("adi"))
strSoyadi = Trim(Request.Form("soyadi"))
strBilgi = Trim(Request.Form("mesaj"))
strBilgi = Replace(strBilgi, vbcrlf, "<BR>" & vbcrlf)
%>
<html>
<head>
<title>Mini Form (Post)</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</head>
<body>
Script'imize Form'dan bilgi ulaştı <BR><BR>
Gelen bilgiler:<BR>
Formu dolduran kişinin adı: <%= strAdi%> <BR><BR>
Formu dolduran kişinin Soyadı: <%= strSoyadi%> <BR><BR>
Mesaj: <%= strBilgi%> <BR><BR>
</body>
</html>
<%
Else
%>
<html>
<body>
Bize bilgi verir misiniz?<BR>
<FORM ACTION= "<%= Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
Adınız: <INPUT TYPE="Text" NAME="adi"><BR>
Soyadınız: <INPUT TYPE="Text" NAME="soyadi"><BR>
Mesajınız: <TEXTAREA NAME="mesaj">Mesajınızı buraya yazın!</TEXTAREA><BR>
<INPUT TYPE="Submit" NAME="Gönder" VALUE="Gönder">
</FORM>
</body>
</html>
<% End If %>
İki Miniform sayfası arasındaki değişikliği farkettiniz mi? Önce, Form etiketinin METHOD özelliğinin Post olduğuna dikkat edin. Bu yöntemle gelen bilgiler, Request nesnesinin Form kolleksiyonuna, işlenmiş (yani değişken=değer çiftleri halinde yazılmış) olacağı için, Form bilgilerini yeni değişkenlere atama ifadelerimizi de farklı yazıyoruz. Önce formdan gerçekten bilgi gelip gelmediğini Content_Length değişkeninin boyutunun sıfır olup olmadığına bakarak anlıyoruz. Bu değişkenin boyutu 0 ise form içi boş gönderilmiş demektir; bu durumda ziyaretçiyi form’u doldurması için uyaran bir Sub’a gönderebiliriz. Form doldurulmuş ise, kodumuzun birinci bölümü yapması gereken değişkenlere atama işlemini yapıyor; ve sonuçları ziyaretçinin Browser penceresine yazıyor. Daha sonra yapacağımız örnek Konuk Defteri’nde bu bilgileri ziyaretçinin ekrarına değil, bir metin dosyasına yazacağımızı göreceksiniz.
Form etiketlerinden bilgi alma
Form içinde kullandığımız bir çok etiket, Server’a farklı biçimde bilgi gönderir. Yukarıdaki örnekte gördüğümüz Input ve Textarea etiketleri, kendi adlarını değişken adı yaparak ve değişkene ziyaretçinin yazdığı metni değer olarak atayarak, gönderir. Fakat HTML’in <SELECT MULTIPLE> etiketi biraz daha dikkat etmemizi gerektirir; çünkü ziyaretçi bu etiketle oluşturduğunuz seçeneklerden birden fazla seçebilir ve bunlar Server’a bir kolleksiyonun elemanları olarak gelir. Şöyle bir örnek düşünün:
<SELECT NAME=”CokluSecme” SIZE=”3” MULTIPLE>
<OPTION VALUE=”Emrah” SELECTED> Emrah
<OPTION VALUE=”Karacaoglan”> Karacaoğlan
<OPTION VALUE=”Sulari”> Davud Sulari
<OPTION VALUE=”Daimi”> Aşık Daimi
<OPTION VALUE=”Pirsultan”> Pir Sultan Abdal
Browser, kullanıcı birden fazla seçim yaptıysa, yapılan seçim sayısını, yani kaç seçenek seçildiğini bize bildirir ve bu Request nesnesinin Form kolleksiyonunda “CokluSecme” elemanının “.Count” değişkenine yazılır. Bu bakımdan “CokluSecme” kendisi bir kolleksiyondur. Yani, bu değişkenin değerini kullanarak, “CokluSecme” kolleksiyonunun elemanlarını tek tek okutmak için bir For döngüsünden yararlanabiliriz:
For sayac = 1 to Request.Form(“CokluSecme”).Count
Response.Write(sayac & “. seçim: “ & Request.Form(“CokluSecme”)(sayac) & “<BR>”)