Rabu, 03 Oktober 2007

Program Client-Server menggunakan JDBC, DAO dan RMI

Program Client-Server menggunakan JDBC, DAO dan RMI
Tujuan Anda akan mengembangkan sebuah aplikasi client server, di mana sebuah Data Access Object yang berada di sisi server melayani client yang berada dalam JVM yang berbeda untuk mengakses sebuah database. Rancangan Anda mengembangkan sebuah obyek yang mengakses sebuah table dalam database, yaitu CatalogueDAO yang mengakses table CATALOGUETBL dalam database AMAZONDB. CatalogueDAO mempunyai method-method untuk menyimpan, membaca dan mengubah data dalam table tsb melalui JDBC. Anda akan menjadikan CatalogueDAO dapat berinteraksi dengan obyek lain yang berada dalam JVM yang terpisah dengan menggunakan teknik RMI. Untuk ini Anda akan mengembangkan class-class yang dibutuhkan untuk membungkus CatalogueDAO menjadi sebuah obyek yang dapat dijalankan di sisi server. Class-class ini adalah CatalogueRemote dan CatalogueRemoteImpl. Selanjutnya Anda menulis CatalogueRMIServerApp sebagai aplikasi stand alone yang bertingkah laku sebagai server untuk CatalogueRemote. Di sisi client, Anda akan menulis CatalogueRMITestClientApp untuk berinteraksi dengan obyek CatalogueRemote. Pembekalan ? Persiapan * Anda perlu meng-install terlebih dahulu Java Development Kit (JDK) * Buatlah sebuah directory untuk latihan Anda, misalnya /home/lab/kinabalu dan dibawah directory ini buatlah beberapa sub-directory : o net/developerforce/amazon/catalogue/bean o net/developerforce/amazon/catalogue/dao o net/developerforce/amazon/catalogue/rmi * Anda memerlukan mySQL server yang berjalan * Di mySQL server Anda persiapkan sebuah database yaitu AMAZONDB, Di dalam database AMAZONDB persiapkan sebuah table yaitu CATALOGUETBL. mysql> desc CATALOGUETBL; +---------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+-------+ | ISBN | varchar(20) | | PRI | | | | TITLE | varchar(255) | YES | | NULL | | | AUTHOR | varchar(255) | YES | | NULL | | | PUBLISHER | varchar(50) | YES | | NULL | | | CITY | varchar(30) | YES | | NULL | | | YEAR | varchar(4) | YES | | NULL | | | LASTUPDATEDON | varchar(8) | YES | | NULL | | +---------------+--------------+------+-----+---------+-------+ 7 rows in set (0.00 sec) Mengembangkan Class Pembantu : CatalogueBean Langkah 1 : Dengan text editor tulislah CatalogueBean.java package net.developerforce.amazon.catalogue.bean; import java.io.Serializable; import java.util.Date; public class CatalogueBean implements Serializable { public CatalogueBean(String isbn) { this.isbn = isbn; } private String isbn; public void setIsbn(String isbn) { this.isbn = isbn; } public String getIsbn() { return this.isbn; } private String title; public void setTitle(String title) { this.title = title; } public String getTitle() { return this.title; } private String author; public void setAuthor(String author) { this.author = author; } public String getAuthor() { return this.author; } private String publisher; public void setPublisher(String publisher) { this.publisher = publisher; } public String getPublisher() { return this.publisher; } private String city; public void setCity(String city) { this.city = city; } public String getCity() { return this.city; } private String year; public void setYear(String year) { this.year = year; } public String getYear() { return this.year; } private Date lastUpdatedOn; public void setLastUpdatedOn(Date lastUpdatedOn) { this.lastUpdatedOn = lastUpdatedOn; } public Date getLastUpdatedOn() { return this.lastUpdatedOn; } } Simpanlah di directory yang telah Anda persiapkan sebagai CatalogueBean.java di sub-directory net/developerforce/amazon/catalogue/bean Mengembangkan Class Utama : CatalogueDAO Langkah 2 : Dengan text editor tulislah CatalogueDAO.java package net.developerforce.amazon.catalogue.dao; import java.sql.*; import java.text.*; import java.util.Date; import net.developerforce.amazon.catalogue.bean.CatalogueBean; public class CatalogueDAO { private Connection conn; public CatalogueDAO(Connection conn) throws NullPointerException { if(conn==null) { throw new NullPointerException(); } this.conn = conn; } public CatalogueBean selectCatalogueBean(String isbn) throws SQLException { CatalogueBean bean = null; String sqlSelect = "SELECT * FROM CATALOGUETBL " + "WHERE ISBN = '" + isbn + "'"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sqlSelect); if(rs.next()) { bean = new CatalogueBean(isbn); bean.setTitle(rs.getString("TITLE")); bean.setAuthor(rs.getString("AUTHOR")); bean.setPublisher(rs.getString("PUBLISHER")); bean.setCity(rs.getString("CITY")); bean.setYear(rs.getString("YEAR")); String lastUpdatedOn = rs.getString("LASTUPDATEDON"); SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); try { Date date = format.parse(lastUpdatedOn); bean.setLastUpdatedOn(date); } catch(ParseException pe) { pe.printStackTrace(); } } return bean; } public int insertCatalogueBean(CatalogueBean bean) throws SQLException { String lastUpdatedOn = null; Date date = bean.getLastUpdatedOn(); if(date != null) { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); lastUpdatedOn = format.format(date); } Statement stmt = conn.createStatement(); String sqlInsert = "INSERT INTO CATALOGUETBL " + "VALUES (" + "'" + bean.getIsbn() + "'," + "'" + bean.getTitle() + "'," + "'" + bean.getAuthor() + "'," + "'" + bean.getPublisher() + "'," + "'" + bean.getCity() + "'," + "'" + bean.getYear() + "'," + "'" + lastUpdatedOn + "'" + ")" ; return stmt.executeUpdate(sqlInsert); } public int updateCatalogueBean(CatalogueBean bean) throws SQLException { String lastUpdatedOn = null; Date date = bean.getLastUpdatedOn(); if(date != null) { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); lastUpdatedOn = format.format(date); } String sqlUpdate = "UPDATE CATALOGUETBL " + "SET " + "TITLE = '" + bean.getTitle() + "'," + "AUTHOR = '" + bean.getAuthor() + "'," + "PUBLISHER = '" + bean.getPublisher() + "'," + "CITY = '" + bean.getCity() + "'," + "YEAR = '" + bean.getYear() + "'," + "LASTUPDATEDON = '" + lastUpdatedOn + "'" + "WHERE " + "ISBN = '" + bean.getIsbn() + "'"; Statement stmt = conn.createStatement(); return stmt.executeUpdate(sqlUpdate); } public int deleteCatalogueBean(String isbn) throws SQLException { String sqlDelete = "DELETE FROM CATALOGUETBL " + "WHERE " + "ISBN = '" + isbn + "'"; Statement stmt = conn.createStatement(); return stmt.executeUpdate(sqlDelete); } } Simpanlah di directory yang telah Anda persiapkan sebagai CatalogueDAO.java di sub-directory net/developerforce/amazon/catalogue/dao Mengembangkan Server Langkah 3 : Dengan text editor tulislah CatalogueRemote.java package net.developerforce.amazon.catalogue.rmi; import java.rmi.*; import java.sql.*; import net.developerforce.amazon.catalogue.bean.CatalogueBean; public interface CatalogueRemote extends Remote { public CatalogueBean findCatalogueBean(String isbn) throws RemoteException, SQLException; public int createCatalogueBean(CatalogueBean bean) throws RemoteException, SQLException; public int modifyCatalogueBean(CatalogueBean bean) throws RemoteException, SQLException; public int removeCatalogueBean(String isbn) throws RemoteException, SQLException; } Simpanlah di directory yang telah Anda persiapkan sebagai CatalogueRemote.java di sub-directory net/developerforce/amazon/catalogue/rmi Langkah 4 : Dengan text editor tulislah CatalogueRemoteImpl.java package net.developerforce.amazon.catalogue.rmi; import java.rmi.*; import java.rmi.server.*; import java.sql.*; import net.developerforce.amazon.catalogue.bean.CatalogueBean; import net.developerforce.amazon.catalogue.dao.CatalogueDAO; public class CatalogueRemoteImpl extends UnicastRemoteObject implements CatalogueRemote { public CatalogueRemoteImpl() throws RemoteException { } public Connection getConnection() throws ClassNotFoundException, SQLException { String jdbcDriver = "org.gjt.mm.mysql.Driver"; Class.forName(jdbcDriver); String url = "jdbc:mysql://localhost:3306/AMAZONDB"; String user = "ekobs"; String pwd = "j2ee"; Connection conn = DriverManager.getConnection( url, user, pwd); return conn; } public CatalogueBean findCatalogueBean(String isbn) throws RemoteException { Connection conn = null; try { conn = getConnection(); CatalogueDAO dao = new CatalogueDAO(conn); return dao.selectCatalogueBean(isbn); } catch(Exception e) { throw new RemoteException(e.toString()); } finally { try { if(conn != null) conn.close(); } catch(SQLException sqle) { sqle.printStackTrace(); } } } public int createCatalogueBean(CatalogueBean bean) throws RemoteException { Connection conn = null; try { conn = getConnection(); CatalogueDAO dao = new CatalogueDAO(conn); return dao.insertCatalogueBean(bean); } catch(Exception e) { throw new RemoteException(e.toString()); } finally { try { if(conn != null) conn.close(); } catch(SQLException sqle) { sqle.printStackTrace(); } } } public int modifyCatalogueBean(CatalogueBean bean) throws RemoteException { Connection conn = null; try { conn = getConnection(); CatalogueDAO dao = new CatalogueDAO(conn); return dao.updateCatalogueBean(bean); } catch(Exception e) { throw new RemoteException(e.toString()); } finally { try { if(conn != null) conn.close(); } catch(SQLException sqle) { sqle.printStackTrace(); } } } public int removeCatalogueBean(String isbn) throws RemoteException { Connection conn = null; try { conn = getConnection(); CatalogueDAO dao = new CatalogueDAO(conn); return dao.deleteCatalogueBean(isbn); } catch(Exception e) { throw new RemoteException(e.toString()); } finally { try { if(conn != null) conn.close(); } catch(SQLException sqle) { sqle.printStackTrace(); } } } } Simpanlah di directory yang telah Anda persiapkan sebagai CatalogueDAORemoteImpl.java di sub-directory net/developerforce/amazon/catalogue/rmi Langkah 5 : Dengan text editor tulislah CatalogueRMIServerApp.java package net.developerforce.amazon.catalogue.app; import java.net.*; import java.rmi.*; import java.sql.*; import net.developerforce.amazon.catalogue.rmi.*; public class CatalogueRMIServerApp { public static void main(String args[]) { System.setSecurityManager( new RMISecurityManager()); try { CatalogueRemote remote = new CatalogueRemoteImpl(); Naming.rebind("Catalogue", remote); } catch(RemoteException re) { re.printStackTrace(); } catch(MalformedURLException murle) { murle.printStackTrace(); } catch(NullPointerException npe) { npe.printStackTrace(); } } } Simpanlah di directory yang telah Anda persiapkan sebagai CatalogueRMIServerApp.java di sub-directory net/developerforce/amazon/catalogue/app Mengembangkan Client Langkah 6 : Dengan text editor tulislah CatalogueRMITestClientApp.java package net.developerforce.amazon.catalogue.app; import java.net.*; import java.rmi.*; import java.sql.*; import java.util.Date; import net.developerforce.amazon.catalogue.bean.CatalogueBean; import net.developerforce.amazon.catalogue.rmi.CatalogueRemote; public class CatalogueRMITestClientApp { public static void main(String[] args) { System.setSecurityManager(new RMISecurityManager()); try { CatalogueRMITestClientApp app = new CatalogueRMITestClientApp(); app.create(); app.view(); app.modify(); app.view(); app.remove(); } catch(MalformedURLException murle) { murle.printStackTrace(); } catch(NotBoundException ne) { ne.printStackTrace(); } catch(RemoteException re) { re.printStackTrace(); } catch(SQLException sqle) { sqle.printStackTrace(); } } private CatalogueRemote remote; public CatalogueRMITestClientApp() throws MalformedURLException, NotBoundException, RemoteException { remote = (CatalogueRemote)Naming.lookup("Catalogue"); } public void create() throws RemoteException, SQLException { System.out.println("Creating ... "); String isbn = "0-201-47967-2"; CatalogueBean bean = new CatalogueBean(isbn); bean.setTitle("Customer-centered Growth : 5 Proven Strategies For Building Competitive Advantage"); bean.setAuthor("Richard Whiteley"); bean.setPublisher("Addison Wesley Publishing Company"); bean.setCity("Massachusetts"); bean.setYear("1996"); bean.setLastUpdatedOn(new Date()); remote.createCatalogueBean(bean); } public void modify() throws RemoteException, SQLException { System.out.println("Modifying ... "); String isbn = "0-201-47967-2"; CatalogueBean bean = remote.findCatalogueBean(isbn); bean.setCity("Reading, Massachusetts"); remote.modifyCatalogueBean(bean); } public void remove() throws RemoteException, SQLException { System.out.println("Removing ... "); String isbn = "0-201-47967-2"; remote.removeCatalogueBean(isbn); } public void view() throws RemoteException, SQLException, NullPointerException { System.out.println("Displaying ... "); String isbn = "0-201-47967-2"; CatalogueBean bean = remote.findCatalogueBean(isbn); System.out.println("ISBN : " + bean.getIsbn()); System.out.println("Title : " + bean.getTitle()); System.out.println("Author : " + bean.getAuthor()); System.out.println("Publisher : " + bean.getPublisher()); System.out.println("City : " + bean.getCity()); System.out.println("Year : " + bean.getYear()); System.out.println("Last Updated On : " + bean.getLastUpdatedOn()); } } Penyiapan Lingkungan Langkah 7 : Bukalah sebuah console Untuk menghidupkan RMI Registry, bukalah sebuah console, dan jalankan rmiregistry. $ export PATH=/home/lab/jdk1.3.1_01/bin:$PATH $ rmiregistry Langkah 8 : Menuliskan security policy grant { permission java.net.SocketPermission "*:1024-65535", "connect,accept"; permission java.io.FilePermission "/home/lab/kinabalu/-", "read"; }; Simpanlah sebagai kinabalu.policy di directory yang dipersiapkan sebelumnya. Meng-compile dan Meluncurkan Server Langkah 9 : Bukalah sebuah console Anda akan meng-compile dan meluncurkan aplikasi dari console. Untuk dapat sukses melakukan kompilasi dan meluncurkan aplikasi, Anda harus menge-set setidaknya dua buah variabel lingkungan dalam Operating System Anda, yaitu : Variabel lingkungan PATH harus memuat directory dimana perintah java dan javac. Contoh untuk menge-set variabel lingkungan PATH : $ export PATH=/home/lab/jdk1.3.1_01/bin:$PATH Variabel lingkungan CLASSPATH harus memuat directory di mana file .class dari aplikasi Anda berada. Contoh untuk menge-set variabel lingkungan CLASSPATH : $ export CLASSPATH=/home/lab/kinabalu Dan Anda perlu memasukkan JDBC terkait, yaitu JDBC ke mySQL, ke dalam CLASSPATH : $ export CLASSPATH=/home/lab/lib/mm.mysql-2.0.8/mm.mysql-2.0.8-bin.jar:$CLASSPATH Langkah 10 : Meng-compile CatalogueDAORMIServerApp.java Melalui console, jalankan javac : $ javac -sourcepath /home/lab/kinabalu net/developerforce/amazon/catalogue/app/CatalogueRMIServerApp.java Jika Anda menjalani langkah-langkah dengan benar, Anda dapat menemukan file CatalogueBean.class, CatalogueDAO.class, CatalogueRemote.class, CatalogueRemoteImpl.class dan CatalogueRMIServerApp.class Langkah 11 : Men-generate stub dan skeleton menggunakan rmic Melalui console, jalankan rmic : $ rmic -d . net.developerforce.amazon.catalogue.rmi.CatalogueRemoteImpl Jika Anda menjalani langkah-langkah dengan benar, Anda dapat menemukan file CatalogueRemoteImpl_Skel.class dan CatalogueRemoteImpl_Stub.class di dalam directory /home/lab/kinabalu/net/developerforce/amazon/catalogue/rmi Langkah 12 : Meluncurkan aplikasi CatalogueDAORMIServerApp Untuk meluncurkan aplikasi Anda, melalui console, jalankan java : $ java -Djava.rmi.server.codebase=file:/home/lab/kinabalu/ -Djava.rmi.server.hostname=localhost -Djava.security.policy=kinabalu.policy net.developerforce.amazon.catalogue.app.CatalogueRMIServerApp Meng-compile dan Meluncurkan Client Langkah 13 : Bukalah sebuah console lainnya Anda akan meng-compile dan meluncurkan aplikasi dari console. Untuk dapat sukses melakukan kompilasi dan meluncurkan aplikasi, Anda harus menge-set setidaknya dua buah variabel lingkungan dalam Operating System Anda, yaitu : Variabel lingkungan PATH harus memuat directory dimana perintah java dan javac. Contoh untuk menge-set variabel lingkungan PATH : $ export PATH=/home/lab/jdk1.3.1_01/bin:$PATH Variabel lingkungan CLASSPATH harus memuat directory di mana file .class dari aplikasi Anda berada. Contoh untuk menge-set variabel lingkungan CLASSPATH : $ export CLASSPATH=/home/lab/kinabalu Langkah 14 : Meng-compile CatalogueRMITestClientApp.java Melalui console, jalankan javac : $ javac -sourcepath /home/lab/kinabalu net/developerforce/amazon/catalogue/app/ CatalogueRMITestClientApp.java Jika Anda menjalani langkah-langkah dengan benar, Anda dapat menemukan file CatalogueRMITestClientApp.class. Langkah 15 : Meluncurkan aplikasi CatalogueRMITestClientApp Untuk meluncurkan aplikasi Anda, melalui console, jalankan java : $ java -Djava.rmi.server.hostname=localhost -Djava.security.policy=kinabalu.policy net.developerforce.amazon.catalogue.app.CatalogueRMITestClientApp Creating ... Displaying ... ISBN : 0-201-47967-2 Title : Customer-centered Growth : 5 Proven Strategies For Building Competitive Advantage Author : Richard Whiteley Publisher : Addison Wesley Publishing Company City : Massachusetts Year : 1996 Last Updated On : Sat Aug 17 00:00:00 SGT 2002 Modifying ... Displaying ... ISBN : 0-201-47967-2 Title : Customer-centered Growth : 5 Proven Strategies For Building Competitive Advantage Author : Richard Whiteley Publisher : Addison Wesley Publishing Company City : Reading, Massachusetts Year : 1996 Last Updated On : Sat Aug 17 00:00:00 SGT 2002 Removing ...

Tidak ada komentar: