Bu yazımızda java ile basit bir web servisi yazıp .net ile bu servise erişmeyi anlatacağız.
Kullandığımız araç gereç ve platformlar:
1.) Sun Application Server 8.1
Download :
http://java.sun.com/j2ee/1.4/download.html#sdk
2.) NetBeans IDE 4.1
Download :
http://www.netbeans.org/downloads/index.html
3.) MySQL 4.1 ve MySQL Connector/J
Download :
http://dev.mysql.com/downloads/
4.) Microsoft Visual Studio 2003
Download :
http://msdn.microsoft.com/vstudio/
Java ile ilgili hemen heryerde karşılaşılan temel sorunları da bu yazı ile dile getirmeye çalışalım. Java ile başlangıç düzeyinde ilgilenenlerin en büyük sıkıntısı CLASSPATH ayarlarıdır ve bu sorunun hemen her kaynakta farklı çözümleri bulunmaktadır. Benim önereceğim çözüm de farklı olacak , çünkü önerdiğim Sun Application Server C:\Sun dizinine kendi JDK , J2EE ve JRE'sini kuruyor. Siz bu yazılımı yükleyerek aslında J2ME hariç komple Java Platformunu yüklemiş oluyorsunuz. Sun Java System Application Server'ı yükledikten sonra Bilgisayarım üzerinde sağ tuş -> Gelişmiş sekmesindeki ortam değişkenlerinde Sistem değişkenleri bölümünde yeni bir Sistem değişkeni tanımlayarak adına CLASSPATH diyelim ve Değişken değeri olarak aynen şunları yazalım : C:\Sun\AppServer\jdk\bin;C:\Sun\AppServer\jdk\jre\bin;C:\Sun\AppServer\jdk\jre\lib;C:\Sun\AppServer\jdk\jre\lib\ext;C:\Sun\AppServer\jdk\jre\lib\ext;C:\Sun\AppServer\jdk\bin;C:\Sun\AppServer\lib
Bu ortam değişkenleri Java'nın ihtiyaç duyduğu bütün kitaplıkları yükler. Daha sonra siz istediğiniz veritabanı sürücüsünü burada belirtilen C:\Sun\AppServer\jdk\jre\lib\ext dizinine atarsınız ve bu dizin tanımlı olduğu için veritabanı sürücünüz de uygulamalarınız tarafından çalıştırılabilir.Dolayısıyle MySQL sürücüsünü de bu dizine koplayamanız gerekiyor.
Veritabanı, uygulama sunucusu ve web servisi için Java idelerinin belki de en başarılısı olan NetBeans dışında herhangi birşeye ihtiyacımız bulunmuyor , ancak bu IDE'de Java ile ilgili bütün işlerimizi yapabilmek için bazı tanımlamalar yapmamız lazım.
Önce Sun Application Server'ı NetBeans'e tanıtmamız gerekiyor. Bunun için Tools -> Server Manager yolundan giderek Açılan Server Manager Penceresinde AddServer diyelim. Gelen pencerede admin kullanıcı adı ve parolasını yazdıktan sonra Sun Application Server artık NetBeans IDE ile bütünleşik çalışmaya başlayacakıtır.
MySQL sunucusunu NetBeans IDE'ye tanıtmak için de benzer bir yol izliyoruz.Sol taraftaki Runtime arabiriminde bulunan Databases bölümündeki Drivers'e sağ tuş ile tıklayıp Add Driver komutu veriyoruz. Gelen pencerde Add bunonuna tıklayarak C:\Sun\AppServer\jdk\jre\lib\ext\ yolunda bulunan mysql-connector-java-3.1.10-bin.jar driverını gösteriyoruz.
Dikkat : Bu sürücü dışındaki sürücüler MySQL 4.1'de Türkçe karakter problemi çıkarıyor.Bu sürücü ile MySQL character set'inizi latin5 olarak ayarlayabilirsiniz.
MySQL sürücüsünü tanıttıktan sonraki durum
Bu aşamalardan sonra şimdi bilgisayarımızda kurulu bulunan MySQL sunucusuna bağlanmamız gerekiyor. Bu işlem için Databases/Drivers/MySQL(MM.MySQL driver) bölümünde sağ tuş ile Connect Using komutu verelim.
Artık btturk isimli bir veritabanımız var ve bu veritabanında NetBeans ile bilgiler isimli bir tablo oluşturabiliriz.
Evet bilgiler isimli tablomuzu oluşturduk ve içerisine okuyacağımız verileri de yazdık.Şimdi web servisimizi yazmaya başlayabiliriz.Web servisi için önce bir web uygulaması projesi başlatmamız gerekiyor. NetBeans menüsünden File -> New Project yolunu izliyoruz.Projemiz bir web uygulaması ve adı da webServisiDeneme1
Projeyi oluşturduktan sonra Web Servisinin çalışacağı java package'ı oluşturmamız gerkiyor.İşlemin nasıl yapıldığı resimlerde görülebilir.
WebServisi isimli package'i oluşturduktan sonra bir web servisi yaratabiliriz.Bu işlem ekran görüntüleriyle gösterilmiştir:
Personel Web Servisini oluşturduktan sonra servis üzerinde sağ tuş->Add Operation... komutu veriyoruz.
Operasyonumuz sonucunda bize personel bilgilerinin String türünden dönmesini istediğimiz için Return Type'ı String olarak seçiyoruz.
Parametre olarak göndereceğimiz değerin veritabanındaki id alanına denk gelmesi nedeniyle parametre ekleme işleminde int değer göndermemiz gerekiyor. Bu işlem için Add Operation penceresinde Add tuşuna tıklayarak parametre tipi olarak int ve parametre ismi olarak id yazıyoruz. Web servisimiz çalıştığında oluşacak WSDL dökümanında bu değerler gidip gelecektir.
Bu işlemlerden sonra projemizin görüntüsü aşağıdaki gibi olacaktır:
Şimdi SQL bağlantımız için gerekli kodları yazabiliriz :
Yeni bir java class oluşturarak adını SQLSorgulari verelim ve içerisine şu satırları yazalım :
package WebServisi;
import java.sql.*;
public class SQLSorgulari {
public SQLSorgulari() {
}
public String bilgiDondur(int id) throws Exception{
Class.forName("org.gjt.mm.mysql.Driver");
java.sql.Connection baglanti = DriverManager.getConnection("jdbc:mysql://localhost/btturk","root","");
java.sql.Statement sorgulama = baglanti.createStatement();
java.sql.ResultSet veriler = sorgulama.executeQuery("SELECT * FROM bilgiler where id="+id);
String bilgiler=null;
while (veriler.next()){
bilgiler = veriler.getString(1)+" "+veriler.getString(2)+" "+veriler.getString(3);
}
return bilgiler;
}
}
Bu sınıf sadece SQL sorgusu sonucunda dönecek değer için bağlantıları sağlamakta ve bilgiDondur() metodunu yazmaktadır bu metodun tek yaptığı kendisine gelen int türünden değeri veritabanında aramak ve String türünden bir veri döndürmektir. Buna benzer java veritabanı örnekleri heryerde bulunabileceği için üzerinde fazla durmuyoruz. Asıl işimiz PersonelImpl.java ile. Bu sınıftan bilgiDondur metodumuzu çağırmamız gerekiyor. Web servisini oluştururken iki dosya oluşmuştu biri PersonelImpl.java ve diğeri PersonelSEI.java bu iki dosyadan PersonelSEI.java sadece PersonelImpl.java sınıfındaki metodları java.rmi ile sunma işi yapmaktadır.Asıl metodun tanımlama yeri PersonelImpl.java'dır ve buradan SQL medodumuzu çağırmamız gerekiyor.
PersonelImpl.java sınıfına gidip aşağıdakileri yazalım :
package WebServisi;
//SQL metodumuzu barındıran sınıfı çağırıyoruz
import WebServisi.SQLSorgulari;
public class PersonelImpl implements PersonelSEI {
SQLSorgulari SQLSorgu= new SQLSorgulari();//SQLSorgulari isimli sınıfın bir örneğini yarattık
public String bilgiGetir(int id){
try{
return SQLSorgu.bilgiDondur(id);//bilgiDondur isimli metodu çağırıyoruz
}catch(Exception hata){
return "hata";
}
}
Web servisimiz tamam artık uygulamayı run edebiliriz. F6 tuşuna basarak uygulamayı çalıştırıyoruz. Bu esnada uygulama derlenmekte, WAR dosyası olarak birleştirilmekte ve uygulama sunucusunda deploy edilmektedir. Browser'ımızı açıp http://localhost:8080/webServisiDeneme1/Personel?WSDL yazarsak çalışan web servsinin WSDL dökümanını görebiliriz.
Şimdi Java ile web servisimizi yazdık ve bunu .NET içerisindeki bir uygulamadan kullanmamız gerekiyor. Bu iş için Visual Studio açmak gerektiği için NetBeans'i ve bilimum açık programınızı kapatmanızı öneriyorum çünkü zaten Sun Application Server epey fazla RAM tüketiyor.Yalnız dikkat edilmesi gereken nokta şu ki eğer Sun Application Server'ı NetBeans üzerinden Start ettiyseniz NetBeans'i kapattığınızda Sun Application Server de kapanacaktır. Böyle bir durumda Başlat->Programlar->Sun Microsystems->Application Server PE ->Start Default Server ile uygulama sunucusunu yeniden çalıştırmanız gerekebilir.
Eski ve daim dostumuz Visual Studio 2003 'ü açıyoruz ve yeni bir proje oluşturuyoruz.Projenin adı da JavaDotnet ve bu bir Visual Basic .NET projesi. Aslında uygulamayı C# ile de yazabilirdik fakat o zaman Java ile Java konuşuyormuş gibi bir durum ortaya çıkabileceği için iki farklı teknolojinin daha iyi farkedilmesini sağlamazdı.
Oluşturduğumuz uygulamaya iki label ve iki metin kutusuyla bir de buton ekliyoruz.
Web Servisimizi .Net projesine bir Web Referansı olarak ekliyoruz .
Görüldüğü gibi Web Servisimiz ve bilgiGetir() metodumuz Visual Studio tarafından görüldü.
Web Referansını ekledikten sonra projemize geri dönüyoruz ve Web Servisi nesnesinin örneğini oluşturuyoruz. Ben bu örneği public olarak tanımladım ama genelde örneklerde tıklama olayının (event'ın) içinde Dim ile tanımlandığını görüyoruz. Bu web servisinin bize sağladıklarını başka form elementlerinde kullanmak gerekebileceği için bence bunu bir üst scope'ta tanımlamak daha iyi.
Yine bir nesnenin bizden neler isteğini ve bize ne vereceğini görmenin en iyi yolu olarak iki öneri sunabilirim . Biri WSDL dökümanını incelemek bir diğeri de örneklediğimiz nesnenin metod veya özelliklerini anlamak için yanına bir nokta koymak. Örneğimiz için gösterecek olursak :
personel nesnemizin bilgiGetir metodu bizden localhost.bilgiGetir türünden bir değişken istiyormuş ve karşılığında da localhost.bilgiGetirResponse tipinde bir yanıt döndürüyormuş.O halde bizim bu tipten değişkenler oluşturmamız gerekiyor. Biz de bu değişkenleri tanımlıyoruz :
Public personel As New localhost.Personel
Public bilgiGiden As New localhost.bilgiGetir
Public bilgiGelen As New localhost.bilgiGetirResponse
Butonun tıklama olayına aşağıdakileri yazdığımızda uygulamamız çalışacaktır :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim texteYazilan As Integer = CType(TextBox1.Text, Integer)
bilgiGiden.int_1 = texteYazilan
bilgiGelen = personel.bilgiGetir(bilgiGiden)
TextBox2.Text = bilgiGelen.result
End Sub