Burak IŞIKLI :))

Google App Engine Java İpuçları

Posted in Java by Burak IŞIKLI on 14 Ağustos 2009

Google, geçtiğimiz günlerde app engine yani uygulama sunucusunu piyasaya sürdü. İlk izlenimlerimin ardından app engine ile ilgili birkaç detay vermek istedim. Yemek tarzındaki kurulumu birçok sitede kurulumun nasıl yapılacağını bulmanız mümkün. Ben de ayrıca java programcıları ve teknolojileri derneği tarafından yayınlanmış sitenin pdf dosyasını veriyorum.

Kurulumu yapıp örnek bir proje oluşturduktan sonra uygulamanın nasıl çalıştığını anlayalım. Öncelikle deploy yapmadan projeniz web’e atılmaz. Bu nedenle de yerel alanda istediğiniz kadar değişiklik yaparken asıl sayfanız(belirttiğinizad.appspot.com) herhangi bir değişiklik olmaz.

Her zaman belirttiğiniz proje isminin servlet’i oluşturuluyor. Örneğin deneme diye proje oluşturuyorsanız servlet’inizin adı otomatik olarak denemeServlet oluyor. Peki bunu nasıl değiştireceğiz? Refactor kullanmanız ismini değiştirmek için yeterli gelmiyor. Bunu deneyip deploy ederseniz karşınıza boş bir sayfa çıkacaktır. Bildiğiniz üzere bu servlet’imizin bağlı olduğu web.xml dosyası olması gerekiyor. İşte bu dosya war klasörünün altındaki web-inf klasöründedir. Aşağıdakine benzer bir dosya karşınıza gelecektir.

web.xml


<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 <servlet>
 <servlet-name>Deneme</servlet-name>
 <servlet-class>edu.burakkk.google.app.DenemeServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>Deneme</servlet-name>
 <url-pattern>/deneme</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
 <welcome-file>index.html</welcome-file>
 </welcome-file-list>
</web-app>

Buradan servlet-class ismini de değiştirerek servlet isminde kolayca değişiklik yapabilirsiniz. Ayrıca url-pattern ile servletinizin çalışacağı uzantıyı da değiştirebilirsiniz. deneme yerine deneme.do yapabilirsiniz. Başlangıçta google app engine tarafından oluşturulan index.html yerine de welcome-file değiştirerek de kendi istediğiniz dosyayı hatta çalıştıracağınız servlet’i yapabilirsiniz. Bunun anlamı xxx.appspot.com sayfasını açtığınızda kendi tarafından oluşturulmuş index sayfası yerine sizin sayfanız çıkabilir.

Eğer uygulama ismini veya versiyonu değiştirmek istiyorsanız aynı dizindeki(war/web-inf) appengine-web.xml dosyasından yapacaksınız.

appengine-web.xml


<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
 <application>bisikli</application>
 <version>1</version>

 <!-- Configure java.util.logging -->
 <system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
 </system-properties>

</appengine-web-app>

Application kısmından uygulama ismini versiyon kısmından da versiyonunu değiştirebilirsiniz.

Bunları dikkate alarak anasayfamızda gerçek ip’nizi çıkaran bir servlet yapalım.

edu.burakkk.google.app isimli paket ipAlma isimli servlet yaratıyoruz.

ipAlma.java


package edu.burakkk.google.app;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.*;

@SuppressWarnings("serial")
public class ipAlma extends HttpServlet {
 public void doGet(HttpServletRequest req, HttpServletResponse resp)
 throws IOException {
 resp.setContentType("text/html");
 PrintWriter out = resp.getWriter();
 out.println("IP: " + req.getRemoteHost());
 out.flush();
 out.close();
 }
}

web.xml


<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 <servlet>
 <servlet-name>ipAlma</servlet-name>
 <servlet-class>edu.burakkk.google.app.ipAlma</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>ipAlma</servlet-name>
 <url-pattern>/ipAlma</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
 <welcome-file>ipAlma</welcome-file>
 </welcome-file-list>
</web-app>

Bu projeyi deploy ettiğinizde anasayfanızda IP: XXXXX şeklinde ip’nizi yazan bir web sayfası çıkacaktır. Örnek sayfaya http://bisikli.appspot.com/(sizinUygulamaAdınız.appspot.com) adresinden ulaşabilirsiniz. Ayrıca aynı sayfaya servlet’mize http://bisikli.appspot.com/ipAlma bu adresle de ulaşabiliriz.

Reklamlar

Web Service ile Sıcaklık Dönüşümü

Posted in Java, Web Services by Burak IŞIKLI on 29 Temmuz 2009

Daha önceden blogumdaki Axis 2 Kullanılarak Web Servis Oluşturma adlı yazımda web servisin nasıl oluşturulacağını anlatmıştım. Fakat çok iyi bir örnek vermediğim için biraz havada kaldı. Şimdi anlatacağım örnekle konu tam anlamıyla oturmuş olacak. Web servislerde internette biraz araştırma yaparsanız en sık öne çıkan örnekler sıcaklık dönüşümü, para dönüşümü, kimlik sorgulama gibi hizmetler olacaktır. Bende bunlardan biri olan sıcaklık dönüşümünü java ve jsp kullanarak anlatacağım.

Yapacağımız programı iki aşamalı olarak anlatacağım. Birinci versiyonumuz için paket adımız “edu.burakkk.webservice.tempConverter.v1”. İlk önce birinci versiyonu yapalım.

TempConverter.java


package edu.burakkk.webservice.tempConverter.v1;

/**
 * Web Service
 * Temp Converter
 *
 *@version 1.0 Release 1
 *@author burakkk
 *
 **/

public class TempConverter{
 public String FahrenheitToCelsius(String Input) {
 if (!Input.isEmpty() && isNumber(Input)) {
 double result = 0;
 result = Double.parseDouble(Input);
 result = (((result) - 32) / 9) * 5;
 Input = Double.toString(result);
 return Input;
 } else {
 return "ERROR! Please enter the input number...";
 }
 }

 public String CelsiusToFahrenheit(String Input) {
 if (!Input.isEmpty() && isNumber(Input)) {
 double result = 0;
 result = Double.parseDouble(Input);
 result = (((result) * 9) / 5) + 32;
 Input = Double.toString(result);
 return Input;
 } else {
 return "ERROR! Please enter the input number...";
 }
 }

 private boolean isNumber(String num) {
 try {
 Double.parseDouble(num);
 } catch (NumberFormatException nfe) {
 return false;
 }
 return true;
 }
}

Aslında yaptığımız programı bu şekilde kullanmak doğru olmaz. Çünkü her metodu çağırmak için ayrı bir forma gerek olur ki bu da gereksiz yer, yük ve işlem getirir. Ancak bu şekilde yaparak anlatmak istediğim bir başka konu var. Bu web servis yerine başka bir web servis düşünün. Öyle ki bu web servisin iki metodundan biri özel yani sadece üyelere açık, diğeri ise public yani herkese açıktır. İşte bu işlemi bu şekilde iki ayrı metoda bölerek rahatlıkla yapabiliriz. Özel olan metoda önce kullanıcı üye mi değil mi diye üyelik testi yaptırırız. Bu sebeple de sınıfımıza private olan ayrı bir metod daha ekleriz. Bu private metod, gelen kullanıcının üye olup olmadığını kontrol eder. Örneğin boolean türünde olursa true sonuç döndürürse istediğimiz webservisin sonucunu döndürürüz aksi takdirde üye olmadığına dair hata sonucunu döndürürüz.

Bu prosesimizi(web servisimizi) kullanacağımız zaman yani çağırmak için olan prosesimizi yapalım. Aslında bunu bir web sayfası olarak JSP ile yapacağız. Ancak daha öncedende anlattığım gibi web servis genel bir konsept olduğu için her programlama dilinde yapmak mümkündür. Ben sadece örnek olarak JSP kullanacağım.

TempConverter.v1.jsp

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Temp Converter</title>
</head>
<body>
<form
action='http://localhost:8080/WebService/services/TempConverter/FahrenheitToCelsius'
method="post" target="_blank">
<table>
<tr>
<td>Fahrenheit to Celsius:</td>
<td><input type="text" size="30" name="Input"></td>
</tr>
<tr>
<td></td>
<td align="right"><input type="submit" value="Convert"></td>
</tr>
</table>
</form>

<form
action='http://localhost:8080/WebService/services/TempConverter/CelsiusToFahrenheit'
method="post" target="_blank">
<table>
<tr>
<td>Celsius to Fahrenheit:</td>
<td><input type="text" size="30" name="Input"></td>
</tr>
<tr>
<td></td>
<td align="right"><input type="submit" value="Convert"></td>
</tr>
</table>
</form>
</body>
</html>

Ekran Görüntüsü:

Result

Sayfamızı çalıştırdığımızda yukarıdaki gibi bir ekran karşımıza gelecektir. Buraya fahrenheit olarak veya celcius olarak çevirmek istediğimiz rakamı girip convert butonuna bastığımızda karşımıza sonuç gelecektir. Ancak web servis bir xml tabanlı olduğu için sonucumuz da xml formatında gelecektir.

Programımızın ikinci aşamasına gelelim. İkinci programımızın paket adı “edu.burakkk.webservice.tempConverter.v2”dır. Web servisimizi yaratalım.

TempConverter.java


package edu.burakkk.webservice.tempConverter.v2;

/**
 * Web Service
 * Temp Converter
 *
 *@version 1.1 Release 1
 *@author Burak ISIKLI
 *
 **/

public class TempConverter {
 public String Convert(String type, String Input) {
 if (Input.isEmpty() || !isNumber(Input)) {
 return "ERROR! Please enter the input number...";
 }
 // Fahrenheit To Celsius
 if (type.equals("F")) {
 double result = 0;
 result = Double.parseDouble(Input);
 result = (((result) - 32) / 9) * 5;
 Input = Double.toString(result);
 return Input;
 }
 // Celsius To Fahrenheit
 else if (type.equals("C")) {
 double result = 0;
 result = Double.parseDouble(Input);
 result = (((result) * 9) / 5) + 32;
 Input = Double.toString(result);
 return Input;
 }
 return "ERROR! Please enter the input number...";

 }

 private boolean isNumber(String num) {
 try {
 Double.parseDouble(num);
 } catch (NumberFormatException nfe) {
 return false;
 }
 return true;
 }
}

Bu prosesimiz bir öncekinden biraz daha farklı oldu. Bu prosesimizde tek fonksiyonda olayı çözdük. Ancak fahrenheit mı celcius mu olduğunu kısaca hangi tür olduğunu kullancıdan başkan bir değişken isteyerek yaptık. Bu istediğimiz değişkeni formda belirleyerek programa derdimizi anlattık. Böylelikle tek hamlede istediğimiz web servisi yapmış olduk. Aslında benim yaptığım hata döndürme olaylarını da web tarafında yapmak daha doğru olur. Basit bir örnek vermek istediğim için detaylı incelemedim. Formda javascriptle gerekli eklemeler yapılarak hatta ajax kullanılarak çok daha kullanışlı bir sayfa yapmak mümkün olabilir.

TempConverter.v1.1.jsp

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Temp Converter</title>
</head>
<body>
<form
 action='http://localhost:8080/WebService/services/TempConverter/Convert'
 method="post">
<table>
<tr>
<td>Enter the input number: <input type="text" size="30" name="Input"></td>
</tr>
<tr>
<td><input type="radio" name="type" value="F" /> Fahrenheit
 <input type="radio" name="type" value="C" checked /> Celsius</td>
</tr>
<tr>
<td align="left"><input type="submit" value="Convert"
 class="button"></td>
</tr>
</table>
</form>
</body>
</html>

Ekran Görüntüsü:

Result-245 Celcius’u Fahrenheit’e çevirmek istediğimizde karşımıza gelen ekran şu şekilde olacaktır.

Ekran Görüntüsü:

Result-3

Axis 2 Kullanılarak Web Servis Oluşturma

Posted in Java, Web Services by Burak IŞIKLI on 14 Temmuz 2009

“Web servis nedir” yazımda web servisin ne olduğunu nerelerde ne amaçla kullandığını anlatmaya çalıştım ancak örnek vermeyince konu biraz havada kaldı. Bu nedenle eğer web servis nedir bilmiyorsanız önce bu yazımı okumanızı öneririm.

Örnek olarak Axis 2’yi kullanarak web servis oluşturup buna bağlanarak gerekli bilgiyi alacağız.

Gerekenler:

  1. Java
  2. Axis 2 Version 1.4
  3. Eclipse
  4. Tomcat

Örneğimize geçmeden önce axis nedir onu anlamalıyız.

Axis 2:

Axis 2, web servisler için oluşturulmuş çekirdek makinadır(core engine). Bize SOAP kullanılarak dizayn ve yazma sağlayan apache tarafından geliştirilmiş proje diyebiliriz. Java ve C programlama dillerini desteklemektedir. Ayrıca REST ve Spring Framework desteği de mevcuttur.

Axis 2 bazı özellikleri şunlardır:

  • Yeni XML işleme(process) çekirdeği modeli, AXIOM (AXIs Object Model)
  • A blocking ve non-blocking istemci API (application programming interface)
  • WS-Addressing desteği
  • HTTP (Hypertext Transfer Protocol), SMTP (Simple Mail Transfer Protocol), ve TCP (Transmission Control Protocol) iletişimi için destek

Axis 2 Mimarisi:

axis2

Kısaca bir SOAP uygulama çatısı olduğunu gördük. Tomcat gibi servlet motorlarına eklenebilir. Bizim tarifimizde kullanacagımız bölüm WSDL’den Java sınıfları üreten kısım olacak. Daha detaylı bilgi için lütfen burayı tıklayınız.

Axis 2’yi binary dosyasını bu linkten indirdikten sonra kurmaya başlayabiliriz. Axis’in kurulum kısmı biraz tarif modunda olacak ama elimden geldiğince her adımı nedenini detaylı anlatmaya çalışacağım.

1-) Binary dosyasını istediğiniz herhangi bir dizine açtıktan sonra Eclipse IDE’sini açıyoruz. Menüden sırasıyla Window -> Preferences seçeneğini tıklıyoruz. Açılan menüden Web Services’dan Axis2 Prefences seçeneğini seçiyoruz. Karşımıza aşağıdaki resimdeki gibi bir ekran gelecektir. Axis2’nin kurulu olduğu dizini seçiyoruz. Böylelikle Eclipse’e axis2’yi tanıtmış oluyoruz.

Step 1

2-) İkinci adımımız dinamik bir web projesi oluşturmaktır. File > New > Project seçeneğinden web bölmesinin altında Dynamic Web Project seçiyoruz. Proje için bir isim veriyoruz. Biz örneğimizde WebService adını kullanacağınız.

Step 2

Step 2

Burada dikkat edilmesi gereken nokta Configuration kısmıdır. Tomcat’in seçeneğinin yanında bulunan Modify butonuna tıkladıktan sonra aşağıdaki gibi bir menü açılacaktır. Burada “Axis2 Web Services” seçeneğinin işaretli olmasına dikkat etmemiz gerekiyor.

Step 2

3-) Artık web servisimize ait sınıflarımızı oluşturmaya başlayabiliriz. edu.burakkk.webservice.example paket isimli MyService adında bir  sınıf oluşturuyoruz.

Step 3

Sınıfımıza aşağıdaki kodu yazıyoruz:

SumService.java

</pre>
package edu.burakkk.webservice.example;

/**
 * Web Service Example
 * Sum of two numbers
 *
 *@version 1.0 Release 1
 *@author Burak ISIKLI
 *
 **/

public class SumService {
 public String sum(Integer a, Integer b) {
 return a + " + " + b + " = " + (a + b);
 }
}

4-) SumService sınıfımıza sağ tıklıyoruz. Web Services -> Create Web Service seçeneğine tıklıyoruz. Ekrana gelen menüde Web Service runtime seçeniğinin Axis 2 olmasını sağlıyoruz. Bunun için yazının üstüne tıklayarak Axis 2 seçiyoruz.

Step 4

Step 4

Step 4

Last Step

5-) Start Server butonuna bastıktan sonra web servisimiz yaratılmış ve başlatılmış olacaktır. Web servis’e ulaşmak için http://localhost:8080/WebService/services/SumService/sum?a=6&b=76 yazdığımız takdirde aşağıdaki gibi bir ekran karşımıza gelecektir.

Result

Web servise ulaştırken, a ve b değişkenlerini yazdıktan sonra toplayacağımız sayıları yazıyoruz. Biz örnek olarak a’ya 6, b’ye de 76 değerini verdik. Ayrıca Axis 2’nin oluşturduğu wsdl dosyasına http://localhost:8080/WebService/services/SumService?wsdl linkinden ulaşabiliriz. Şimdilik bu basit örnek bize yol göstermek web servisin ne olduğunu anlamak içindi. Gelecek web serviste daha detaylı bir örnekle daha da anlaşılır hale gelecektir.

Kaynaklar:

http://en.wikipedia.org/wiki/Apache_Axis2

http://www.ibm.com/developerworks/webservices/library/ws-webaxis1/

http://www.javaworld.com/javaworld/jw-09-2003/jw-0912-fop.html?page=2

http://omeryurduseven.blogspot.com/2008/07/web-service-sample-in-eclipse-using.html

http://javamanyaklari.com/2007/06/axis-ile-stub-olusturarak-web-servis-kullanimi.jsp

http://eclipse.dzone.com/articles/web-services-development-with-