Dari hari jumat kemaren saya nulis aplikasi database sederhana tapi nerapin RMI di dalamnya, untuk manggil method yang berfungsi untuk melakukan beberapa proses ke database. Dari hari jumat ketemu masalah dan stuck di situ, connection variabel yang sial itu selalu null. Hari ini dah ketemu pemecahannya, satu dari sekian cara mungkin
Sebelum lanjut berikut ini pemahaman saya tentang RMI, RMI itu di pake memanggil method yang ada di komputer lain (bisa jadi server) secara remote. Untuk memakai suatau method sebenarnya saya cukup membuat object dari class yang memiliki method yang ingin dipakai dan memanggil method itu via object tsb. Tapi bagaimana klo method tersebut ada di komputer lain? Karena itulah saya pake RMI. Bagaimana teori kerjanya secara masih sedang dipelajari. Nanti saya tulis dipost selanjutnya. Ok lanjut…
Editor yang saya pake NETBEANS 5.5 dengan JDK 1.5
Ini model tabel database-nya dari app yang dibuat:

Berhubung saya juga nerapin arsitektur MVC maka saya buat modelnya(setter/getter) dulu:
Code:
package model;
import java.io.Serializable;
/**
*
* @author JollkY
*/
public class Book implements Serializable {
private int id;
private String title;
private int page;
private String publisher;
private String writer;</font>
/** Creates a new instance of Book */
public Book() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
[........ source lengkapnya di http://www.4shared.com/file/29059871/5faf7c8/src.html .......]
}
Sebelum lanjut untuk membuat controller dan DAO-nya, diperlukan design method-nya dulu dalam suatu interface sehingga untuk controller dan DAO-nya tinggal implements aje gitu.Code: package design;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import model.Book;
/**
*
* @author JollkY
*/
public interface dataAccessObject extends Remote {
public int saveBook(Book objBuku) throws RemoteException;
public int deleteBook(int idBuku) throws RemoteException;
public int editBook(Book objBuku) throws RemoteException;
public List<Book> getAllBook() throws RemoteException;
public Book getBookById(int id) throws RemoteException;
public Book getBookByTitle(String title) throws RemoteException;
public Book getBookByWriter(String writer) throws RemoteException;
}
err… dari listing method yang ada di interface itu, saya baru buat coding lenkap untuk method getAllBook(), yang lainnya blum. Blum sempat aja. Selanjutnya adalah buat File koneksi dolo.
Code:
package Connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
*
* @author JollkY
*/
public class DBConnection {
private Connection con = null;
private String DRIVER = “com.mysql.jdbc.Driver”;
private String URL = “jdbc:mysql://localhost:3306/mybook”;
private String USER = “binsus”;
private String PASS = “phpBB2″;
/**
* Creates a new instance of DBConnection
*/
public DBConnection() {
if(con==null) {
try {
Class.forName(DRIVER).newInstance();
this.con = DriverManager.getConnection(URL, USER, PASS);
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
public Connection getConnection() {
return this.con;
}
[.....Source lengkap di sini.....]
}
Abis itu buat code untuk controller dan DAO. Controller dan DAO ini yang merupakan implement dari interface dataAccessObject, nantinya di letakkan di sisi server yang dipakai server untuk membuat koneksi dan melakukan akses ke database.
Berikut code controller
Code:
package controller;
import Connection.DBConnection;
import dao.BookDao;
import design.dataAccessObject;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import model.Book;
/**
*
* @author JollkY
*/
public class BookController implements dataAccessObject {
/** Creates a new instance of BookController */
public BookController() throws RemoteException {
UnicastRemoteObject.exportObject(this);
}
public int saveBook(Book objBuku) throws RemoteException {
return 0;
}
public int deleteBook(int idBuku) throws RemoteException {
return 0;
}
public int editBook(Book objBuku) throws RemoteException {
return 0;
}
public List<Book> getAllBook() throws RemoteException {
List<Book> listBook = new ArrayList<Book>();
DBConnection con = new DBConnection();
BookDao dao = new BookDao(con.getConnection());
listBook = dao.getAllBook();
return listBook;
}
[.....Source lengkap di sini....]
}
berikut code DAO,
Code:
package dao;
import Connection.DBConnection;
import design.dataAccessObject;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import model.Book;
/**
*
* @author JollkY
*/
public class BookDao implements dataAccessObject {
private Connection con = null;
private PreparedStatement st = null;
private ResultSet rs = null;
int sukes = 0;
/** Creates a new instance of BookDao */
public BookDao(Connection con) {
this.con = con;
}
public int saveBook(Book objBuku) throws RemoteException {
return 0;
}
public int deleteBook(int idBuku) throws RemoteException {
return 0;
}
public int editBook(Book objBuku) throws RemoteException {
return 0;
}
public List<Book> getAllBook() throws RemoteException {
String query = “SELECT * FROM buku”;
List<Book> daftarBuku = new ArrayList<Book>();
if(this.con==null) {
System.out.println(“Con null”);
}
try {
this.st = this.con.prepareStatement(query);
this.rs = this.st.executeQuery();
while(this.rs.next()) {
Book b = new Book();
b.setId(this.rs.getInt(1));
b.setTitle(this.rs.getString(2));
b.setPage(this.rs.getInt(3));
b.setPublisher(this.rs.getString(4));
b.setWriter(this.rs.getString(5));
daftarBuku.add(b);
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return daftarBuku;
}
[....sorce lengkap di sini....]
}
Code untuk server
Code:
package Server;
import controller.BookController;
import design.dataAccessObject;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
/**
*
* @author JollkY
*/
public class ServerBook {
/** Creates a new instance of ServerBook */
public ServerBook() {
try {
// String name = “dataAccessObject”;
dataAccessObject bookController = new BookController();
// dataAccessObject stub = (dataAccessObject) UnicastRemoteObject.exportObject(bookController, 0);
// Registry regist = LocateRegistry.getRegistry();
// regist.rebind(name, stub);
Naming.rebind(“dataAccessObject”, bookController);
System.out.println(“Server Ready”);
} catch(Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
new ServerBook();
}
}
Naming.rebind(“dataAccessObject”, bookController); - berguna untuk melakukan remote call ke RMI registry yang ada di localhost.
Code untuk client
Code:
package Client;
import controller.BookController;
import design.dataAccessObject;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.List;
import model.Book;
/**
*
* @author JollkY
*/
public class Tester {
/** Creates a new instance of Tester */
public Tester() {
}
public static void main(String[] args) {
try {
//Registry regis = LocateRegistry.getRegistry();
//dataAccessObject dataBuku = (dataAccessObject) regis.lookup(“dataAccessObject”);
Object obj = Naming.lookup(“dataAccessObject”);
dataAccessObject dataBuku = (dataAccessObject) obj;
// BookController dataBuku = new BookController();
List<Book> allBook = dataBuku.getAllBook();
// System.out.println(allBook);
for(Book b:allBook) {
System.out.println(b.getId());
System.out.println(b.getTitle());
System.out.println(b.getPage());
System.out.println(b.getPublisher());
System.out.println(b.getWriter());
System.out.println(“======================”);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Naming looku, untuk melihat apakah di dalam rmiregistry ada object dengan nama “dataAccessObject”. Obect ini sebenarnya bertipe dataAccessObject, tetapi saat “diambil” dari rmiregistry dia kehilangan tipe datanya. Untuk perlu dilakukan casting
dataAccessObject dataBuku = (dataAccessObject) obj;
Compiling and Running…
1. Lakukan hal berikut. Klik kanan pada nama project -> pilih Properties -> klik menu Run -> Browse main class -> pilih class server (“ServerBook” untuk app saya). Hal ini berguna untuk memberitahukan pada java, untuk menjalankan class ini saat saya mengeksekusi file .jar -nya.
2. Compile fil-file tersebut

3. Buat class stub dan skeleton -nya.

4. Jalankan rmregistry. Lakukan ini dalam folder src, sebab akan gagal saat menjalankan server jika dilakukan di luar folder src. Blum tau juga apa sebabnya T.T

5. Pindah ke folder dist dan eksekusi file .jar -nya

6. Eksekusi file file client

Hampir lupa ini struktur project di netbean -nya

Masalah yang saya temukan adalah saat saya menjalankan server sama dengan cara menjalankan client, variabel connection selalu null. Tapi setelah melakukan point 1 dan point 5 server berjalan dengan lancar. Dan jangan lupa pada class Book perlu implements Serializable.
Link download http://www.4shared.com/file/29059871/5faf7c8/src.html
that’s all for today, Gracias
Recent Comments