İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Barış Efe

Nedir bu J2ME?

ÖZET

Bu projenin amacı J2ME(Java 2, Micro Edition) MIDP profili ve Java Servlet teknolojileri kullanarak öğrencilerin J2ME MIDP profilini destekleyen kablosuz cihazlarından sunucuya bağlanarak çeşitli bilgileri sorgulamalarını sağlayan bir sistem geliştirmektir.

TERİMLER

J2ME
Java 2 Micro Edition küçük cihazlar için tanımlanmış bir grup belirtim ve teknolojidir. J2ME belli sınıflardaki cihazlar için bir grup konfigürasyon ve profillere bölünmüştür
CLDC
CLDC(Connected, Limited Device Configuration) J2ME nın en yaygın konfigürasyonudur. CLDC 512 KB tan ufak hafızası ve sınırlı ağ bağlantısı olan aletler için tasarlanmıştır. CLDC KVM olarak adlandırılan JVM(Java Virtual Machine) i ve uygulamalar için temel olan bir takım kütüphaneleri belirler.
MIDP
Mobile Information Device Profile J2ME nin bir profilidir. CLDC nin üstündeki bir profil olarak yer alır ve uygulamanın yaşam döngüsü, kullanıcı grafik arabirimleri, iletişim ağı ve kalıcı depolama ile ilgili kütüphaneleri içerir.
Midlet
MIDLET MIDP profili için yazılmış uygulamalara verilen isimdir.
MIDlet suite
MIDletler MIDlet Suite ler olarak paketlenir ve dağıtılır. Bir Midlet Suite bir veya daha fazla Midlet ten oluşabilir. Midlet Suite .jar ve.jad olarak 2 dosyadan meydana gelir. .jad uzantılı dosya tanımlayıcı dosya, .jar uzantılı dosya Midlet, kullanılan kütüphaneler, kaynak dosyaları gibi dosyaları içeren arşiv dosyasıdır. Servlet : Java nın sunucu tarafında çalışan bir teknolojisidir.

GİRİŞ

Projenin bir ayağında bir MIDlet uygulaması geliştirilecek ve bu uygulama kablosuz cihaza yüklendikten sonra sunucu üzerinde bulunan Servlet ile iletişime geçerek yapılan sorgulamalara göre kullanıcıya bilgi sunacaktır. İlk olarak öğrenciler, midlet olarak geliştirilmiş uygulamayı Bilişim Enstitüsünün sanaldoku yöresinden kablosuz cihazlarına yüklerler. Daha sonra bu uygulama üzerinden yapılan sorgulamalar ile servletle iletişime geçilir ve gerekli bilgiler kablosuz cihazlarında gösterime sunulur.

TEKNOLOJİ – NEDİR BU J2ME?

Java ilk olarak avuçiçi ve taşınabilir cihazlar için tasarlanmış fakat sonraları çeşitli sebeplerden dolayı çıkış amacından uzaklaşmıştır. Java, J2ME ile çıkış günlerindeki amacına geri dönmektedir. Günümüzde Java platformu 3 ana kategoriye ayrılır:

J2ME sadece bir bir belirtim değildir. J2ME, kablosuz cihaz pazarının farklı bölümleri için geliştirilmiş belirtim ve teknolojilerin toplamıdır. Kablosuz cihaz pazarının çeşitliliğinden dolayı herşeye uyacak standart bir çözüm getirilemediğinden dolayı böyle bir çözüm üretilmiştir.

JAVA Kavram Haritası

KONFİGÜRASYON VE PROFİLLER

J2ME çeşitli konfigürasyon ve profillere bölünmüştür. Konfigürasyonlar JVM(Java Virtual Machine) detaylarını ve belli sınıftaki cihazlarla kullanılabilecek temel kütüphaneleri tanımlayan belirtimlerdir. Mesela 512KB bellekten az hafıza alanı ve sınırlı bir ağ bağlantısı olan cihazların konfigürasyonu CLDC olarak adlandırılır. CLDC lere örnek olarak bazı cep telefonları ve avuç içi bilgisayarlar(PDAs) verilebilir. Daha fazla belleğe ve işlemci gücüne sahip, sürekli ağ bağlantısı olan diğer konfigürasyon ise CDC olarak adlandırılır (Connected Device Configuration). Bunlara örnek olarak ise Sharp Zaurus avuç içi bilgisayarları verilebilir.

Profiller uygulama geliştirmeye daha yetkin bir ortam sunabilmek için konfigürasyonun üzerine tanımlanan kütüphanelerdir. Konfigürasyon java sanal makinesi (JVM) ve temel kütüphaneleri tanımlarken, bir uygulama geliştirilirken ihtiyaç duyulabilecek yetkinlikte kütüphaneleri tanımlamaz. Profiller bu alanda uygulamanın yaşam döngüsü, kullanıcı arabirimi ve kalıcı bellek kütüphanelerini içerirler.

JAVA Kavram Haritası

Şimdi bu konfigürasyon ve profillerden bazılarını inceleyelim:

CLDC Konfigürasyonu

CLCD(Connected, Limited Device Configuration) daha kısıtlı kaynaklara sahip cihazlara yönelik bir J2ME konfigürasyonudur. Bu profilin çekirdeğinde bir java sanal makinesi olan KVM yatmaktadır. KVM, JVM in bazı kısımlarının çıkartılarak daha önemli ve gerekli parçalarını içerecek şekilde tasarlanmış halidir. KVM ismindeki K harfi bu sanal makinenin Megabyte boyutunda hafızayla değil Kilobyte boyutunda hafıza ile çalışabilmesinden gelmektedir. Bu konfigürasyon 512 KB tan ufak hafızası ve sınırlı ağ bağlantısı olan cihazlar için tasarlanmıştır.

Bu konfigürasyonun ait Java paketleri:

CDC Konfigürasyonu

CLCD(Connected Device Configuration) daha az kısıtlı kaynaklara sahip cihazlara yönelik bir J2ME konfigürasyonudur. Bu profilin çekirdeğinde de CVM(Compact Virtual Machine) sanal makinesi bulunmaktadır. Genellikle CLDC den daha fazla hafıza ve işlemci gücüne sahip cihazlarda kullanılır. Ayrıca bu cihazlar sürekli ağ bağlantısına sahiptirler.

Bu konfigürasyonun ait Java paketleri:

MIDP Profili

MIDP(Mobile Information Device Profile) mevcut profiller arasında ilk ve en yaygın olanıdır ve uygulamanın yaşam döngüsü, kullanıcı grafik arabirimleri, iletişim ağı ve kalıcı depolama ile ilgili kütüphanelerini içerir. MIDP CLDC konfigürasyonunun üzerine oturur ve günümüzde Motorola, Nokia, Ericsson ve RIM(Blackburry) gibi sector devleri tarafından desteklenmektedir.

MIDP 1.0 ın desteklediği paketler:

MIDP 2.0 ın desteklediği paketler:

Günümüzde J2ME özelliğine sahip cep telefonlarının büyük bir çoğunluğu aşağıdaki özellikleri içermektedir

MIDP kapasiteli cihaz mimarisi

CDC Tabanlı Bazı Profiller

CDC konfigürasyonu üzerindeki bazı profiller şunlardır: Foundation Profil, Personal Basis Profil ve Personal Profil.

Basit olarak tanımlamak gerekirse Foundation Profil CDC nin üzerine ektradan J2SE nesneleri ekler. Bu profile sahip cihazların en onemli özelliği sürekli ağ bağlantısı olmasına karşılık kullanıcı arabirimine sahip olmamasıdır. Ayrıca ekstra güvenlik nesneleri kullanır. Daha çok diğer profillere temel oluşturur.

Personal Profil Foundation Profil üzerinde AWT kullanıcı arabirimi nesnelerinin bir alt kümesini içerir.

Personal Profil ise PersonalJava uygulama çevresini J2ME profile olarak yeniden tanımlar. Bu profil AWT kullanıcı arabirimi nesnelerini daha fazla kapsayacak şekilde tanımlanmıştır.

CDC tabanlı bazı profiler ve ilişkileri

MIDP PROGRAMMING, MIDLETLER

MIDP profili için yazılan uygulamalar Midlet olarak tanımlanır.

Bir MIDP uygulaması geliştirmek için bazı temel bilgileri edinmek gerekir. Bunlardan bazıları: midletlerin yaşam döngüsü, kullanıcı arabirimleri, komut işleme, konuşlandırma ve uygulama yönetimi olarak sayılabilir.

MIDlet Yaşam Döngüsü

Uygulama Yönetim Yazılımı(Application Management Software, AMS) midlet in kurulumu, başlaması, durdurulması ve kaldırılması ile ilgili işlemlerin yapıldığı ortamdır. AMS Java Uygulama Yöneticisi (Java Application Manager) olarak da bilinir. Midletler 3 durumda bulunabilir: durağan (paused), etkin (active), ölü(destroy).

Bir midlet yaratıldığı ve başlatıldığı zaman durağan moddadır. Eğer MIDlet yapılandırıcısında(constructor) kural dışı bir durum oluşursa(exception) MIDlet ölü durumuna geçer. MIDlet ler etkin durumdan durağan durumuna pauseApp() methodunu tamamladıktan sonra geçebilirler. Veya etkin konumdan durağan duruma startApp() methodunu tamamladıktan sonra geçebilirler. MIDletler ölü konumuna destroyApp(boolean unconditional) methodunun tamamlanmasından sonra geçerler.Bu method MIDlet kullandığı kaynakları serbest bırakır ve gerekli temizleme işlemlerini yapar.

Bir MIDlet yazılımcısı yazılımını etkin modda çalıştırır ve gerektiği zaman diğer durumlar arasında geçişleri sağlar.

MIDP Kullanıcı Arabirimi

MIDP kullanıcı arabirimi düşük ve ve yüksek düzey olmak üzere iki ana kategoriye ayrılır. Düşük düzey kullanıcı arabirimi Canvas isimli nesneye dayanır. Yüksek düzey kullanıcı arabirim nesneleri ise Alert, Form, List ve TextBox olarak sıralanabilir. Bu nesnelerin görünüş biçimleri profilin gerçekleştirildiği cihazların kullanıcı arabirimlerine göre değişebilir.

Canvas nesnesi ile kullanıcı arabirimine daha direk kontrol sağlanır. Mesela ekranda nelerin çizileceği ve klavye olayları hakkında daha geniş bir kontrol sağlanır. Kullanıcı arabirimlerini kullanırken en önemli, dikkat edilmesi gereken nokta yazacağımız MIDletlerin değişik kapasiteli cihazlarda çalışabiliyor olmasıdır. Dolayısı ile ekran genişliği, ekranın renkli veya siyaz-beyaz oluşuna göre bir takım kontroller yaptırarak MIDletlerimizi bu değişik ortamlara uyum sağlayabilecek şekilde yazmalıyız.

MIDlet Suites ve Uygulama Tanımlayıcıları

Uygulama Yönetim Yazılımı(Application Management Software, AMS) midlet in kurulumu, başlaması, durdurulması ve kaldırılması ile ilgili işlemlerin yapıldığı ortamdır.

Bir veya daha fazla MIDlet ‘MIDlet Suite’ denen JAR uzantılı dosyalara paketlenir. Her JAR dosyasının içeriğini tanımlayan JAD uzantılı uygulama tanımlayıcı dosyası vardır. Bu dosyalar Uygulama Yönetim Yazılımları tarafından kullanılır.

JAR ve JAD uzantılı dosyaların cep telefonlarına indirilebilmesi için bu dosyaların indirileceği web sunucuları üzerinde aşağıdaki MIME tiplerinin tanımlanması gerekmektedir:

.jar	application/java-archive
.jad	text/vnd.sun.j2me.app-descriptor

Ayrıca uygulama tanımlayıcısından dinamik olarak değer almak için MIDlet içinden getAppPropoerty (String key) methodu da kullanılabilir. Böylece JAR dosyasını değiştirmeye gerek kalmadan JAD dosyası üzerinden bazı değişiklikler ile MIDlet imizin çeşitli işlevlerini değiştirebiliriz.

Örnek bir JAD dosyası:

MIDlet-1: MerhabaDunya, , example.hello.HelloWorldMIDlet
MIDlet-2: ZiplayanYazi, , example.hello.BouncingTextMIDlet
MIDlet-Jar-Size: 7822
MIDlet-Jar-URL: HelloExamples.jar
MIDlet-Name: HelloExamples
MIDlet-Vendor: Ozgur Yazilim
MIDlet-Version: 1.0.1
ZiplayanYazi-BaslangicYazisi: MIDlet ler eğlenceli!

Yukarıdaki MIDlet Suite, Uygulama Yönetim Yazılımı tarafından yüklendiğinde hangi MIDlet in başlatılmak istendiği sorulacak, seçime gore ilgili MIDlet sisteme yüklenerek çalıştırılacaktır.

MIDlet Örneği

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import javax.microedition.midlet.*;
  2 import javax.microedition.lcdui.*;
  3 public class MerhabaDunya extends MIDlet implements CommandListener {
  4     // çıkış komutu
  5     private Command exitCommand; 
  6     // display nesnesi
  7     private Display display;    
  8     // ticker yarat
  9     private Ticker hi = new Ticker("J2ME ornegi"); 
 10     public MerhabaDunya() {
 11         display = Display.getDisplay(this);
 12         exitCommand = new Command("Cikis", Command.SCREEN, 2);
 13     }
 14     public void startApp() {
 15         TextBox t = new TextBox("Merhaba Dunya", "Ilk yazim", 256, 0);
 16         
 17         t.addCommand(exitCommand);
 18         t.setCommandListener(this);
 19         t.setTicker(hi);
 20         display.setCurrent(t);
 21     }
 22     public void pauseApp() { }
 23     
 24     public void destroyApp(boolean unconditional) { }
 25     public void commandAction(Command c, Displayable s) {
 26         if (c == exitCommand) {
 27             destroyApp(false);
 28             notifyDestroyed();
 29         }
 30     }
 31 }

USE-CASE DIAGRAMI

VERİTABANI YAPISI

CREATE TABLE student (
  student_id int(5) NOT NULL auto_increment,
  student_number int(5) NOT NULL default '0',
  student_firstname varchar(32) NOT NULL default '',
  student_lastname varchar(32) NOT NULL default '',
  student_department_id int(5) NOT NULL default '0',
  PRIMARY KEY  (student_id)
) TYPE=MyISAM;
INSERT INTO student VALUES (1, 111, 'Baris', 'Efe', 1);
INSERT INTO student VALUES (2, 222, 'Ali', 'Aksel', 1);

CREATE TABLE student_announcement (
  student_announcement_id int(5) NOT NULL auto_increment,
  student_announcement_text varchar(255) NOT NULL default '',
  PRIMARY KEY  (student_announcement_id)
) TYPE=MyISAM;
INSERT INTO student_announcement VALUES (1, 'Finaller Ocak ayinin 2 haftasina ertelendi.');
INSERT INTO student_announcement VALUES (2, 'Ogrenci kimlikleri dagitilmaya baslandi.');

CREATE TABLE student_course (
  student_course_id int(5) NOT NULL auto_increment,
  student_course_name varchar(255) NOT NULL default '',
  PRIMARY KEY  (student_course_id)
) TYPE=MyISAM;
INSERT INTO student_course VALUES (1, 'Java');
INSERT INTO student_course VALUES (2, 'SQL');
INSERT INTO student_course VALUES (3, 'C');

CREATE TABLE student_department (
  student_department_id int(5) NOT NULL auto_increment,
  student_department_name varchar(100) NOT NULL default '',
  PRIMARY KEY  (student_department_id)
) TYPE=MyISAM;
INSERT INTO student_department VALUES (1, 'EST');

CREATE TABLE student_news (
  student_news_id int(5) NOT NULL auto_increment,
  student_news_text varchar(255) NOT NULL default '',
  PRIMARY KEY  (student_news_id)
) TYPE=MyISAM;
INSERT INTO student_news VALUES (1, 'Rektorun konusmasi 3 Ocak 2003 14:00 te Fen Fakultesinde');
INSERT INTO student_news VALUES (2, 'Kutuphaneye yeni Java kitaplari alindi.');
INSERT INTO student_news VALUES (3, 'Maslak kampusunde yeni kantin aciliyor.');


CREATE TABLE student_score (
  student_score_id int(5) NOT NULL auto_increment,
  student_number int(5) NOT NULL default '0',
  student_course int(5) NOT NULL default '0',
  student_score varchar(255) NOT NULL default '',
  PRIMARY KEY  (student_score_id)
) TYPE=MyISAM;
INSERT INTO student_score VALUES (1, 111, 1, '67');
INSERT INTO student_score VALUES (2, 111, 2, '87');
INSERT INTO student_score VALUES (3, 111, 3, '34');
INSERT INTO student_score VALUES (4, 222, 2, '97');
INSERT INTO student_score VALUES (5, 222, 3, '48');    

MIDLETLER

MIDletler bir ana nesne, duruma göre değişen ekranlar için tasarlanmış nesneler ve ağ bağlantısını sağlayan nesneden meydana geliyor. MIDletlerin kaynak kodları:

Göster Gizle Kopar Satır Gizle Satır Göster
  1 /**
  2  * Student.java
  3  * @author Baris Efe
  4  * @version 1.0
  5  */
  6 package studentlet;
  7 import java.io.*;
  8 import javax.microedition.io.*;
  9 import javax.microedition.lcdui.*;
 10 import javax.microedition.midlet.*;
 11 public class Student extends MIDlet implements CommandListener {
 12   private static Student instance;
 13   private InfoScreen scrInfoScreen;
 14   private StudentNumberScreen scrStudentNumberScreen;
 15   private WaitCanvas scrWait;
 16   private Command cancelCommand ;
 17   private HttpWorker httpWorker;
 18   public String studentNumber;
 19   private static String url = "http://localhost:8080/student";
 20   /** Constructor */
 21   public Student() {
 22     instance = this;
 23   }
 24   /** Main method */
 25   public void startApp() {
 26     Displayable current=Display.getDisplay(this).getCurrent();
 27     if (current==null){
 28       scrInfoScreen = new InfoScreen(this);
 29       scrStudentNumberScreen = new StudentNumberScreen(this);
 30       Display.getDisplay(this).setCurrent(scrStudentNumberScreen);
 31       scrWait = new WaitCanvas();
 32       cancelCommand = new Command("Iptal", Command.CANCEL, 0);
 33       scrWait.addCommand(cancelCommand);
 34       scrWait.setCommandListener(this);
 35       httpWorker = new HttpWorker(this, scrWait, url);
 36       httpWorker.start();
 37     } else {
 38       Display.getDisplay(this).setCurrent(current);
 39     }
 40   }
 41   /** Handle pausing the MIDlet */
 42   public void pauseApp() {
 43   }
 44   /** Handle destroying the MIDlet */
 45   public void destroyApp(boolean unconditional) {
 46   }
 47   /** Quit the MIDlet */
 48   public static void quitApp() {
 49     instance.destroyApp(true);
 50     instance.notifyDestroyed();
 51     instance = null;
 52   }
 53   public void networkResponse(String s) {
 54     //System.out.println("debug, Student.networkResponse(), "+s);
 55     if(s.compareTo("false")==0) {
 56       scrStudentNumberScreen.setResultText("Ogrenci numarasi bulunamadi. Lutfen tekrar deneyiniz.");
 57       this.studentNumber="";
 58       Display.getDisplay(this).setCurrent(scrStudentNumberScreen);
 59     } else {
 60       scrInfoScreen.setResultText(s);
 61       Display.getDisplay(this).setCurrent(scrInfoScreen);
 62     }
 63   }
 64   public void runHttpWorker(String queryString) {
 65     httpWorker.setQueryString(queryString);
 66     httpWorker.go();
 67   }
 68   public void showWaitScreen() {
 69     scrWait.setMessage("Baglaniyor...");
 70     Display.getDisplay(this).setCurrent(scrWait);
 71   }
 72   public void showStudentNumberScreen() {
 73     Display.getDisplay(this).setCurrent(scrStudentNumberScreen);
 74   }
 75   public void commandAction(Command c, Displayable s) {
 76     if (c == cancelCommand) {
 77       Display.getDisplay(this).setCurrent(scrInfoScreen);
 78       httpWorker.cancel();
 79     }
 80   }
 81 }

Göster Gizle Kopar Satır Gizle Satır Göster
  1 /**
  2  * StudentNumberScreen.java
  3  * @author Baris Efe
  4  * @version 1.0
  5  */
  6 package studentlet;
  7 import java.io.*;
  8 import javax.microedition.io.*;
  9 import javax.microedition.lcdui.*;
 10 import javax.microedition.midlet.*;
 11 public class StudentNumberScreen extends Form implements CommandListener{
 12   private Student midlet;
 13   private StringItem txtResultText;
 14   private TextField txtStudentNumber;
 15   public StudentNumberScreen(Student midlet) {
 16     super("Ogrenci Bilgi");
 17     this.midlet=midlet;
 18     try {
 19       txtStudentNumber = new TextField("Ogrenci Numarasi:","",10,0);
 20       txtResultText = new StringItem("", "");
 21       setCommandListener(this);
 22       addCommand(new Command("Gonder", Command.OK, 1));
 23       this.append(txtStudentNumber);
 24       this.append(txtResultText);
 25     }
 26     catch(Exception e) {
 27       e.printStackTrace();
 28     }
 29   }
 30   public void setResultText(String httpResponseText) {
 31     txtResultText.setText(httpResponseText);
 32   }
 33   public void commandAction(Command command, Displayable displayable) {
 34     if (command.getCommandType() == Command.OK) {
 35       midlet.studentNumber = txtStudentNumber.getString();
 36       midlet.showWaitScreen();
 37       midlet.runHttpWorker("action=getStudentNumber&studentNumber="+txtStudentNumber.getString());
 38     }
 39   }
 40 }

Göster Gizle Kopar Satır Gizle Satır Göster
  1 /**
  2  * InfoScreen.java
  3  * @author Baris Efe
  4  * @version 1.0
  5  */
  6 package studentlet;
  7 import java.io.*;
  8 import javax.microedition.io.*;
  9 import javax.microedition.lcdui.*;
 10 import javax.microedition.midlet.*;
 11 public class InfoScreen extends Form implements CommandListener{
 12   private Student midlet;
 13   private StringItem txtResultText;
 14   public InfoScreen(Student midlet) {
 15     super("Ogrenci Bilgi");
 16     this.midlet=midlet;
 17     try {
 18       txtResultText = new StringItem("", "");
 19       setCommandListener(this);
 20       addCommand(new Command("Duyuru?", Command.SCREEN, 1));
 21       addCommand(new Command("Haber?", Command.SCREEN, 1));
 22       addCommand(new Command("Not?", Command.SCREEN, 1));
 23       addCommand(new Command("Numara?", Command.SCREEN, 1));
 24       addCommand(new Command("Cikis", Command.SCREEN, 1));
 25       this.append(txtResultText);
 26     }
 27     catch(Exception e) {
 28       e.printStackTrace();
 29     }
 30   }
 31   public void setResultText(String httpResponseText) {
 32     txtResultText.setText(httpResponseText);
 33   }
 34   public void commandAction(Command command, Displayable displayable) {
 35     if (command.getCommandType() == Command.OK) {
 36         midlet.showWaitScreen();
 37         midlet.runHttpWorker("action=test");
 38     } else if (command.getCommandType() == Command.SCREEN) {
 39       String commandName = command.getLabel();
 40       System.out.println("commandName:"+commandName);
 41       if (commandName.equals("Duyuru?")) {
 42         midlet.showWaitScreen();
 43         midlet.runHttpWorker("action=announcement");
 44       } else if (commandName.equals("Haber?")) {
 45         midlet.showWaitScreen();
 46         midlet.runHttpWorker("action=news");
 47       } else if (commandName.equals("Not?")) {
 48         midlet.showWaitScreen();
 49         midlet.runHttpWorker("action=scores&studentNumber="+midlet.studentNumber);
 50       } else if (commandName.equals("Numara?")) {
 51         midlet.showStudentNumberScreen();
 52       } else if (commandName.equals("Cikis")) {
 53         midlet.quitApp();
 54      }
 55     }
 56   }
 57 }

Göster Gizle Kopar Satır Gizle Satır Göster
  1 /**
  2  * WaitCanvas.java
  3  * @author Baris Efe
  4  * @version 1.0
  5  */
  6 package studentlet;
  7 import java.util.*;
  8 import java.io.*;
  9 import javax.microedition.io.*;
 10 import javax.microedition.lcdui.*;
 11 public class WaitCanvas extends Canvas {
 12   private int mCount, mMaximum;
 13   private int mInterval;
 14   private int mWidth, mHeight, mX, mY, mRadius;
 15   private String mMessage="Studentlet...";
 16   public WaitCanvas() {
 17     mCount = 0;
 18     mMaximum = 36;
 19     mInterval = 100;
 20     mWidth = getWidth();
 21     mHeight = getHeight();
 22     // Calculate the radius.
 23     int halfWidth = (mWidth - mRadius) / 2;
 24     int halfHeight = (mHeight - mRadius) / 2;
 25     mRadius = Math.min(halfWidth, halfHeight);
 26     // Calculate the location.
 27     mX = halfWidth - mRadius / 2;
 28     mY = halfHeight - mRadius / 2;
 29     // Create a Timer to update the display.
 30     TimerTask task = new TimerTask() {
 31       public void run() {
 32         mCount = (mCount + 1) % mMaximum;
 33         repaint();
 34       }
 35     };
 36     Timer timer = new Timer();
 37     timer.schedule(task, 0, mInterval);
 38   }
 39   public void setMessage(String s) {
 40     mMessage = s;
 41     repaint();
 42   }
 43   public void paint(Graphics g) {
 44     int theta = -(mCount * 360 / mMaximum);
 45     // Clear the whole screen.
 46     g.setColor(255, 255, 255);
 47     g.fillRect(0, 0, mWidth, mHeight);
 48     // Now draw the pinwheel.
 49     g.setColor(0, 0, 0);
 50     g.drawArc(mX, mY, mRadius, mRadius, 0, 360);
 51     g.fillArc(mX, mY, mRadius, mRadius, theta +  90, 90);
 52     g.fillArc(mX, mY, mRadius, mRadius, theta + 270, 90);
 53     // Draw the message, if there is a message.
 54     if (mMessage != null)
 55       g.drawString(mMessage, mWidth / 2, mHeight,
 56           Graphics.BOTTOM | Graphics.HCENTER);
 57   }
 58 }

Göster Gizle Kopar Satır Gizle Satır Göster
  1 /**
  2  * HttpWorker.java
  3  * @author Baris Efe
  4  * @version 1.0
  5  */
  6 package studentlet;
  7 import java.io.*;
  8 import javax.microedition.io.*;
  9 import javax.microedition.lcdui.*;
 10 public class HttpWorker extends Thread {
 11   private Student midlet;
 12   private WaitCanvas scrWait;
 13   private String url;
 14   private HttpConnection httpConnection;
 15   private boolean mTrucking, mCancel;
 16   private String queryString = null;
 17   public HttpWorker(Student midlet, WaitCanvas waitCanvas, String url) {
 18     this.midlet=midlet;
 19     scrWait = waitCanvas;
 20     this.url = url;
 21     mTrucking = true;
 22     mCancel = false;
 23   }
 24   public synchronized void run() {
 25     while (mTrucking) {
 26       try { wait(); }
 27       catch (InterruptedException ie) {}
 28       if (mTrucking) connect();
 29     }
 30   }
 31   public synchronized void setQueryString(String queryString) {
 32     this.queryString=queryString;
 33   }
 34   public synchronized void go() {
 35     notify();
 36   }
 37   public void cancel() {
 38     try {
 39       mCancel = true;
 40       if (httpConnection != null)
 41         httpConnection.close();
 42     }
 43     catch (IOException ignored) {}
 44   }
 45   public synchronized void stop() {
 46     mTrucking = false;
 47     notify();
 48   }
 49   private void connect() {
 50     InputStream is = null;
 51     OutputStream os = null;
 52     try {
 53       byte postmsg[] = queryString.getBytes();
 54       System.out.println("debug: HttpWorker.connect(), queryString:"+queryString);
 55       // Query the server and retrieve the response.
 56       scrWait.setMessage("Gonderiyor...");
 57       httpConnection = (HttpConnection)Connector.open(url);
 58       httpConnection.setRequestMethod(HttpConnection.POST);
 59       httpConnection.setRequestProperty("User-Agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0");
 60       httpConnection.setRequestProperty("Content-Language", "en-US");
 61       httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
 62       os = httpConnection.openOutputStream();
 63       for(int i=0; i < postmsg.length;i++) {
 64         os.write(postmsg[i]);
 65       }
 66       is = httpConnection.openInputStream();
 67       // Pull back the server's response. If a content length is not
 68       // specified, we'll just read 255 bytes.
 69       int contentLength = (int)httpConnection.getLength();
 70       if (contentLength == -1) contentLength = 255;
 71       byte[] raw = new byte[contentLength];
 72       int length = is.read(raw);
 73       // Clean up.
 74       is.close();
 75       httpConnection.close();
 76       // Show the response to the user.
 77       String s = new String(raw, 0, length);
 78       midlet.networkResponse(s);
 79     }
 80     catch (IOException ioe) {
 81       if (mCancel == false) {
 82         try {
 83           if (is != null) is.close();
 84           if (httpConnection != null) httpConnection.close();
 85         }
 86         catch (IOException ignored) {}
 87       }
 88       mCancel = false;
 89     }
 90   }
 91 }

SERVLET

MIDlet servlet ile iletişime geçerek gerekli bilgileri MySQL üzerinden okur ve MIDlet’e gerekli bilgileri geri döner. Kaynak kodu aşağıda verilmiştir:

Göster Gizle Kopar Satır Gizle Satır Göster
  1 package studentserver;
  2 /**
  3  * @author Baris Efe
  4  * @version 1.0
  5  */
  6 import javax.servlet.*;
  7 import javax.servlet.http.*;
  8 import java.io.*;
  9 import java.util.*;
 10 import java.sql.*;
 11 public class student extends HttpServlet {
 12   static final private String CONTENT_TYPE = "text/html";
 13   static Connection Conn = null;
 14   static ResultSet rs = null;
 15   static Statement Stmt = null;
 16   static String DBUrl = "jdbc:mysql:///student"; // MySQL Connection address
 17   //Initialize global variables
 18   public void init() throws ServletException {
 19   }
 20   //Process the HTTP Get request
 21   public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 22     doPost(request, response);
 23   }
 24   //Process the HTTP Post request
 25   public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 26     try {
 27       int i;
 28       response.setContentType(CONTENT_TYPE);
 29       PrintWriter out = response.getWriter();
 30       String action = (String)request.getParameter("action");
 31       // MySQL Connection
 32       Class.forName("com.mysql.jdbc.Driver").newInstance();
 33       Conn = DriverManager.getConnection(DBUrl);
 34       Stmt = Conn.createStatement();
 35       if (action!=null) {
 36         if (action!="") {
 37           //System.out.println("debug, action:"+action);
 38           if (action.compareTo("news")==0) {
 39             rs = Stmt.executeQuery("SELECT student_news_text FROM student_news");
 40             i=0;
 41             while (rs.next()) {
 42               i++;
 43               out.println(i+". Haber: "+rs.getString("student_news_text"));
 44             }
 45             rs.close();
 46           } else if (action.compareTo("announcement")==0) {
 47             rs = Stmt.executeQuery("SELECT student_announcement_text FROM student_announcement");
 48             i=0;
 49             while (rs.next()) {
 50               i++;
 51               out.println("Duyuru "+i+": "+rs.getString("student_announcement_text"));
 52             }
 53             rs.close();
 54           } else if (action.compareTo("scores")==0) {
 55             String studentNumber = (String)request.getParameter("studentNumber");
 56             rs = Stmt.executeQuery("SELECT student_course_name, student_score FROM student_score, student_course WHERE student_number="+studentNumber+" AND student_course.student_course_id=student_score.student_course ");
 57             while (rs.next()) {
 58               out.println(rs.getString("student_course_name")+": "+rs.getString("student_score")+".");
 59             }
 60             rs.close();
 61           } else if (action.compareTo("getStudentNumber")==0) {
 62             boolean isStudentNumberInteger;
 63             String studentNumber = (String)request.getParameter("studentNumber");
 64             try
 65             {
 66                 Integer.parseInt(studentNumber);
 67                 isStudentNumberInteger = true;
 68             }
 69             catch(NumberFormatException e)
 70             {
 71               isStudentNumberInteger = false;
 72             }
 73             if (isStudentNumberInteger) {
 74               rs = Stmt.executeQuery("SELECT * FROM student WHERE student_number="+studentNumber);
 75               if (rs.next()) {
 76                 out.println("Hosgeldin "+rs.getString("student_firstname")+" "+rs.getString("student_lastname")+".");
 77               } else {
 78                 out.print("false");
 79               }
 80               rs.close();
 81             } else {
 82               out.print("false");
 83             }
 84           }
 85         } else {
 86           out.println("Gecersiz istek.");
 87         }
 88       }
 89     } catch (Exception E) {
 90       System.out.println(E.toString());
 91     }
 92   }
 93   //Clean up resources
 94   public void destroy() {
 95   }
 96 }

SONUÇLAR

Bu proje ile J2ME Java teknolojisi detayları ile incelenmiş ve ağ üzerinden servlet ile konuşarak öğrenci bilgilerini sorgulayan bir MIDlet gerçekleştirilmiştir. Servlet istenen bilgiler doğrultusunda MySQL üzerinden sorgulamaları gerçekleştirerek MIDlete gönderir.

Kullanıcının, ağ üzerinden sorgulama esnasında cevapsız bırakılmaması için ağ bağlantısı multithread olarak gerçekleştirilir.

Bu proje ile J2ME teknolojisi kullanılarak bir uygulama gerçekleştirilmiş ve bunun çeşitli yönleri gerçekleştirilmiştir.

KAYNAKLAR

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır