Sabancı Üniversitesi Bilişim Teknolojileri Yüksek Lisans Programı Seminerleri Java ile Web Uygulamaları Geliştirme Ahmet Demirelli SCJP 5.0 - SCWCD 1.4
Ajanda Web uygulaması nedir Basit bir CGI örneği Uygulama Sunucuları Bir Java Web Uygulaması için neler gerekli Web Tools Platform Servlet doget() ve dopost() methodları JSP JSP sayfalarında önceden tanımlı nesneler
Web Sayfaları request response GET /downloads/index.html HTTP 1.1 Accept : text/html Accept-Language: en-us User-Agent: Mozilla /4.0...
Web Siteleri Web sitesi ; Birbirleri ile ilişkili web sayfaları topluluğudur. Eğer web sitesi sadece tanıtım amaçlı ise ; Kullanıcı ile etkileşimi yoksa ; Sadece html sayfalarından ve o sayfalardaki text,resim,flash animasyon ve javascript kodları yeterlidir. istemci request response html Resimler.js dosaları.swf dosyaları
Web Uygulamaları Kullanıcı etkileşimi (kullanıcıdan bilgi alma...vb) Kullanıcı şifre onaylama (login işlemleri ) Arama işlemleri Oturum açma (alışveriş sepeti..vb ) Her kullanıcıya farklı arayüz...vb gibi gereksinimlerimiz varsa sunucu tarafında çalışan programlara ihtiyacımız var.
Web Uygulamaları ( CGI ) CGI Programları *.exe,*.cgi... etc
Basit CGI örneği Herhangi bir exe dosyasını Apache web server da /cgi-bin/ klasörü altına kopyalayıp. Browser adres satırına ; http://localhost/cgi-bin/hello.exe yazıp web sunucusundan bu programı çalıştırmasını istiyoruz. Hello.exe C# ile yazılmış bir windows programı class Program { static void Main(string[] args) { Console.WriteLine("Content-Type:text/html\n"); Console.WriteLine("Hello World"); } }
Uygulama Sunucusu Sunucu tarafında çalışacak uygulamaları yorumlayıp veya çalıştırıp ortaya çıkan sonuçları tekrar istemciye göndermekle görevli olan sunuculardır. *. php *. asp......... *. dll *. class.net J2EE
J2EE Uygulama Sunucuları J2EE Uygulama Sunucusu Web container WebComponents Servlet jsp Html / xml EJB container BusinessComponents SessionBean, EntityBean, MessageDrivenBean
J2EE Uygulama Sunucuları Tomcat Web Container **** JBoss Web + EJB container BEA WebLogic Web + EJB container IBM WebSphere Web + EJB container Oracle 10g Web + EJB container Sun ONE Web + EJB container
J2EE Web Uygulaması için Web Container (Tomcat 5.5) http://tomcat.apache.org/ J2EE Uygulama geliştirme ortamı (Web Tools Platform) http://download.eclipse.org/webtools/ ***Uygulamanın J2EE belirtimlerine uygun bir şekilde dosyalanmış olması gerekir.
Gerekli dosya ve klasörler BookStore Uygulama ana klasörü WEB-INF Özel klasör (dışarıdan erişime kapalı) classes Servlet class larınınn bulunacağı klasör lib Projede kullanılan extra kütüphaneler tlds Tag kütüphaneleri web.xml Uygulama konfigürasyon dosyası ( deployment descriptor ) HTML ve jsp dosyaları Uygulamada kullanılan diğer dosyalar
Web Tools Platform Java ile J2EE uygulamaları geliştirmeyi kolaylaştırmak için yazılmış bir eclipse eklentiler bütünüdür. http://download.eclipse.org/webtools/...kurulum ve Ayarlar... Web Tools Platformu indirip herhangi bir klasöre açıyoruz.
Web Tools Platform Web Tool Platform da uygulama geliştirmeye başlamadan önce perspective ayarlarını değiştirmeniz gerekmektedir. Bunun için ; Windwow Open Perspective Other.. J2EE seçiyoruz
Web Tools Platform Ayarları-1 Windows -> Preferences -> Server -> Installed JREs
Web Tools Platform Ayarları-2
Web Tools Platform Ayarları-3
Web Tools Platform Ayarları-4 Servers -> Right Click -> New Server
Web Tools Platform Ayarları-5
WTP - Yeni Proje Oluşturma-1 Project Explorer -> Dynamic Web Projects -> New -> Dynamic Web Project
WTP - Yeni Proje Oluşturma-2 Servlet Servlet classlarının classlarının kaynak kaynak kodları kodları (*.java (*.java dosyaları dosyaları ) ) Web Web içeriği içeriği (web.xml, (web.xml, jsp jsp ve ve htmldosyaları htmldosyaları ) )
Projeyi Sunucuda Çalıştırma-1
Projeyi Sunucuda Çalıştırma-2
Servlet Sunucu tarafında çalışan derlenmiş özel java class ları. Görevleri Kullanıcıdan gelen açık ( explicit ) bilgileri almak (Form bilgileri) Kullanıcıdan gelen kapalı (implicit) bilgileri almak (Request Header) Bu bilgilerle işlemler yapmak HTML çıktısı üretmek Açık bilgileri kullanıcıya göndermek ( HTML ) Kapalı bilgileri kullanıcıya göndermek (Response header) Kullanıcılar ile nasıl bilgi alışverişinde bulunacağız.?
Kullanıcılardan bilgi almak Sunucu tarafında çalışan uygulamalara kullanıcılar bilgiyi HTML-Formları ile veya URL ile gönderebilirler <html> <head></head> <body> <form <form action="index.jsp" method="get"> İsim İsim :<input type="text" name="isim" /><br> No No :<input type="text" name="id" /><br> <input type="submit" value="gonder"/> </form> </body></html>
HttpRequest & HttpResponse HttpRequest GET POST GET /downloads/index.jsp?isim=ahmet&no=447 HTTP 1.1 GET /downloads/index.jsp?isim=ahmet&no=447 HTTP 1.1 Accept Accept : : text/html text/html Accept-Language: Accept-Language: en-us en-us User-Agent: User-Agent: Mozilla Mozilla /4.0 /4.0 HTTP Header HTTP Body HttpResponse POST POST /downloads/index.jsp /downloads/index.jsp HTTP HTTP 1.1 1.1 Accept : text/html Accept : text/html Accept-Language: en-us Accept-Language: en-us User-Agent: Mozilla /4.0 User-Agent: Mozilla /4.0 isim=ahmet&no=447 isim=ahmet&no=447 HTTP/1.1 HTTP/1.1 200 200 OK OK Content-Length: Content-Length: 114 114 Date: Mon, 30 April 2006 11:07:44 GMT Date: Mon, 30 April 2006 11:07:44 GMT Content-Type: text/html Content-Type: text/html Server: Apache Server: Apache <html> <html> <head> </head><body>... <head> </head><body>... HTTP Header HTTP Body HTTP Header HTTP Body
Bir Sınıfın Servlet Olabilmesi için import import java.io.*; java.io.*; import import javax.servlet.*; javax.servlet.*; import import javax.servlet.http.*; HttpServlet sınıfının alt alt sınıfı sınıfı olmak olmak zorunda public public class class HelloWorld HelloWorldextends extendshttpservlet { public public void void doget(httpservletrequest req,httpservletresponse res) res) throws throws ServletException, IOException IOException { PrintWriter PrintWriterout out = res.getwriter(); res.getwriter(); out.println("hello World"); World"); } } GET GET ve ve POST POST isteklerini karşılayacak olan olandoget() veya veya dopost() methodların yazılması gerekir. Methodlar yazılmazsa gelen gelen istekler istekler cevapsız kalır. kalır.
doget() & dopost() methodları Browser HttpRequest HttpRequest HttpRequest HttpRequest GET GET POST POST Web Container HelloWorld.class service ( HttpRequest req, HttpResponse res ) doget ( HttpRequest req, HttpResponse res ) HttpResponse HttpResponse dopost ( HttpRequest req, HttpResponse res )
Servlet Yaşam Döngüsü Başlangıç init() init() Servlet Servlet classının classının hafızaya hafızaya ilk ilk defa defa yüklendiğinde yüklendiğinde çalışması çalışması gereken gereken kodlar kodlar bu bu method method içerisineyazılır içerisineyazılır Hizmet Hizmet service() service() doget() doget() dopost() dopost() İstemciden İstemciden gelen gelen isteğin isteğin ilk ilk karşılandığı karşılandığı methoddur. methoddur. İsteğin İsteğin türünü türünü belirleyip belirleyip ilgili ilgili methoda methoda yönlendirir. yönlendirir. GET isteklerine cevap veren method GET isteklerine cevap veren method POST isteklerine cevap veren method POST isteklerine cevap veren method Sonlandırma destroy() destroy() Servlet Servlet hafızadan hafızadan kaldırılırken kaldırılırken yapılacak yapılacak işlemleri işlemleri bu bu method method içerisine içerisine yazılır yazılır
DEMO - Servlet Örneği Web Tools Platform da oluşturduğmuz yeni projeye servlet eklemek doget() ve dopost() methodlarını yazmak Kullanıcıdan gelen bilgileri request nesnesinden almak ( request.getparameter() ) Kullanıcıya gönderilecek bilgileri response nesnesine yazmak. web.xml dosyası
web.xml (Deployment descriptor) Uygulamada hangi servletler var, bu servletlere URL ile nasıl ulaşılabilir. Authentication User roles Filters Güvenlik kısıtlamaları... etc
Problemler Eğer uygulamamızda yalnız servlet kullanarak yazarsak; Java Programcıları HTML bilmek zorunda HTML çıktısı verebilmek için sürekli print() fonksiyonu kullanılmak zorunda Yapılan küçük bir değişiklik için kod tekrar derlenmek zorunda Arayüz ile java kodları iç içe (spaghetti code) bulunmak zorunda
Çözüm Servlet Kod + İş Kuralları Sadece java kodu bulunmalı, mümkünse hiç HTML yazdırılmamalı. Görevini tamamladıktan sonra bir jsp sayfasına yönlendirilmeli. JSP (Java Server Pages) Arayüz Jsp bir HTML dizayn aracı kullanılarak düzenlenebilir (DreamWeaver,Frontpage..etc) Minimum java kodu bulunmalı. Sadece servletlerden dönen sonuçları ekrara bastırmak için kullanılmalı. JSTL kullanılmalı.
JSP (Java Server Pages) İçerisinde java kodu yazılabilen html sayfası. <HTML> <HEAD><TITLE>Deneme Sayfası</TITLE></HEAD> <BODY> <H2>JSP Sayfası </H2><br> Şu An : <%=new java.util.date() %> <table align= center > <tr><td> <% out.prinln( Hello JSP ) %> </td></tr> </table> </BODY></HTML>
JSP ifadeleri Expression <%= expression %> out.println() yazmak yerine Scriptlet <% code %> Declaration XML Syntax <jsp:expression>code</jsp:expression> <jsp:scriplet> code</jsp: scriplet> <%! code %> Mevcut jsp sayfasının tamamından ulaşılabilen değişkenler tanımlamak için kullanılır. <jsp:declaration>code</jsp: declaration>
JSP Önceden tanımlanmış nesneler request ( HttpRequest ) response ( HttpResponse ) out ( PrintWriter ) Response nesnesine birşeyler yazabilmek için kullanılır. session ( HttpSession ) Kullanıcıların oturum işlemleri için kullanılan nesnedir application ( ServletContext ) Tüm genel bilgilerin tutulabileceği nesne
JSP- Yaşam Döngüsü JSP sayfaları Web container tarafından servlet koduna dönüştürülür. Servlete dönüştürülen JSP compile edilir. Oluşan.class dosyası hafızaya yüklenip aşağıdaki methodlar sırasıyla çalıştırılır. jspinit() jspservice() JSP sayfsının body bölümü jspdestroy()
DEMO (Jsp-Servlet Uygulaması) Web Tools Platform da oluşturduğmuz yeni projeye jsp sayfası eklemek Scriplet,expression ve declaration taglari kullanmak Servletten response nesnesine request.setattribute() methodu ile eklenen bir değişkeni request.getattribute() methodu ile almak. JDBC ile MySQL veritabanından bilgi çekmek.
Sorular? ahmetdemirelli@sabanciuniv.edu