BAB I PENDAHULUAN Dewasa ini pengembang – pengembang banyak membuat aplikasi transaksi yang terdistribusi untuk digunakan di perusahaan – perusahaan besar. Di era teknologi informasi yang ditandai dengan adanya tuntutan yang besar terhadap e-commerce, aplikasi - aplikasi enterprise harus didesign, dibangun dan diproduksi dengan biaya yang kecil dan pemanfaatan resource yang sedikit namun dengan hasil yang optimal. Dalam rangka mengurangi biaya dan untuk mengembangkan aplikasi yang cepat dan tepat, Java Enterprise Edition menyediakan pendekatan componentbased untuk mendesign, mengembangkan dan mendeploy aplikasi – aplikasi enterprise. Java Enterprise Edition menawarkan model aplikasi multi tier terdistribusi, komponen yang dapat digunakan kembali, control transaksi yang lebih fleksibel dan dukungan web service melalui teknologi XML. Hal ini membawa dampak pengembang tidak hanya menghasilkan solusi – solusi bisnis yang innovative secara lebih cepat, tetapi juga solusi J2EE tidak terikat pada produk dan API dari vendor manapun. Vendor dan customer dapat memilih produk dan komponen – komponen yang terbaik untuk bisnis dan persyaratan – persyaratan teknis lainnya. 1.1. Aplikasi – Aplikasi Multitier Terdistribusi J2EE menggunakan aplikasi multitier terdistribusi untuk membangun aplikasi – aplikasi enterprise. Aplikasi logik dibagi ke dalam komponen – komponen menurut fungsi, dan berbagai komponen aplikasi yang menyusun aplikasi J2EE diinstall pada mesin – mesin yang berbeda menurut tier dalam lingkungan J2EE multitier. Gambar 1.1 berikut ini menunjukkan dua aplikasi – aplikasi multitier J2EE yang dibagi ke dalam tier. Aplikasi J2EE yang ditunjukkan pada gambar 1.1 ini terbagi atas : 1 o Komponen client-tier yang berjalan pada sisi client o Komponen web-tier yang berjalan pada server J2EE o Komponen business-tier yang berjalan pada server J2EE o Sistem informasi enterprise (EIS) yang berjalan pada EIS Server Meskipun aplikasi enterprise dapat terdiri atas tiga atau empat tier seperti pada gambar 1.1, aplikasi – aplikasi multitier J2EE biasanya terdiri atas tiga tier karena terdistribusi pada tiga lokasi yaitu client machine, server J2EE dan database pada sisi back end. Gambar 1.1 Aplikasi Multitier 1.2.Komponen J2EE Aplikasi – aplikasi J2EE dibuat oleh komponen – komponen. Suatu komponen J2EE adalah satuan perangkat lunak fungsional yang dipasangkan dalam satu aplikasi J2EE dengan kelas – kelas dan file – file dan yang berkomunikasi dengan component – komponen lainnya. Komponen – komponen J2EE adalah sebagai berikut : a. Aplikasi client dan applet adalah komponen – komponen yang berjalan pada sisi client 2 b. Komponen – komponen teknologi java servlet dan javaserver pages adalah web komponen yang berjalan pada server. c. Komponen – komponen enterprise java beans adalah business komponen yang berjalan pada server. Komponen – komponen J2EE ditulis dalam bahasa java dan dikompilasi dengan cara yang sama seperti bahasa program lainnya. Perbedaan antara komponen J2EE dan class java standart adalah bahwa komponen – komponen J2EE diasemble dalam satu aplikasi J2EE dan dideploy untuk produksi dimana mereka dijalankan dan dimanage oleh server J2EE. 1.3.J2EE Client J2EE client dapat berupa suatu web client atau aplikasi client 1.3.1. Web Client Web client terdiri atas dua bagian yaitu web page dinamis yang berisi bermacam – macam markup language (HTML,XML dan lain – lain), yang dihasilkan oleh bermacam – macam web komponen yang berjalan pada web tier; dan web browser yang merender halaman – halaman web yang diterima dari server. Web client kadangkalanya disebut thin client. Thin client biasanya tidak melakukan query terhadap database, mengekesekusi aturan – aturan bisnis yang kompleks atau terhubung ke aplikasi – aplikasi yang legal. 1.3.2. Applet Applet adalah aplikasi client yang ditulis dalam bahasa java yang dieksekusi oleh java virtual machine yang terinstall pada web browser. Olehya, client perlu java plug in supaya applet dapat dieksekusi oleh web browser. Komponen – komponen web adalah API terpilih untuk membuat program web client karena tidak ada plug – in atau security policy files 3 yang dibutuhkan pada sisi client. Juga komponen – komponen web memungkinkan design aplikasi secara lebih jelas dan modular karena komponen – komponen web memberikan suatu cara untuk memisahkan program – program aplikasi dari design halaman web. 1.3.3. Application Client Application client berjalan pada client machine dan memberikan fasilitas pada user untuk menangani tugas yang membutuhkan user interface yang dapat disiapkan oleh satu markup language. Application client mempunyai graphical user interface yang dibuat dari Swing atau AWT API, namun memungkinkan juga menggunakan Command Line Interface. Application client secara langsung mengakses enterprise bean yang berjalan pada business tier. Juga applikasi client dapat membuka koneksi http untuk membangun komunikasi dengan servlet yang berjalan pada web tier. 1.4.Komunikasi Server J2EE Gambar 1.2 berikut ini menunjukkan berbagai elemen yang membentuk client tier. Gambar 1.2 Komunikasi Server Client berkomunikasi dengan business tier yang berjalan pada server J2EE baik secara langsung atau dalam hal client berjalan dalam satu web 4 browser adalah dengan menggunakan JSP atau Servlet yang berjalan di web tier. Aplikasi J2EE dapat menggunakan thin browser-based client atau thick application client. Mana yang akan digunakan, tergantung pada pertimbangan antara mempertahankan fungsi pada client dan dekat ke user dan mengurangi beban server sekecil mungkin. Semakin kecil beban server, semakin mudah untuk mendistribusikan, mendeploy dan mengelola aplikasi 1.5.Komponen – Komponen Web dan Bisnis Komponen – komponen web dapat berupa servlet atau JSP. Servlet adalah class – class dari bahasa pemrograman java yang secara dinamis memproses request dan membentuk response. Halaman – halaman JSP adalah dokumen teks yng mengeksekusi servlet tetapi memungkinkan pendekatan natural untuk membuat static content. Halaman – halaman statis html dan applet digabung dengan komponen – komponen web selama aplikasi disusun tetapi bukan merupakan web komponen. Class – class utilitas pada sisi server dapat juga digabungkan dengan komponen – komponen web dan seperti halaman – halaman HTML class – class ini tidak dianggap sebagai web komponen. Seperti terlihat pada gambar 1.3 berikut ini, web tier seperti client tier, dapat meliputi komponen java bean untuk mengelola masukan user dan mengirimkan input ke enterprise bean yang berjalan pada bisnis tier untuk diproses. Gambar 1.3 Lapisan Web dan Aplikasi J2EE 5 Kode Binis yang merupakan logika untuk memecahkan kebutuhan domain bisnis tertentu seperti bank atau perusahaan financial lainnya ditangani oleh enterprise bean yang berjalan pada bisnis tier. Gambar 1-4 berikut ini menunjukan bagaimana enterprise bean menerima data dari client, memproses data tersebut jika perlu dan mengirimkannya ke sistem informasi enterprise untuk penyimpanan. Enterprise bean juga mengambil data dari penyimpanan, memprosesnya dan mengembalikan ke client. Gambar 1.4 Lapisan Bisnis dan Sistem Informasi Enterprise Ada tiga jenis enterprise bean : session bean, entity beans dan message-driven bean. Session bean menunjukkan suatu percakapan transient dengan seorang client. Ketika client selesai mengeksekusi, session bean dan datanya lenyap.Sebaliknya entity bean menunjukan secara persistent data disimpan dalam satu baris table di suatu database. Jika client berhenti atau server mati, data entity bean tersimpan. Message-driven bean mengkombinasikan ciri yang dimiliki oleh session bean dan java message service (JMS) listener, yang mengijinkan satu komponen bisnis menerima pesan pesan JMS secara asinkron. 1.6.J2EE Container Pada dasarnya aplikasi – aplikasi multitier thin-client sulit dalam pembuatannya karena meliputi banyak baris kode untuk menangani 6 transaksi, multithreading, resource pooling dan uraian kompleks lainnya. Arsitektur J2EE menjadikan aplikasi J2EE mudah untuk dibuat karena logika bisnis disusun dalam komponen – komponen yang dapat digunakan kembali. Sebagai tambahan server J2EE menyediakan layanan penting dalam bentuk satu container untuk setiap tipe komponen. Karena kita tidak harus mengembangkan layanan – layanan ini, maka konsentrasi kita hanya pada bagaimana memcahkan persoalan – persoalan bisnis. 1.6.1. Container Services Container adalah interface antara satu komponen dan platform tertentu pada tingkat rendah yang mendukung komponen tersebut. Sebelum web komponen, enterprise bean atau komponen aplikasi client dapat dieksekusi, kompoenen tersebut harus dipasang dalam satu module J2EE dan dideploy dalam kontainernya. Proses pemasangan mencakup penyetingan container tertentu untuk setiap komponen dalam aplikasi J2EE dan untuk aplikasi J2EE sendiri. Penyetingan container mengkustomasi pendukung – pendukung utama yang disediakan server J2EE mencakup kemaanan, management transaksi, Java Naming and Directory Interface dan konektivitas remote Karena arsitektur J2EE menyediakan layanan yang dapat dikonfigurasi, komponen – komponen aplikasi dalam aplikasi J2EE yang sama dapat bertindak secara berbeda berdasarkan dimana mereka dideploy. Sebagai contoh suatu enterprise bean dapat mempunyai penyetingan keamanan yang mengijinkannya mengakses database pada satu lingkungan produksi dan akses database lain pada lingkungan produksi lainnya. 7 1.6.2. Tipe – Tipe Container Proses deployment menginstall komponen – komponen aplikasi J2EE dalam container J2EE seperti digambarkan pada gambar 1.5. J2EE Server; menyediakan container Enterprise Java Bean dan web container Enterprise Java Bean Container; mengelola eksekusi enterprise bean untuk aplikasi – aplikasi J2EE. Enterprise bean dan containernya berjalan pada server J2EE. Web Container; mengelola eksekusi komponen aplikasi client. Aplikasi client dan containernya berjalan pada sisi client. Applet Container; mengelola eksekusi applet, terdiri atas web browser dan Java Plug-in yang berjalan disisi client secara bersamaan. Gambar 1.5 Server J2EE dan Container RANGKUMAN Java Enterprise Edition menawarkan model aplikasi multi tier terdistribusi, komponen yang dapat digunakan kembali, control transaksi yang lebih fleksibel dan dukungan web service melalui teknologi XML 8 Aplikasi – aplikasi multitier J2EE terdiri atas tiga tier dan terdistribusi pada tiga lokasi yaitu client machine, server J2EE dan database pada sisi back end. Komponen J2EE adalah satuan perangkat lunak fungsional yang dipasangkan dalam satu aplikasi J2EE dengan kelas – kelas dan file – file dan yang berkomunikasi dengan component – komponen lainnya Komponen J2EE terdiri atas aplikasi client dan applet, komponen – komponen teknologi javaservlet dan javaserver pages serta java enterprise beans. CONTOH SOAL 1. Apa perbedaan antara komponen J2EE dan class java standart ? Jawaban : Komponen J2EE diassemble dalam satu aplikasi J2EE dan dideploy produksi dimana mereka dijalankan dan dimanage oleh server J2EE. Class java standart dikompile dan dieksekusi mengunakan java virtual machine dan tidak membutuhkan server J2EE dalam proses produksinya. 2. Apa yang dimaksud dengan applet dan syarat mengeksekusi applet ? Jawaban : Applet adalah aplikasi client yng ditulis dalam bahasa java yang dieksekusi oleh java virtual machine yang terinstall pada web browser. Syarat untuk mengeksekusi applet adalah client harus memiliki java plug-in. LATIHAN SOAL 1. Jelaskan komponen – komponen JEE yang membentuk client tier dan middle tier ! 2. Jelaskan secara singkat perbedaan antara web container dan EJB container ! 3. Sebutkan dan jelaskan kegunaan dari masing – masing container yang ada dalam JEE ? 4. Jelaskan pengertian anda tentang aplikasi multi tier ! 9 BAB II DASAR SERVLET 2.1. Servlet Servlet merupakan dasar dari teknologi java web. Servlet adalah program java yang dieksekusi di server untuk membuat web. Servlet merupakan sebuah class java yang mempunyai kemampuan sebagai server, sehingga jika kita ingin membuat sebuah aplikasi web dengan servlet, maka harus dilakukan coding class – class java biasa. Servlet bekerja berdasarkan model request – response, artinya servlet akan melakukan tindakan (response) setelah servlet menerima request dari client. Servlet juga dipanggil sebagai HTTPServlet karena servlet biasanya digunakan sebagai HTTP. HTTPServlet merupakan pintu masuk dan keluar bagi request dan response. Servlet mirip dengan teknologi Common Gateway Interface(CGI), Objek servlet terjadi hanya sekali ketika servlet diinisialisasi dan kemudian diam di dalam memori. Dampaknya adalah servlet menjadi lebih cepat karena setiap ada request servlet tidak akan menciptakan objek baru lagi. Sedangkan pada CGI setiap request akan menciptakan objek baru. Servlet dibuat dengan bahasa java sehingga dapat digabungkan dengan teknologi java lainnya seperti JDBC, EJB,RMI dan sebagainya. 2.2. Siklus Hidup Servlet Siklus hidup servlet dikendalikan oleh web container, dimana servlet dideploy. Siklus hidup servlet terdiri atas 3 tahap yaitu init( ), service( ) dan destroy( ). Siklus hidup servlet dapat dilihat pada gambar berikut ini : 10 Initialization (Load Resources) Request Service Response (Accept Request) Servlet Destruction (Unload Resources) Gambar 2.1 Siklus hidup servlet Siklus hidup servlet diawali dengan method init( ) yang dipanggil oleh web container setelah servlet diinisialisasi. Saat inisialisasi ini web container akan mengecek apa saja yang diperlukan oleh servlet misal servlet perlu mengakses servlet yang lain, database atau yang lainnya. Setelah servlet dinisialisasi, web container memanggil method service( ). Pada tahap ini servlet siap menunggu request untuk kemudain melakukan proses dan mengirimkan response kepada client. Method destroy ( ) dipanggil ketika web container dimatikan atau servlet diundeploy. Untuk mengaktifkan kembali servlet harus diinisialiasi lagi dari awal. 2.3. Servlet API Servlet API terdiri atas 2 package, yaitu javax.servlet dan javax.servlet.http. Package ini merupakan package diluar java SE (Standart Edition) dan didistribusikan bersama package java EE (Enterprise Edition). 11 javax.servlet.Servlet javax.servlet.Servlet javax.servlet.http.HttpS ervlet MyServlet Gambar 2.2 Servlet API Servlet sendiri sebenarnya hanyalah sebuah java class. Namun perbedaannya dari class java biasa adalah servlet merupakan turunan dari HttpServlet. Tujuan menurunkan class HttpServlet adalah agar class java (servlet) yang dibuat bisa menjalankan mekanisme request – response melalui protocol HTTP, dimana aplikasi web akan berjalan. public class MyServlet extends HttpServlet { protected void doGet( HttpServletRequest request,HttpServletResponse response ) throws Exception { } } HttpServlet merupakan class abstrak, sehingga untuk menggunakan servlet kita harus mengimplementasikan salah satu method yang ada, yaitu doGet( ) dan doPost( ), yang merupakan method pengiriman request melalui protocol HTTP. Perbedaan doGet( ) dan doPost( ) secara mudah terlihat pada URL nya. Ciri dari doGet( ) adalah URL yang panjang berisi data parameternya. Ciri dari doPost( ) adalah URL yang 12 pendek tanpa terlihat isi parameter. Jadi jika data yang dikirim bersifat rahasia misalnya pada form login maka gunakan doPost( ), namun jika data tidak begitu penting semisal link gunakan saja doGet( ). 2.4. Penggunaan Servlet Fungsi servlet adalah untuk membuat web dinamis bagi user. Secara umum, cara kerja servlet adalah menerima request kemudian mengirim response Request Browser Request Servlet Response Respon se Gambar 2.3 Servlet request - response Client (browser) mengirimkan HTTP request pada servlet container, kemudian servlet container akan menghantar request ke servlet yang dimaksud. Servlet akan menjalankan program java dan jika diperlukan servlet bisa mengakses database atau lainnya untuk menghasilkan output berupa halaman HTML. Halaman HTML ini diserahkan ke servlet container untuk dikirim kembali sebagai response kepada client. 2.5. Contoh Program Untuk lebih memahami mekanisme kerja dari servlet, berikut ini akan dibuatkan contoh servlet dengan menggunakan netbeans IDE. Servlet yang akan dibuat berupa aplikasi form registrasi. Langkah – langkahnya adalah sebagai berikut : 13 1. Buat project baru dan pilih category Java web dan projects Web Application, lihat gambar berikut Gambar 2.4 Memilih project Web Application 2. Berikan nama yang diinginkan untuk project, pastikan server yang dipilh Apache Tomcat dan versi java ee yang digunakan adalah Java EE 5. Klik Finish Gambar 2.5 Memilih server Apache Tomcat 14 3. Buat servlet baru dan beri nama FormRegistration. Isikan package : servlet. Klik next. Ubah url pattern menjadi /registration. Klik Finish Gambar 2.6 Konfigurasi URL Pattern servlet FormRegistration 4. Kita akan buat form registrasi sederhana yang berisi input nama,alamat,email dan pemilihan paket internet. Ubah code servlet FormRegistration pada method processRequest( ). Ketik kode berikut protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { out.println("<html>"); out.println("<head>"); out.println("<title>Registration Form</title>"); out.println("</head>"); out.println("<body>"); out.println("<h2>Form Registrasi</h2>"); out.println("<form method='post' action='show'>"); out.println("<fieldset>" + "Nama: " + "<input type='text' name='nama' />" + "</br></br>" + "Alamat: " + request, 15 "<textarea name='alamat' >" + "</textarea>" + "</br></br>" + "Email: " + "<input type='text' name='email' />" + "</br></br>" + "Paket: " + "<input type='radio' name='paket' value='Personal' />" + "Personal " + "<input type='radio' name='paket' value='Game' />" + "Game" + "<input type='radio' name='paket' value='Office' />" + "Office" + "</br></br>" + "<input type='submit' value='Daftar >>' />" + "</fieldset>"); out.println("</form>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } 5. Buat lagi sebuah servlet untuk membaca data yang diinput pada form registration. Beri nama ShowData dengan package servlet. Ubah url pattern menjadi /show. Kemudian ketikkan kode berikut ini protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); String nama = request.getParameter("nama"); String alamat = request.getParameter("alamat"); String email = request.getParameter("email"); String paket = request.getParameter("paket"); PrintWriter out = response.getWriter(); try { out.println("<html>"); out.println("<head>"); out.println("<title>Registration Form</title>"); out.println("</head>"); request, 16 out.println("<body>"); out.println("<h2>Data Pelanggan Baru</h2>"); out.println("<table border='1' cellpadding='4' cellspacing='2'>" + "<tr><td>Nama: </td><td>" + nama + "</td></tr>" + "<tr><td>Alamat: </td><td>" + alamat + "</td></tr>" + "<tr><td>E-mail: </td><td>" + email + "</td></tr>" + "<tr><td>Pilihan Paket: </td><td>" + paket + "</td></tr>" + "</table>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } 6. Ubah welcome page dengan mengklik ganda web.xml arahkan ke FormRegistrasi. 7. Jalankan project, klik kanan project dan pilih Build. Klik kanan project pilih Run. Akan tampil hasil seperti berikut ini : Gambar 2.7 Servlet Registrasi 8. Klik tombol daftar maka akan tampil output sebagai berikut 17 RANGKUMAN Servlet adalah program java yang dieksekusi di server untuk membuat web dan merupakan sebuah class java yang mempunyai kemampuan sebagai server Siklus hidup servlet dikendalikan oleh web container, dimana servlet dideploy. Siklus hidup servlet terdiri atas 3 tahap yaitu init( ), service( ) dan destroy( ). Servlet API terdiri atas 2 package, yaitu javax.servlet dan javax.servlet.http Fungsi servlet adalah untuk membuat web dinamis bagi user dan secara umum, cara kerja servlet adalah menerima request kemudian mengirim response LATIHAN SOAL 1. Jelaskan pengertian anda tentang servlet dan penggunaannya dalam membangun program aplikasi untuk skala enterprise ! 2. Dengan menggunakan netbeans IDE buatlah servlet yang dapat dipakai untuk memberikan fasilitas Login bagi user. 18 BAB III SERVLET LANJUT 3.1. Pengalihan Response Ada banyak jenis response yang diberikan oleh servlet sebagai tanggapan atas request client. Salah satunya adalah mengalihkan response itu sendiri untuk ditangani oleh servlet lain atau mengalihkan ke halaman jsp atau bagian aplikasi web lainnya. Contoh kasusnya misalnya pada aplikasi web yang memerlukan login untuk mengaksesya. Jika yang mengakses adalah user biasa, tentunya hasilnya akan berbeda jika yang mengakses adalah super user/ admin. User biasa akan diarahkan pada halaman member, sedangkan super user akan diarahkan ke halaman administrator. Hal ini dilakukan dengan cara mengarahkan response. Ada dua method yang dipakai untuk mengalihkan response, yaitu : 1. RequestDispatcher( ) 2. sendRedirect( ) 3.1.1. Request Dispatcher RequestDispatcher ditemukan berada dalam object HttpServletRequest. Dengan memanggil method getRequestDispatcher ( String path ), kita tentukan parameter pathnya, dimana request akan diteruskan. Parameter path ini bisa berupa lokasi file jsp atau servlet lain yang ingin dihubungkan dengan request. Setelah kita menciptakan object getRequestDispatcher, kita dapat memanggil salah satu dari dua method berikut, yaitu : public void include ( ) public void forward ( ) 19 Kedua method tersebut akan mengalihkan response ke lokasi yang ditentukan dalam parameter path tadi. Perbedaan utama dari include dan forward adalah jika menggunakan include, kita dapat menambahkan isi lain ke response, sedangkan jika menggunakan forward hanya mengirimkan response saja. 3.1.2. SendRedirect Method sendRedirect ( ) dapat ditemukan dalam object HttpServletresponse. Dengan memanggil method sendRedirect ( String relativePath), kita dapat menglihkan response ke relative path tertentu. Method ini secara efektif memerintahkan browser untuk mengirim request yang lain ke relative path-nya. Untuk lebih memahami mengenai pengalihan response dengan kedua cara diatas perhatikan contoh berikut dengan mengikuti langkah – langkah berikut ini : 1. Buat project baru dengan nama DemoServletLanjut. Lakukan penyetingan seperti pada bab sebelumnya 2. Buat fom login pada index.jsp. Ketikkan kode berikut ini <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h2>Login</h2> <form method='post' action='LoginRedirect'> <fieldset> Username: <input type='text' name='uname' /> <br><br> Password: <input type='password' name='pass' /> <br><br> 20 <input type='submit' value='Login' /> </fieldset> </form> </body> </html> 3. Buat dua halaman jsp lagi, yaitu admin.jsp dan user.jsp Gambar 3.1 Membuat JSP File 4. Buat tulisan “Welcome Admin” di dalam tag body 5. Buat juga hal yang sama untuk user.jsp 6. Buat sebuah servlet untuk mengecek input pada username dan password. Beri nama LoginDispatcher 7. Pada method processRequest( ) ketikkan kode berikut ini protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String username = request.getParameter("uname"); String password = request.getParameter("pass"); RequestDispatcher dis = null; 21 if(username.equalsIgnoreCase("admin") password.equals("admin")){ dis = request.getRequestDispatcher("/admin.jsp"); }else if(username.equalsIgnoreCase("user") password.equals("user")){ dis = request.getRequestDispatcher("/user.jsp"); }else{ out.println("Login Salah!!"); dis = request.getRequestDispatcher("/index.jsp"); } //dis.include(request, response); dis.forward(request, response); } && && 8. Build dan Run servlet, coba masukan admin dan password “admin”. Akan didapat tampilan sebagai berikut Gambar 3.2 Login sebagai Admin 9. Lakukan hal yang sama untuk username “user” dan password “user” 3.2. Request Dispatcher VS SendRedirect Kita telah menggunakan requestDispatcher dan sendRedirect dan hasil yang ditampilkan oleh web browser adalah sama. Namun sebetulnya ada perbedaan antara kedua method ini, seperti yang Nampak pada url dari kedua method ini : RequestDispatcher 22 SendRedirect Pada requestDispatcher program tidak menciptakan request yang baru. Request hanya terjadi satu kali, yaitu request ke servlet LoginDispatcher. Coba kita login sebagai user atau kita isi saja sembarang, maka url-nya tetap sama seperti itu. Pada sendRedirect program akan menciptakan request yang baru. Disini request terjadi dua kali, yaitu request ke servlet LoginRedirect kemudian request ke halaman index.jsp. Coba kita login sebagai user atau kita isi saja sembarang, maka url-nya akan berbeda. 3.3. Context Di dalam java kita bisa menyimpan data yang kompleks/objek. Objek disini bukan database ataupun file, tetapi data yang sedang diolah program. Objek disimpan dalam sebuah context. Spesifikasi servlet memberikan empat penyimpanan data dalam java, yaitu : Page Context Jika kita menyimpan objek pada Page Context, maka kita definisikan dahulu object tersebut pada sebuah halaman. Page Context hanya dikenali pada halaman yng mendefinisikannya Request Context Pada request context, objek disimpan pada sebuah request tunggal. Objek dapat dikenali oleh semua komponen web yang menangani request dari client, namun hanya saat request itu dikirimkan dan response diterima oleh client. Ketika ada request lainnya muncul, request sebelumnya tidak dapat dikenali lagi. Objek yang tergabung dengan bidang ini adalah objek HttpServletRequest. Instance – instance dari objek ini siap dan dapat digunakan untuk servlet, sama seperti yang mereka berikan sebagai parameter untuk method service yang dipanggil oleh container di atas request client. 23 Session Objek dalam session dapat diakses oleh semua komponen aplikasi web dan akan terus tersimpan selama session belum mencapai timeout atau user logout dari sistem dan objek dihapus dari session. Objek dari suatu session user, bagaimanapun tidak terlihat dari dalam session user yang lain. Penggunaan session misalnya pada aplikasi took online. Session digunakan untuk menyimpan data pemesanan barang. Objek yang tergabung dengan bidang ini adalah objek HttpSession. Sebuah instance dari ini bisa didapatkan kembali menggunakan method getSession( ) dalam objek HttpServletRequest. Application Context Objek yang tersimpan dalam application context dapat dikenali oleh semua komponen aplikasi web tanpa memperhatikan request user atau session client yang mengatur dan mengakhiri sampai aplikasi dihentikan. Objek yang dibaca oleh client satu dengan lainnya akan sama client mengakses context yang sama. Objek yang tergabung dengan bidang ini adalah objek ServletContext. Ini bisa didapatkan kembali dengan memanggil method getServletContext( ) dari objek yang valid ServletConfig. Servlet context mendefinisikan berbagai fungsi yang digunakan servlet untuk berkomunikasi dengan servlet container meliputi penghantaran request, penulisan ke log dan sebagainya. 3.4. Mengakses Context Semua objek context memiliki method untuk mengambil kembali dan menyimpan data di dalamnya. Untuk menyimpan objek gunakan method : public void setAttribute ( String key, Object value) parameter key merupakan nama kunci yang digunakan untuk menyimpan objek. Key ini akan dipanggil lagi jika kita ingin membaca 24 atau menghapus objek yang telah disimpan. Untuk membaca objek, gunakan method : public Objek getAttribute ( String key) Nilai kembalian dari method getAttribute ini adalah Objek, sehingga kita harus melakukan casting Objek ke class yang sesuai. Jika tidak ada objek yang bisa mendapatkan kembali dari key yang diberikan, method akan mengembalikan nilai null. Untuk menghapus sebuah attribute dari objek, gunakan method removeAttribute ( String key) Berikut ini adalah contoh penggunaan context, khususnya request context. Ikuti langkah – langkah berikut ini : 1. Buat project baru dan beri nama DemoServletContext 2. Lakukan penyetingan untuk server dan tipe enterprise edition yang digunakan 3. Buat sebuah form input nama pada index.jsp, dengan mengetikkan kode berikut ini : <html> <head> <meta http-equiv="Content-Type" charset=UTF-8"> <title>JSP Page</title> </head> <body> <h2>Masukkan Nama Anda</h2> <form method='post' action='save'> <input type='text' name='nama' /> <br><br> <input type='submit' value='Submit' /> </form> </body> </html> content="text/html; 25 4. Buat sebuah servlet baru untuk menyimpan context dan beri nama SaveContext. Atur konfigurasi seperti didepan. 5. Ubah method processRequest( ) pada servlet seperti pada kode berikut ini : protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { String nama = request.getParameter("nama"); request, //request.setAttribute("namactx", nama); ServletContext ctx = getServletContext(); ctx.setAttribute("namactx", nama); RequestDispatcher dis = request.getRequestDispatcher("view"); dis.forward(request, response); } 6. Buat servlet yang baru beri nama ViewContext dan ubah method processRequest( ) dengan kode berikut ini : protected void processRequest( HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); request, //String nama = (String) request.getAttribute("namactx"); ServletContext ctx = getServletContext(); String nama = (String) ctx.getAttribute("namactx"); try { out.println("<html>"); out.println("<head>"); out.println("<title>View Context</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Nama Anda : " + nama + "</h1>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); 26 } } 7. Build dan jalankan project. Akan diperoleh tampilan sebagai berikut : Klik submit akan didapat tampilan sebagai berikut 8. Sekarang coba ketikkan langsung url ini : http://localhost:8084/DemoServletContext/view. Hasilnya adalah tidak ada isi context yang bisa diambil. Jadi harus melewati mekanisme yang sesuai. Ini terjadi karena pada RequestContext, objek disimpan hanya dalam satu request tunggal. RANGKUMAN Dalam servlet response ditangani dengan cara mengalihkan response itu sendiri untuk ditangani oleh servlet lain atau dialihkan ke halaman jsp atau aplikasi web lainnya Ada dua method yang digunakan untuk mengalihkan response yaitu RequestDispatcher ( ) dan sendRedirect ( ) Pada requestDispatcher program tidak menciptakan request yang baru. Request hanya terjadi satu kali. Coba kita login sebagai user atau kita isi saja sembarang, maka url-nya tetap sama seperti itu. Pada sendRedirect program akan menciptakan request yang baru. Disini request terjadi dua kali RequestDispatcher berada dalam class HttpServletRequest dan memiliki dua method yaitu public void include( ) dan public void forward ( ). 27 Perbedaan utama dari include dan forward adalah jika menggunakan include, kita dapat menambahkan isi lain ke response, sedangkan jika menggunakan forward hanya mengirimkan response saja. Ada empat penyimpanan data dalam java yaitu Page Context, Request Context, Session dan Application Context. SOAL LATIHAN 1. Berikan perbedaan antara requestDispatcher ( ) dan sendRedirect ( ), dua metode yang dipakai untuk mengalihkan response ! 2. Jelaskan perbedaan antara session, application context, page context dan request context ! 3. Coba anda modifikasi contoh Request Context diatas menjadi Application Context ! 4. Buatlah contoh program penggunaan servlet dan jsp untuk mengalihkan response dari suatu servlet ke halaman jsp ! 28 BAB IV COOKIE Aplikasi web adalah aplikasi yang stateless, dimana server tidak akan mengingat request client. Akibatnya setiap request yang masuk selalu dianggap oleh server berasal dari client – client yang berbeda. Padahal kadang – kadang server juga perlu mengenali client, missal untuk kepentingan autentikasi dimana client tidak bisa mengakses sembarang halaman yang tidak diizinkan. Untuk mengatasi masalah ini, bisa digunakan cookie atau session. 4.1. Cookie Cookie merupakan informasi kecil yang dikirim kepada client/browser dari server. Cookie dijadikan tempat penyimpanan sementara state yang disimpan disisi client/ browser. Oleh browser cookie akan disimpan dan nantinya dapat dikirimkan kembali ke server jika diperlukan. Biasanya cookie dipakai untuk mengidentifikasi client. Cookie berisi suatu ID yang unik pada tiap client. Biasanya server bisa mengenali banyak client yang pada saat bersamaan sedang melakukan request. Dalam kasus tertentu misalnya website yang mewajibkan user untuk login supaya dapat mengakses resource – resource dari website tersebut, tentunya akan repot jika user harus terus – menerus melakukan login setiap mengakses halaman website yang berbeda. Oleh karena itu server dapat mengirimkan cookie berupa identitas masing – masing client, sehingga dapat dikenali apakah client yang bersangkutan sudah melakukan login atau belum. Cookie disimpan di browser. Browser yang berbeda dianggap sebagai client yang berbeda dan cookie bisa dihapus melalui browser masing – masing. Mungkin anda pernah mengsakses website, dimana kita 29 atur menggunakan bahasa Indonesia dalam website itu, dan ketika mengakses kembali website dengan browser yang sama maka secara otomatis website langsung menampilkan halaman berbahasa Indonesia. Ini terjadi karena browser menyimpan state penggunaan bahasa kita. Namun ketika kita mengakses dengan browser yang lain, kita harus mengatur kembali penggunaan bahasanya karena kita sudah dianggap client yang berbeda. Cookie hanya dapat menampung data String sederhana bukan data kompleks seperti context. Cookie akan terhapus begitu browser ditutup, namun cookie dapat diatur waktu hidupnya sehingga bisa disimpan lebih lama oleh web browser. Selain itu cookie hanya diubah oleh server dari mana cookie tersebut berasal. 4.2. Keuntungan dan Kelamahan Cookie Dengan karekteristik cookie seperti yang sudah dijelaskan sebelumnya, maka cookie memiliki beberapa keuntungan sekaligus kelemahan. Kelemahan cookie yang utama, yaitu karna cookie disimpan oleh client maka setiap client yang ingin mengakses website yang membutuhkan cookie, wajib menggunakan browser yang mendukung cookie dan mengaktifkan cookie-nya. Jika tidak, aplikasi web tidak akan berjalan sebagaimana mestinya. Ini adalah kelemahan di mana aplikasi web menjadi sangat bergantung dengan client itu sendiri. Meski hanya bisa dimodifikasi oleh server, namun cookie bisa dibaca oleh unauthorized user. Cookie dapat meningkatkan beban di jaringan akibat informasi yang sama yang dikirim terus menerus. Namun, beban ini biasanya tidak akan terasa karena ukuran cookie sendiri yang sangat kecil, yaitu sekitara 4kb. Keuntungan penggunaan cookie selain bisa digunakan untuk identifikasi client adalah cookie tidak terpengaruh pada 30 crash server karena data disimpan di client serta dapat meringankan beban di memori user. 4.3. Cookie di Java Di java sudah disediakan fasilitas untuk menggunakan cookie melalui class javax.servlet.http.Cookie. Untuk menciptkan cookie , berikut langkah – langkahnya : 1. Panggil contructor Cookie. Misal seperti ini : Cookie c = new Cookie (“ckieNama”,”maksy”); String “ckieNama’ adalah nama cookie-nya sedangkan string “maksy” adalah isi cookie-nya. Nama dan isi cookie tidak boleh mengandung spasi, tab dan karakter seperti { [] ( ) = , “ / @ : ; 2. Agar cookie tidak terhapus begitu browser ditutup dan masih bisa digunakan lagi, atur umur maksimum cookie-nya. c.setMaxAge(60*60*24); Berarti umur maksimum cookie kita adalah 60 x 60 x 24 detik atau 1 hari. Setelah itu cookie akan terhapus. 3. Untuk mengirimkan cookie kepada client, tambahkan cookie kepada object response. response.addCookie(c); Untuk membaca cookie gunakan method request.getCookie( ). Nilai kembalian dari method ini adalah array object cookie yang disimpan oleh browser dan akan mengembalikan null jika tidak ada cookie. Untuk mendapatkan cookie yang kita maskud, lakukan pengulangan menggunakan method getName( ) pada setiap objek cookie sampai ditemukan cookie yang dimaksud. 4.4. Contoh Program Dalam contoh program ini akan dibuat sebuah halaman login dan sebuah halaman khusus untuk member. Jika kita login sebagai member, 31 kita akan diizinkan mengakses halaman khusus member tersebut dan jika bukan member maka tidak akan izinkan. User member maupun non member akan memperoleh id masing – masing . Sehingga jika ada user non-member yang ingin langsung mengakses halaman khusus member tanpa login maka akan ditolak. 1. Buat sebuah project dan beri nama DemoCookie. Lakukan penyetingan seperti didepan pada project sebelumnya. 2. Buat sebuah form input username dan password pada index.jsp dengan mengetikkan kode berikut ini : <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h2>Member Login</h2> <form method='post' action='login'> <fieldset> Username: <input type='text' name='uname' /> <br><br> Password: <input type='password' name='pass' /> <br><br> <input type='submit' value='Login' /> </fieldset> </form> </body> </html> 3. Buat lagi sebuah halaman jsp dengan nama member.jsp. Ketikkan kode berikut ini <html> <head> <meta http-equiv="Content-Type" charset=UTF-8"> <title>JSP Page</title> content="text/html; 32 </head> <body> <h1>Halaman Khusus Member</h1> </body> </html> 4. Buat sebuah servlet baru untuk menambah cookie dan beri nama LoginCookie. Ubah pattern menjadi /login dan ketikkan kode berikut dalam method processRequest ( ). protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String username = request.getParameter("uname"); String password = request.getParameter("pass"); String cookieMember = "1234567890"; String cookieNonMember = "000"; if(username.equalsIgnoreCase("member") && password.equals ("member")) { Cookie c = new Cookie("ckieNama", cookieMember); c.setMaxAge(60*60); response.addCookie(c); out.println("<html>"); out.println("<head>"); out.println("<title>Login</title>"); out.println("</head>"); out.println("<body>"); out.println("<h2>Login benar!!!</h2>"); out.println("<h3><a href=\"member\">Klik untuk menuju ke halaman member...</a></h3>"); out.println("</body>"); out.println("</html>"); } else { Cookie c = new Cookie("ckieNama", cookieNonMember); c.setMaxAge(60*60); response.addCookie(c); out.println("Login Salah!!"); RequestDispatcher dis = null; 33 dis = request.getRequestDispatcher("/index.jsp"); dis.include(request, response); } } Program ambil nilai dari form input username dan password. Username dan password ini akan divalidasi. o Jika username dan passwordnya adalah “member” maka cookie ckieNama akan bernilai konstanta cookieMember dan akan menampilkan halaman “Login benar” serta link untuk memasuki halaman member o Jika username dan password bukan “member” maka cookie ckieNama akan bernilai konstanta cookieNonMember dan akan dikembalikan ke index.jsp dengan peringatan “Login salah”. Cookie diset berumur 60 x 60 detik atau 1 jam. Setelah durasi request mencapai 1 jam maka cookie akan terhapus. Didalam aplikasi professional, isi cookie jangan berupa konstanta. Isi cookie haruslah acak dan unik untuk client tertentu, bisa saja berdasarkan username dan password. 5. Buatlah lagi sebuah servlet untuk mengarahkan user ke halaman member dan beri nama MemberPage. Ketik kode berikut dalam method processRequest ( ) protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); RequestDispatcher dis; String cookieMember = "1234567890"; request, try { Cookie[] cookies = request.getCookies(); String cNama = ""; if(cookies!=null){ for(int x=0; x<cookies.length; x++){ if(cookies[x].getName().equals("ckieNama")){ cNama = cookies[x].getValue(); 34 break; } } } if(cNama.equals(cookieMember)){ dis = request.getRequestDispatcher("/member.jsp"); } else { dis = request.getRequestDispatcher("/index.jsp"); out.println("Anda Belum Login Sebagai Member!!"); } dis.include(request, response); } finally { out.close(); } } Di servlet MemberPage ini program akan mengecek lagi validitas dari client. Mengapa kit cek lagi validitas clientnya ? Untuk mencegah client nonmember yang ingin masuk ke halaman member tanpa mekanisme login terlebih dahulu. Program akan mengecek semua cookie pada client . Jika ada cookie dengan nama ckieNama, selanjutnya akan diperiksa isi cookie tersebut. o Jika isi cookieNama adalah konstanta cookieMember maka client akan diarahkan ke halaman khusus member (member.jsp) o Jika isi cookie ckieNama bukan konstanta cookieMember maka client akan diarahkan ke halaman index.jsp dengan peringatan “Anda belum login sebagai member”. 6. Build dan Run project. Masuklah sebagai member. Ketik username dan password “member”. Gambar 4.1. Login sebagai member 35 7. Jika login benar akan muncul tampilan berikut : Gambar 4.2. Berhasil masuk sebagai member 8. Klik link-nya kita akan masuk ke halaman member. 9. Kita sudah masuk sebagai member. Kita coba untuk langsung mengakses halaman member tanpa melalui mekanisme login. Buka tab baru dan ketikkan url berikut : http://localhost:8084/DemoCookie/member 10. Hasilnya kita akan tetap bisa mengakses halaman khusus member. Tetapi cobalah membuka browser lain dan masuk langsung ke halaman khusus member. Ketik url berikut : http://localhost:8084/DemoCookie/member. Kita tidak bisa mengakses halaman member karena dianggap belum login disebabkan browser berbeda, berarti client berbeda pula. Gambar 4.3. Halaman index dengan peringatan user belum login sebagai member 11. Sekarang coba untuk masuk sebagai member. Ketikkan username dan password sembarang. Hasilnya akan dikembalikan ke index dengan peringatan login salah. Gambar 4.4. Peringatan Login Salah 36 12. Kita belum masuk sebagai member. Coba lagi untuk langsung mengakses halaman member tanpa melalui mekanisme login. Buka tab baru dan ketikkan url berikut : http://localhost:8084/DemoCookie/member. Hasilnya akan dikembalikan ke index dengan peringatan bahwa kita belum masuk sebagai member. Ini terjadi karena isi cookie kita sudah berubah, bukan cookie member lagi. RANGKUMAN Cookie merupakan informasi kecil yang dikirim kepada client/browser dari server dan cookie dijadikan tempat penyimpanan sementara state yang disimpan disisi client/browser. Cookie dipakai untuk mengidentifikasi client dan berisi ID unik pada tiap client. Cookie hanya dapat menampung data string sederhana dan bukan data kompleks seperti data context Cookie akan terhapus begitu browser ditutup , namun cookie bisa diatur waktu hidupnya sehingga bisa disimpan lebih lama oleh web browser. Kelemahan cookie yang utama adalah pengguna wajib menggunakan web browser yang mendukung cookie dan mengaktifkan cookienya. Cookie dapat meningkatkan beban di jaringan akibat informasi yang sama yang dikirim terus – menerus. Keuntungan cookie adalah bahwa cookie bisa digunakan untuk identifikasi client dan tidak terpengaruh pada crash server karena data disimpan di client serta dapat meringankan beban di memori user. Java menyediakan fasilitas untuk menggunakan cookie melalui class javax.servlet.http.Cookie LATIHAN SOAL 1. Jelaskan apa yang dimaksud dengan cookie ! 2. Kemukakan kelemahan dan keuntungan cookie. Jelaskan ! 3. Jelaskan tahapan membuat cookie di java ! 4. Buatlah program berbasis java web yang mengimplementasikan cookie dalam transaksi pembelian barang Gunakan servelt dan jsp. 37 BAB V SESSION 5.1. Session Session merupakan fasilitas penyimpanan pada server untuk mengidentifikasi client. Session dikirim pertama kali oleh server ketika client melakukan request. Session disimpan di sisi server. Pada request – request selanjutnya yang berasal dari client yang sama, client akan tetap berada dalam session yang sama selama session tersebut valid. Server akan menandai client dengan session ID yang unik.Tiap client yang mengakses server akan memiliki session masing – masing. Jika ada dua client mengakses server, maka dua client tersebut akan memiliki session ID yang berbeda dan antar session client tidak saling berhubungan. Berbeda dengan application context yang dibahas pada bab sebelumnya, pada application context, isi context bisa diakses oleh semua client. Jika isi context adalah A maka kedua client bisa mengakses context yang sama yang bernilai A. Namun di session, masing – masing client memiliki session sendiri. Jika context client 1 bernilai A, maka context client 2 belum tentu bernilai A. Session memiliki waktu hidup di server. Session dapat diakhiri atas permintaan user. Session otomatis akan berakhir ketika kita menutup browser. Tapi waktu hidup server bisa juga diatur oleh server. Tidak ada batasan waktu bagi session, bisa dalam hitungan detik, menit, hari bulan bahkan bertahun – tahun. Mungkin kit apernah login ke email kita, tapi sebelum kita logout, kita sudah tutup browser kita. Saat kita membuka email kita, kita diruh login lagi. Itu karena server sudah lupa dengan session kita. Namun ada juga email yang langsung masuk ke account kita, meski kita sudah menutup browser-nya. Itu karena session kita masih aktif sehingga server masih mengingat kita. 38 Karena session disimpan di sisi server, maka tidak ada kekhwatiran atas penolakan session oleh client/browser seperti pada cookie. Namun sebaliknya, jika ada banyak client maka server juga harus mengingat banyak client pula. Hal ini akan membuat beban memori server menjadi berat. Karena itu ada mekanisme logout untuk mengakhiri session, disamping untuk keamanan client juga. Session dapat menampung berbagai jenis data object, bahkan object yang kompleks. Karena itu session tidak hanya dapat digunakan untuk identifikasi client saja, namun juga untuk hal lainnya. Konsep session ini biasa digunakan, semisal pada aplikasi web yang memerlukan login penggunanya. Server dapat menyimpan data unik berdasarkan username dan password di dalam session. Atau pada aplikasi toko online. Dimana keranjang belanja client satu dan lainnya akan berbeda. Seorang client bisa melakukan request berkali – kali untuk mengumpulkan barang – barang yang ingin dibeli dalam keranjang belanja yang sama. Keranjang belanja inilah yang disimpan di session. 5.2. Session – Tracking Di java untuk memanipulasi session kita menggunakan class HttpSession. HttpSession berfungsi untuk mendapatkan session saat ini atau menciptakan session baru. Semua data untuk satu session tertentu disimpan dalam server. Ketika ada request dating dari client tertentu maka perlu cara mengidentifikasi client tersebut masuk dalam session yang mana, sehingga server perlu memberi ID bagi tiap client. Ada tiga cara pemberian ID bagi client untuk session tertentu (session tracking) Cookie; ketika server membuat session, session ID akan disertakan dalam bentuk cookie dan disimpan di browser. Jika client melakukan 39 request, cookie dikirim kembali ke server. Kelemahan cookie adalah cookie bisa ditolak oleh browser client URL-rewriting; jika browser menolak cookie , URL-rewriting bisa menjadi solusi penggantinya. Session ID dan parameter lainnya akan disertakan dalam url. Contohnya seperti url ini : http://www.websit.com/page?id=12345&&user=member. Meski bisa menjadi alternative cooki, URL-rewriting juga memiliki kelemahan karena membutuhkan pengolahan ekstra oleh server Hidden Form-Fields Hidden form-field ini menggunakan komponen input html sebagai bagian dari tag <form>, di mana session ID dimasukkan ke dalam input form tersembunyi yang tidak terlihat oleh user. Bagaimanapun, cara ini juga sangat terbatas karena hanya dapat digunakan ketika ada form di halaman yang digunakan client. 5.3. Manajemen Session Untuk menajemen session / identifikasi client, penggunaan session lebih menguntungkan dibandingkan cookie. Cookie yang disimpan oleh client dapat ditolka oleh browser. Meskip cookie dapat diganti dengan URL-rewriting, namun cookie hanya bisa menyimpan data string sederhana. Sedangkan session yang disimpan oleh server dapat menyimpan objek yang lebih kompleks. Namun session juga memiliki kelemahan. Karena dengan mengingat banyak client, itu berarti server harus menanggung beban memori yang besar, umumnya waktu valid suatu session tidaklah lama. Karena itu cookie memiliki keunggulan jika diperlukan untuk hal identifikasi client dalam jangka waktu yang lebih lama. Cookie dapat 40 diatur agar bisa disimpan lama di browser. Ini juga memudahkan server mengidentifikasi pola perilaku client dalam mengakses website. 5.4. Session di Java Di java untuk memanipulasi session kita menggunakan HttpSession. Adapun hal – hal yang perlu diingat adalah sebagai berikut : Untuk mendapatkan Session saat ini atau menciptakan session baru : HttpSession session = request.getSession( ) Untuk menyimpan data di session session.setAttribute(NamaSession, value) Untuk mengambil data dari session session.getAttribute(NamaSession) Untuk menghapus session session.removeAttribute (NamaSession); session.invalidate ( ); Dengan method invalidate( ) server akan melepaskan semua objek yang berkaitan dan melupakan session. Default waktu session di java adalah 30 menit atau tergantung setingan server di web.xml. Jika selama 30 menit tidak ada request otomatis session akan berakhir. 5.5. Contoh Program Untuk aplikasi session ini kita akan membuat sebuah halaman login dan sebuah halaman khusus untuk member. Jika kita login sebagai member, kita akan diizinkan mengakses halaman khusus member tersebut. Dan jika bukan member, maka kita tidak diizinkan. Hanya user member yang akan mendapatkan session dari server. Selagi session member aktif, maka setiap kali user mengakses atau website ini, user akan langsung diarahkan menuju halaman khusus member. Jika session habis atau user 41 belum login maka akan diarahkan ke halaman index. Langkah – langkahnya adalah sebagai berikut : 1. Buat sebuah project dan beri nama DemoSession. Buat sebuah form input username dan password pada index.jsp. Masukkan kode berikut ini : <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h2>Login Member</h2> <form method='post' action='login'> <fieldset> Username: <input type='text' name='uname' /> <br><br> Password: <input type='password' name='pass' /> <br><br> <input type='submit' value='Login' /> </fieldset> </form> </body> </html> 2. Buat halaman khusus member dengan menggunakan jsp. Halaman ini hanya menampilkan tulisan “Halaman Khusus Member”. 3. Buat servlet baru dan beri nama :LoginServlet. Ketikkan kode berikut pada method processRequest( ) protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); RequestDispatcher dis = null; String username = request.getParameter("uname"); request, 42 String password = request.getParameter("pass"); if(username.equals("member") && password.equals("member")){ session.setAttribute("user",username); dis = request.getRequestDispatcher("/member.jsp"); dis.forward(request, response); }else{ dis = request.getRequestDispatcher("/index.jsp"); out.println("Login Salah!!"); dis.include(request, response); out.close(); } } 4. Buat lagi sebuah servlet untuk mengakhiri session dan beri nama LogoutServlet. Kita akan mengecek validitas session-nya. Ketik kode berikut dalam method processRequest ( ). protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); RequestDispatcher dis =null; HttpSession session = request.getSession(); if (session.getAttribute("user") != null){ session.removeAttribute("user"); session.invalidate(); } dis = request.getRequestDispatcher("/home"); dis.forward(request, response); request, } 5. Buat lagi sebuah servlet dan beri nama HomeServlet. Ketikkan kode berikut pada method processRequest( ) protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); RequestDispatcher dis = null; HttpSession session = request.getSession(); request, 43 if (session.getAttribute("user") != null){ if(session.getAttribute("user").equals("member")){ dis = request.getRequestDispatcher("/member.jsp"); dis.forward(request, response); } }else{ dis = request.getRequestDispatcher("/index.jsp"); dis.include(request, response); out.close(); } } Pada HomeServlet ini, program akan mengecek apakah session user aktif dan client adalah member atau bukan. Jika member maka client akan langsung diarahkan ke halaman khusus member tanpa harus login terlebih dahulu Jika session tidak aktif dan bukan member maka client akan diarahkan ke index.jsp untuk login terlebih dahulu. 6. Build dan Run Project. Akan diperoleh tampilan sebagai berikut : Gambar 5.1. Masuk sebagai Member (implementasi Session) 7. Jika login benar kita akan masuk ke halaman member seperti tampilan berikut ini Gambar 5.2 Halaman khusus member 44 8. Kita sudah masuk sebagai member. Coba untuk mengakses lagi halaman awal aplikasi kita dengan mengetikkan url berikut : http://localhost:8084/DemoSession/. Hasilnya akan langsung diarahkan ke halaman khusus member karena session kita masih aktif. Untuk mengakhiri session, klik logout. 9. Sekarang kita coba untuk masuk bukan sebagai member. Hasilnya akan dikembalikan ke index dengan peringatan login salah Gambar 5.3 Halaman index dengan Login Salah RANGKUMAN Session merupakan fasilitas penyimpanan pada server untuk mengidentifikasi client. Dalam hal ini server akan menandai client dengan session ID yang berbeda – beda Session memiliki waktu hidup di server. Session dapat diakhiri atas permintaan user dan secara otomatis session akan berakhir ketika kita menutup browser Karena session disimpan di sisi server, maka tidak ada kekhwatiran atas penolakan session oleh client/browser seperti pada cookie Penggunaan session lebih menguntungkan dari cookie untuk identifikasi client dalam waktu yang singkart Dalam java session diimplementasikan dengan class HttpSession. 45 Beberapa method yang penting dalam HttpSession.setAttribute(NamaSession, class value), HttpSession new adalah new HttpSession.getAttribute (NamaSession) dan new HttpSession.invalidate ( ) LATIHAN SOAL 1. Jelaskan apa yang dimaksud dengan session ! 2. Jelaskan keuntungan dan kelemahan menggunakan session dibandingkan dengan cookie ! 3. Kemukakan langkah – langkah yang anda lakukan dalam menggunakan session di java. Jelaskan method – method yang digunakan ! 4. Berikan contoh program dalam bentuk java web yang didalamnya berisikan penggunaan session dalam menangani transaksi ! 46 BAB VI FILTER Dalam aplikasi skala enterprise web servlet memiliki banyak tugas selain menangani request/response, bahkan alur logika yang lebih kompleks. Beberapa tugas servlet dapat diserahkan pada komponen web lainnya agar servlet dapat focus pada tugas utamanya. Tugas servlet dalam hal menyaring request atau response dapat diserahkan pada komponen yang disebut filter. 6.1. Filter Filter adalah komponen web yang tugasnya melakukan penyaringan terhadap request/response. Filter dikenal sejak spesifikasi servlet 2.3. Filter dapat melakukan pro-proses request maupun paska-proses pada response. Request dan response dianalisis, diubah ataupun ditolak oleh filter. Filter dapat menangani, baik header ataupun content dari request atau response. Filter merupakan komponen yang dapat dipakai untuk menambahkan proses sebelum atau setelah resource di dalam aplikasi web diakses. Fungsi filter ini berkaitan dengan fungsi pengalihan response. Mungkin anda pernah mengakses website dimana bahasa yang ditampilkan pada website sesuai dengan Negara dari mana kita mengaksesnya. Disana kita melakukan request mengakses website tersebut, filter akan meny aring asal negara kita. Jika kita mengakses dari Indonesia maka bahasa yang ditampilkan adalah bahasa Indonesia. Filter mengambil sebagian tugas servlet dalam hal menyaring request atau response, sehingga servlet bersih dari logika program yang lebih rumit. Selain itu sebuah filter dapat digunakan berkali – kali bahkan pada servlet yang berbeda – beda. 47 Web App Servlet HTTP Request JSP ServletFilter Static file Gambar 6.1. Cara kerja Filter Filter berdiri diantara request / response dengan resource web yang ingin diakses. Filters bekerja dengan menangkap request client. Ketika request melewati client, filter menjalankan proses penyaringan. Kemudian filters dapat memutuskan apakah request dapat mengakses resource yang dimaksud atau menolak akses ke resource. Cara kerja yang sama juga berlaku jika filter diterapkan pada response. Didalam java ada 3 interface yang berhubungan dengan filter, interface Filter, FilterChain dan FilterConfig. Ketiga interface ini berada dalam package javax.servlet. 6.2. Siklus Hidup Filter Siklus hidup filter mirip dengan servlet yang memiliki 3 tahap yaitu init, service dan destroy. Siklus hidup didefinisikan dalam method – method dalam interface Filter, yaitu method init( ), doFilter ( )dan destroy ( ). Initialization int( ) Request Response Service doFilter ( ) Destruction destroy ( ) Gambar 6.2 Siklus Hidup Filter 48 Siklus hidup filter diawali dengan method inti ( ) yang dipanggil oleh web container. Filter akan dikirim ke memory dan dimasukkan ke service. Ada kemungkinan filter tidak dapat masuk ke service karena terjadi exception. Selnjutnya web container akan menunggu request / response. Method doFilter akan dipanggil jika ada request / response untuk mulai menjalankan proses filter. Method destroy ( ) dipanggil jika filter telah out of service. Web container akan mengambil filter dari memory dan resources di dalam filter dibersihkan. Web container hanya akan menciptakan satu instance dari sebuah object fileter dan menggunakan multi-threading untuk memungkinkan pengaturan beberapa request client secara bersama – sama. 6.3. Rantai Filter Sebuah resource dalam web dapat menerima request yang terfilter secara berantai yang memungkinkan pemakaian lebih dari satu filter. Filter – filter mampu membentuk sebuah siklus sendiri menjadi sebuah rantai filter. Rantai filter direpresentasikan dalam interface FilterChain yang menunjukkan urutan filter hingga mencapai resource tertentu. Objek filter akan memanggil FilterChain.doFilter ( ) untuk memanggil filter berikutnya. Jika filter tersebut adalah filter terakhir dari rantai filter, maka yang akan dipanggil adalah resource yang dituju. Filter A Request FilterChain.doFilter ( ) Response Filter B FilterChain.doFilter ( ) Servlet FilterChain.doFilter ( ) Gambar 6.3. Rantai Filter 49 Misal 2 buah filter A, B dan sebuah servlet. Request terhadap servlet akan melewati filter A telebih dahulu. Ketika FilterChain.doFilter ( ) dipanggil maka filter A akan dijalankan. Filter A memanggil FilterChain.doFilter ( ) untuk menjalankan filter B. Filter B adalah filter terakhir sehingga ketika FilterChain.doFilter ( ) dipanggil maka servlet di titik akhir akan dijalankan. Servlet akan mengirim response. Thread dari servlet akan kembali ke filter B, kemudian ke filter A hingga web container untuk disampaikan kepada client. 6.4. Menggunakan Filter Untuk menggunakan filter, perlu dilakukan beberapa langkah berikut : Buat class yang mengimplementasikan interface Filter Tulis logika program di dalam method doFilter ( ) Jika menggunakan rantai filter, panggil filter berikutnya dengan FilterChain.doFilter ( ) Registrasi filter ke deployment descriptor web xml Jika kita menggunakan netbeans, sudah tersedia wizard untuk menambahkan filter. Kita tidak sulit, terutama dalam registrasi filter, kita hanya mengikuti langkah – langkah yang ditunjukkan wizard. 6.5. Contoh Program Untuk contoh penggunaan filter, kita akan buatkan sebuah halaman login dan sebuah halaman member. Jika kita login sebagai member, kita akan diarahkan ke halaman member. Dan jika bukan sebagai member, kita akan dikembalikan ke halaman index. Filterlah yang akan memutuskan apakah kita login sebagai member atau tidak. Ikutilah langkah – langkah berikut ini : 1. Buat sebuah project baru dengan nama DemoFilter. Lakukan penyetingan seperti pada contoh soal sebelumnya 50 2. Buatlah form input username dan password pada index.jsp seperti pada contoh program Bab V 3. Buat juga sebuah halaman jsp dengan nama member.jsp. Lihat contoh soal Bab V 4. Buat sebuah servlet dengan nama LoginServlet. Ketik kode berikut pada prosessRequest ( ) protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); RequestDispatcher dis = null; dis = request.getRequestDispatcher("/member.jsp"); dis.forward(request, response); } request, Tidak ada tugas autentikasi pada servlet ini. Tugas servlet disini hanyalah untuk mengarahkan member menuju halaman member. 5. Buat sebuah filter untuk melakukan tugas autentikasi. Klik kanan pada sourcepackages di tab project. Pilih New > Filter Gambar 6.4. Membuat Filter AuthenticationFilter 6. Kita atur filter mappingnya. Klik Edit 51 Gambar 6.4. Configure Filter 7. Klik radio-button Servlet dan pilih LoginServlet. Centang checkbox REQUEST pada Dispatch Condition. Klik OK kemudian klik Finish. Gambar 6.5. Filter Mapping 8. Buat kode authentikasi agar hanya user yang login sebagai member yang bisa mengakses servlet LoginServlet. Ketik kode berikut dalam method doFilter ( ) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String username = request.getParameter("uname"); String password = request.getParameter("pass"); 52 if(username.equals("member") && password.equals("member")){ chain.doFilter(request, response); }else{ RequestDispatcher dis = request.getRequestDispatcher("/index.jsp"); dis.forward(request, response); } } Filter akan memvalidasi user yang melakukan login. Jika yang login adalah member, maka filter akan menjalankan servlet LoginServlet melalui method FilterChain.doFilter ( ). Jika bukan member, maka akan dikembalikan ke halaman index. RANGKUMAN Filter adalah komponen web yang tugasnya melakukan penyaringan terhadap request/response Fungsi filter berkaitan dengan fungsi pengalihan response. Filter mengambil sebagian tugas servlet dalam hal menyaring request atau response, sehingga servlet bersih dari logika program yang lebih rumit. Filter berdiri diantara request / response dengan resource web yang ingin diakses dan bekerja dengan menangkap request client Didalam java ada 3 interface yang berhubungan dengan filter, interface Filter, FilterChain dan FilterConfig. Ketiga interface ini berada dalam package javax.servlet Siklus hidup filter mirip dengan servlet yang memiliki 3 tahap yaitu init, service dan destroy LATIHAN SOAL 1. Jelaskan manfaat filter dalam pemrograman java web berskala enterprise ! 2. Jelaskan apa yang dimaksud dengan siklus hidup filter ! 3. Jelaskan langkah – langkah yang dilakukan untuk mengimplementasikan filter . Uraikan penggunaan method – methodnya ! 4. Buatlah aplikasi sederhana menggunakan filter, dimana skenarionya sebagai berikut : apabila user mengklik Logout maka user akan dibawa ke halaman Logout dan bila user mengklik Lanjut maka user akan dibawa ke halaman transaksi lainnya 53 BAB VII DASAR JSP JSP merupakan bagian dari J2EE. Halaman JSP adalah text dokumen yang dapat menghasilkan halaman web yang statis maupun dinamis. Halamana JSP terdiri atas html/xml standard an tag script JSP. Sama seperti halaman html biasa, JSP menggunakan protocol HTTP. JSP bertujuan memisahkan business logic dengan presentation/tampilan. JSP dibuat untuk menyederhanakan proses presentation halaman web. Komponen java lainnya dapat dibuat terpisah dari JSP dan dapat diakses dengan server side scripting. Hal ini akan memudahkan perubahan tampilan tanpa harus mempengaruhi business logicnya. 7.1. JSP VS SERVLET Kelemahan servlet ada dalam pembuatan halaman web. Servlet harus mengirimakan code html sebagai code java sehingga proses pengiriman akan menjadi lebih lama. Kelebihan JSP adalah codingnya sama dengan HTML namun bercampur dengan tag script JSP. JSP lebih mudah dipakai untuk membuat halaman web yang cantik. JSP dapat langsung dijalankan dengan membuat file jsp-nya saja, sedangkan untuk menjalankan servlet harus dibungkus menjadi sebuah paket (.war) terlebih dahulu. Secara sederhana dapat dikatakan perbedaan servlet dan JSP, yaitu servlet merupakan file java yang dapat disisipi code html, sedangkan JSP merupakan file html yang dapat disisipi code java. 7.2. Cara Kerja JSP JSP dikembangkan berdasarkan teknologi servlet yang mempunyai fitur untuk menggabungkan antara content statis dan content dinamis dalam satu halaman web. JSP merupakan perluasan dari servlet dimana ketika JSP dijalankan maka akan dikompilasi menjadi servlet terlebih dahulu. 54 HTTPRequest New Or Change d Y JSP Servlet (java) Servlet (class) HTTPRespons e Servlet Gambar 7.1 Cara Kerja JSP Saat terjadi request dari user, maka akan dicek apakah file jsp mengalami perubahan. Jika berubah maka file jsp akan dibuat sourcenya dalam bentuk file Java. File java di-compile menjadi file class dan dieksekusi dalam bentuk servlet. Jika tidak maka akan langsung dieksekusi sebagai servlet. 7.3.Siklus Hidup JSP JSP juga memiliki siklus hidup. Siklus hidup JSP mirip seperti servlet terdiri atas 3 tahap, yaitu init, service dan destroy. JavaServer Page jspinti( ) (Load Resources) Reques t Respon se jspService( ) (Accept Request) jspDestroy( ) (Unload Gambar 7.2 Siklus hidup JSP Resources) 55 Siklus hidup ini dicerminkan dari interface javax.servlet.jsp. JspPage melalui method :jspInit( ), jspService( ) dan jspDestroy ( ), Interface jspPage merupakan turunan dari javx.servlet.Servlet. JSP di compile ke dalam class servlet yang sama oleh server sehingga class servlet yang menangani permintaan untuk JSP 7.4.Syntax JSP JSP berusaha untuk menggabungkan antara konten web statis dan dinamis. Oleh karena itu JSP memungkinkan kode java untuk disertakan dalam sebuah halaman JSP. Secara garis besar, elemen – elemen standar dalam JSP bila dikelompokkan menjadi 3, yaitu : Elemen perintah (Directive) Elemen scripting Elemen action 7.4.1. Elemen Perintah (Directive) Elemen directive merupakan elemen yang memberikan informasi mengenai halaman JSP itu sendiri. Ada 3 directive, yaitu page, include dan taglib. Page directive Page directive mendefiniskan atribut dalam jangkauan seluruh file JSP itu. Syntax standart page directive itu adalah seperti ini : <%@ page attribute %>. Atribute page directive bisa dilihat di : http://java.sun.com/products/jsp/syntax/2.0/syntaxref2010.html Contoh page directive : <%@ page import=”java.util.*” %> <%@ page buffer=”5kb” %> 56 <%@ pag errorpage=”error.jsp” %> Include directive Include directive digunakan untuk menginclude suatu file dalam JSP. Syntax standart include directive adalah seperti ini : <%@ include file=”relativeURL” %> Contoh include directive : <%@ include file=”date.jsp” %> Taglib directive Taglib directive mendefinisikan tag library dan prefix untuk custom tag dalam halaman JSP. Syntax standar taglib directive adalah seperti ini : <%@ taglib url=”URLToTagLibrary” prefix=”tagPrefix” %> Contoh taglib directive: <%@ taglib url=http://www.jspcentral.com/tags prefix=”public” %> 7.4.2. Scripting Elemen scripting mengizinkan code java untuk dimasukkan dalam halaman JSP. Ada 3 cara memasukkan code java, yaitu ekspression, scriplet dan declaration. Expression Expression biasanya digunakan untuk mencetak nilai variable. Saat halaman jsp dijalankan, expression akan dievaluasi dan dikonversi menjadi string. Syntax standart expression adalah seperti ini : <%= expression %>. Contoh expression : <%= numguess.getHint( ) %> Scriplet Scriplet digunakan untuk menyisipkan code java biasa pada halaman JSP. Kode java meliputi perulangan, kondisi, akses 57 database, deklarasi variable dan sebagainya. Contoh syntax scriplet adalah seperti ini : <% code fragment %> Contoh scriplet : <% String name = null; If(request.getParameter(“name”) == null { %> <%@ include file=”error.html” %> <% } else { foo.setName(request.getParameter(“name”)); if(foo.getName( ).equalsignoreCase(“integra”)) name = “acura”; if( name.equalsIgnoreCase(“acura”)) name = “integra”; }%> Declaration Declaration digunakan untuk mendefinisikan variable atau method. Syntax dasar declaration adalah seperti ini : <%! Declaration; [declaration;]+ …%> Contoh declaration : <%! Int I = 0; %> <%! Int a,b,c; %> <%! Circle a = new Circle(2,0); %> 58 7.4.3. Action Elemen action merespon action berdasarkan informasi yang diperlukan halaman JSP. Elemen action didefinisikan dengan prefix “jsp”. Berikut daftar elemen action : <jsp:attribute> <jsp:body> <jsp:element> <jsp:doBody> <jsp:forward> <jsp:getProperty> <jsp:include> <jsp:invoke> <jsp:output> <jsp:plugin> <jsp:root> <jsp:setProperty> <jsp:text> <jsp:useBean> Jika ingin mempelajari lebih lanjut mengenai syntax JSP secara lengkap bisa dilihat di : http://java.sun.com/products/jsp/syntax/2.0/syntaxref20.htm. 7.5. Contoh Program Buatlah form penjumlahan 2 buah bilangan. Buat juga error-page jikalau user nantinya salah melakukan input selain angka. Proses penjumlahan dan penanganan error akan dilakukan di dalam halaman JSP. Langkah – langkah penyelesaian : 59 1. Buat project baru dan beri nama DemoJSP. Lakukan pengaturan seperti pada contoh soal Bab sebelumnya. 2. Buat 2 buah form input penjumlahan pada index.jsp. ketik kode berikut : <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <form method='post' action='result.jsp'> <fieldset> Angka 1: <input type='text' name='angka1' /> <br><br> Angka 2: <input type='text' name='angka2' /> <br><br> <input type='submit' value='Hitung' /> </fieldset> </form> </body> </html> 3. Tidak seperti bab sebelumnya, dimana kita menggunakan servlet untuk memproses input. Kali ini proses penjumlahan akan kita lakukan di dalam JSP. 4. Karena proses penjumlahan ini memungkinkan terjadi exception semisal input bukanlah angka, maka perlu kita buat error-page. Klik kanan pada web pages di tab project pilih New > JSP. Beri nama file : error dan klik finish. Ketik kode berikut pada error.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4.01 <%@page isErrorPage="true" %> 60 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Telah Terjadi ERROR!!</h1> </body> </html> 5. Buat sebuah halaman jsp untuk memproses penjumlahan dan menampilkan hasilnya. Beri nama result Gambar 7.3. Halaman result.jsp 6. Ketik kode berikut pada result.jsp <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <%@page errorPage="/error.jsp" %> <% String angka1str = request.getParameter("angka1"); String angka2str = request.getParameter("angka2"); 61 int angka1 = Integer.parseInt(angka1str); int angka2 = Integer.parseInt(angka2str); int hasil = angka1 + angka2; %> <h3>Hasil dari <%=angka1%> + <%=angka2%> adalah <%=hasil%></h3> </body> </html> Program akan mengambil angka 1 dan angka 2 kemudian di parse ke tipe data integer. Kedua angka tersebut dijumlahkan dan hasilnya akan ditampilkan. Kita daftarkan error-page menggunakan page directive errorPage <%@page errorPage=”/error.jsp” %> JSP container akan mengarahkan ke halaman error.jsp bila terjadi exception di halaman result.jsp ini 7. Build dan jalankan program dan coba masukkan angka numeric terlebih dahulu Gambar 7.4. Memasukkan angka numerik 8. Klik back pada web browser dan coba masukkan input bukan angka. 9. Hasilnya adalah error. User diarahkan ke error.jsp RANGKUMAN JSP bertujuan memisahkan business logic dengan presentation/tampilan. JSP dibuat untuk menyederhanakan proses presentation halaman web 62 Kelemahan servlet ada dalam pembuatan halaman web. Servlet harus mengirimakan code html sebagai code java sehingga proses pengiriman akan menjadi lebih lama. Kelebihan JSP adalah codingnya sama dengan HTML namun bercampur dengan tag script JSP. JSP lebih mudah dipakai untuk membuat halaman web yang cantik. JSP merupakan perluasan dari servlet dimana ketika JSP dijalankan maka akan dikompilasi menjadi servlet terlebih dahulu JSP memiliki siklus hidup dan siklus hidup JSP mirip seperti servlet terdiri atas 3 tahap, yaitu init, service dan destroy Secara garis besar, elemen – elemen standar dalam JSP bila dikelompokkan menjadi 3, yaitu :Elemen perintah (Directive),Elemen scripting dan Elemen action Elemen directive merupakan elemen yang memberikan informasi mengenai halaman JSP itu sendiri Elemen scripting mengizinkan code java untuk dimasukkan dalam halaman JSP Elemen action merespon action berdasarkan informasi yang diperlukan halaman JSP LATIHAN SOAL 1. Berikan perbedaan antara JSP dan Servlet. Berikan keuntungan dan kelemahannya masing – masing ! 2. Jelaskan dengan menggunakan bagan cara kerja dari JSP ! 3. Apakah yang dimaksud dengan siklus hidup JSP. Jelaskan dengan menggunakan gambar ? 4. Jelaskan elemen – elemen dasar dari JSP ! 5. Buatlah JSP page yang digunakan untuk mengautentikasi user. User hanya bisa masuk ke halaman utama apabila nama dan passwordnya sama serta memiliki jumlah karakter lebih dari delapan ! 63 BAB VIII JSP LANJUT 8.1. Expression Language Expression Language dapat digunakan untuk menggantikan elemen scripting guna mempermudah penulisan ekspresi dalam halaman JSP. Expression Language diperkenalkan dengan spesifikasi JSP 2.0 Expression Language memiliki bentuk yang lebih sederhana dan ditulis dengan syntax : ${Expression}. Sebagai gambaran bagaimana sederhanaya penggunaan expression language, jika itu menggunakan elemen scripting atau elemen action kita akan menulis syntax seperti ini : <% String name = user.getName ( ); %> atau <jsp:getProperty name = “user” property=”name” /> Namun dengan expression language penulisan syntax hanya seperti ini : ${user.name} Perhatikan, jika kita menggunakan elemen scripting kita juga harus memahami property dari tipe data di Java. Dan jika kita menggunakan elemen action ini, penulisannya cukup panjang dan susah. Bandingkan jika kita menggunakan Expression Language penulisannya singkat dan langsung pada intinya dan kita tidak harus memahami property dan tipe data di java. Halaman JSP bisa dibuat tanpa scripting dengan menggunakan expression language, sehingga memungkinkan pemisahan antara programmer dengan web designer. Hal ini sesuai dengan tujuan JSP, yaitu memisahkan antara presentation dengan business logic. Expression language bisa berupa literal, operator, object implicit ataupun fungsi. 64 8.1.1 Literal Expression language mendefinisikan literal berupa o Boolean o Long o Float o String o Null Contoh expression language berupa literal : ${false} hasilnya adalah false ${1+2+3} hasilnya adalah 6 ${“Saya ganteng”} hasilnya adalah string “Saya ganteng” 8.1.2 Operator Expression language menyediakan operator berikut : o Aritmetika : -, bianary, *, / dan div, % dan mod, unary o Logika : and, &&,or,||,not,! o Relational : ==, eq, !=, ne, <, lt, >, gt, <=, ge, >=, le Perbandingan dapat dilakukan terhadap nilai – nilai lain atau terhadap Boolean, string, integer, atau literal floating point o Empty : Operator kosong adalah prefix yang digunakan untuk menentukan apakah suatu nilai adalah null atau kosong o Kondisional : A ? B : C. Jika A true maka hasilnya B, Jika A false maka hasilnya C o Referensi: .,// Referensi berdasarkan property atau index. Contoh : ${user,nama} sama dengan ${user[name]} 8.1.3 Object Implisit Expression Language mendefinisikan sekumpulan object implicit yaitu 65 o Object pageContext merupakan context untuk halaman JSP. Menyediakan akses ke berbagai objek, termasuk servletContext, session, request, response. o Object Param; Object map yang berisi request nama parameter untuk nilai tunggal o Object ParamValues; Object map yang berisi request nama parameter untuk array o ObjectHeader; Object map yang berisi request nama header untuk nilai tunggal o ObjectHeaderValues; Object map yang berisi request nama header untuk array o Object Cookie; Object map yang berisi nama – nama cookie o Object InitParam; Peta suatu context inisialisasi nama parameter Expression Language menyediakan beberapa object implicit yang mewakili sebuah object Map di dalam jangkauan yang berbeda. o Object PageScope; Object map yang berisi nama attribute dan nilainya dalam jangkauan halaman o Object RequestScope; Object map yang berisi nama attribute dan nilainya dalam jangkauan request o Object SessionScope; Object map yang berisi nama attribute dan nilainya dalam jangkauan session o ObjectApplicationScope; Object map yang berisi nama attribute dan nilainya dalam jangkauan application 8.2. JSTL Java Server Pages Standart Tag Library (JSTL) adalah library yang menyediakan fungsi – fungsi dasar yang umumnya ada pada JSP. JSTL memiliki tag – tag seperti untuk perulangan, kondisi, manipulasi XML, mengakses database dan sebagainya. 66 Penggunaan JSTL dimaksudkan untuk mengurangi penggunaan fungsi – fungsi standart java sehingga memungkinkan menulis kode JSP yang rumit tanpa menggunakan code java. JSTL memiliki berbagai variasi tag sesuai fungsinya masing – masing. Untuk menggunakan library – library JSTL, kita mengimpor dari beberapa URI-nya. Kategorisasi dari tag – tag JSTL adalah Core, XML, Internationalization, SQL dan functions. Untuk menyertakan halaman JSTL didalama halaman JSP, kita harus menyertakan library JSTL serta menuliskan taglib di dalam halaman JSP. Contoh : <%@ taglib uri=http://java.sun.com/jstl/core prefix=”c” %> 8.2.1 JSTL Core Untuk menggunakan JSTL core kita harus mengimport dari URL: http://java.sun.com/jsp/jstl/core. JSTL core menggunakan prefix : “c”. JSTL core terdiri atas subkategori : Variable support Flow control URL management Miscellaneous Daftar tag JSTL core : o <c:out/> <c:otherwise/> o <c:set/> <c:forEach/> o <c:remove/> <c:forTokens/> o <c:catch/> <c:param/> o <c:if/> <c:url/> o <c:choose/> o <c:when/> <c:redirect/> <c:import/> 67 8.2.2 JSTL SQL Untuk menggunakan JSTL SQL, kita harus mengimport dari URI : http://java.sun.com/jsp/jstl/sql. JSTL SQL menggunakan prefix: “sql” Daftar tag JSTL SQL : 8.2.3 o <sql : setDataSource/> <sql: transaction/> o <sql : query/> <sql:param/> o <sql : update/> <sql:dateParam/> JSTL XML Untuk menggunakan JSTL XML, kita harus mengimport dari URI : http://java.sun.com/jsp/jstl/xml. JSTL XML menggunakan prefix :”x” dan terdiri atas subkategori : Core Flow control Transformation Daftar tag JSTL XML : o <x:parse/> <x:when/> o <x:out/> <x:otherwise/> o <x:set/> <x:forEach/> o <x:if/> <x:transform/> o <x:choose/> 8.2.4 <x:param/> JSTL Internationalization Untuk menggunakan JSTL internationalization, kita harus mengimport dari URI : http://java.sun.com/jsp/jstl/fmt. JSTL internationalization menggunakan prefix :”fmt” dan terdiri atas subkategori Locale Message formatting 68 Number and date formatting Daftar tag JSTL internationalization : o <fmt :setLocale/> <fmt:setTimeZone/> o <fmt:setBundle/> <fmt:timeZone/> o <fmt:bundle/> <fmt:parseDate/> o <fmt:message/> <fmt:formatDate/> o <fmt:param/> <fmt:parseNumber/> o <fmt:requestEncoding/> <fmt:formatNumber/> 8.2.5 JSTL Functions Untuk menggunakan JSTL functions, kita harus mengimport dari URI: http://java.sun.com/jsp/jstl/functions. JSTL functions menggunakan prefix :”fn” dan terdiri atas subkategori : Collection length String manipulation Daftar fungsi JSTL functions : o ${fn:contains ( )} ${fn:split ( )} o ${fn:containsIgnoreCase( )} ${fn:startsWith ( )} o ${fn:endsWith ( ) } ${fn:substring ( ) } o ${fn:escapeXml( )} ${fn:substringAfter( )} o ${fn:indexOf( )} o ${fn:join ( )} ${fn:substringBefore( )} ${fn:toLowerCase( )} o ${fn:length ( )} ${fn:toUpperCase( )} o ${fn:replace( )} ${fn:trim ( )} 8.2.6 Contoh Program Berikut ini akan diberikan contoh penggunaan Expression Language dan JSTL. Ikuti Langkah berikut ini : 69 1. Buat sebuah project baru dan beri nama :DemoJSPLanjut. Lakukan penyettingan seperti pada Bab sebelumnya 2. Tambahkan library JSTL pada project. Klik kanan pada libraries > add library. Cari library JSTL 1.1. Klik add library Gambar 8.1. Library JSTL 3. Ketik kode berikut pada index.jsp <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <%@page import="java.util.Date" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <c:set var="judul" value="Demo Expression Language dan JSTL"/> <h2><c:out value="${judul}"/></h2> <% 70 Date tgl = new Date(); pageContext.setAttribute("tanggal", tgl); %> <h3>Tanggal : <fmt:formatDate pattern="dd-mm-yyyy"/></h3> value="${tanggal}" <c:forEach var="nama" items="Maksy, Natan, Steven, Silvan Litow"> <li><b>${nama}</b> </c:forEach> </body> </html> Ada tiga hal yang kita buat disini : Yang pertama kita mengeset sebuah data string lalu mencetaknya Yang kedua kita mencetak tanggal hari ini Yang ketiga kita menggunakan perulangan untuk mencetak nilai suatu kumpulan data string berisi nama Dalam mencetak semua datanya, kita menggunakan expression language. Disini digunakan JSTL Core dan Internationalization, dimana sebelum tag <html> kita sudah mendaftarkan taglibnya. 4. Build dan jalankan programnya . Akan didapat hasil sebagai berikut : Gambar 8.2. Hasil pemakaian EL dan JSTL 71 RANGKUMAN Expression Language dapat digunakan untuk menggantikan elemen scripting guna mempermudah penulisan ekspresi dalam halaman JSP Expression Language memiliki bentuk yang lebih sederhana dan ditulis dengan syntax : ${Expression} Expression language bisa berupa literal, operator, object implicit ataupun fungsi. Expression Language mendefinisikan sekumpulan object implicit berupa Object pageContext, Object Param, Object ParamValues,Object Header, object HeaderValues, Object Cookie, object InitParam Java Server Pages Standart Tag Library (JSTL) adalah library yang menyediakan fungsi – fungsi dasar yang umumnya ada pada JSP Penggunaan JSTL dimaksudkan untuk mengurangi penggunaan fungsi – fungsi standart java sehingga memungkinkan menulis kode JSP yang rumit tanpa menggunakan code java Untuk menyertakan halaman JSTL didalama halaman JSP, kita harus menyertakan library JSTL serta menuliskan taglib di dalam halaman JSP Untuk menggunakan JSTL core kita harus mengimport dari URL: SQL, kita harus mengimport dari URI : XML, kita harus mengimport dari URI : http://java.sun.com/jsp/jstl/core. Untuk menggunakan JSTL http://java.sun.com/jsp/jstl/sql Untuk menggunakan JSTL http://java.sun.com/jsp/jstl/xml Untuk menggunakan JSTL internationalization, kita harus mengimport dari URI : http://java.sun.com/jsp/jstl/fmt LATIHAN SOAL 1. Apakah yang dimaksud dengan expression language ? Apakah yang membedakannya dengan jsp ? 2. Jelaskan objek – objek implicit yang dikandung oleh expression language ! 3. Apakah manfaat dari Java Server Pages Standart Tag Library (JSTL) ? 4. Dengan menggunakan expression language buatlah java web yang dapat digunakan untuk membandingkan 2 buah string yang diinput oleh user melalui input form ! 5. Buatlah program menggunakan expression language yang dapat digunakan untuk menentukan apakah bilangan yang diinput user ganjil atau genap ! 72 BAB IX MODEL – VIEW – CONTROLLER Sering kali antara business logic dan user interface digabung dalam satu file yang sama ( servlet atau jsp) atau disebut dengan arsitektur model 1. Hal ini tidak menjadi masalah jika diterapkan pada aplikasi yang sederhana. Tapi jika aplikasi menjadi besar dan kompleks, akan menimbulkan masalah jika terjadi perubahan pada salah satu komponennya. Solusi permasalahan ini adalah menggunakan arsitektur model 2 atau Model – View – Controller(MVC) dalam pengembangannya. 9.1. MVC MVC merupakan konsep arsitektur aplikasi yang memisahkan model data, user interface dan business logic sebagai komponen yang berbeda sehingga modifikasi komponen menjadi lebih mudah. Pada aplikasi dimana code user interface tergabung dengan business logicnya, jika terjadi perubahan pada user interface atau business logic maka keduanya akan salaing mempengaruhi. Misalnya sebuah file jsp dimana berisi code user interface dan business logic untuk mengakses database. Ketika kita ingin mengubah user interfacenya, maka business logicnya juga harus ikut menyesuaikan,. Itu berarti kita harus merombak seluruh kode dalam file jsp tersebut, yang tentunya akan sangat merepotkan. Disamping itu tidak semua programmer bisa melakukan desain atau sebaliknya, seorang desainer web belum tentu bisa melakukan pemrograman. Jika user interface dan business logic digabung maka diperlukan orang yang bisa melakukan program dan desain. Akan tetapi jika aplikasi terlalu besar akan sangat menyulitkan. Perubahan yang terjadi pada komponen yang satu tidak akan terlalu mempengaruhi komponen lainnya secara significant. Paling tidak dengan 73 memakai arsitektur MVC, memerlukan lebih sedikit penyesuaian jika terjadi perubahan. Selain itu seorang desainer bisa focus pada user interface aplikasi dan programmer bisa focus pada business logicnya. Untuk aplikasi yang besar, penerapan MVC akan sangat membantu maintenance atau pengembangan yang selanjutnya. Misal jika hanya aplikasi web apalagi dengan halaman yang statis, tidak perlu menggunakan pola MVC ini. Tetapi untuk aplikasi yang besar misal aplikasi ERP, maka penggunaan kosnsep MVC akan sangat membantu sekali. 9.2. Komponen MVC Arsitektur MVC membagi aplikasi menjadi 3 bagian besar, yaitu model, view, controller dan kemudian membuat interaksi antar ketiganya. 9.2.1. Model Model merepresentasikan data yang digunakan oleh aplikasi. Dengan pemisahan antara data dan interface, komponen model dapat digunakan kembali oleh bagian aplikasi lain yang memiliki kegunaan yang sama. Mungkin kita pernah mengakses situs berita dengan browser desktop atau browser mobile. Yang berbeda dari keduanya hanyalah tampilannya, tetapi business logic yang digunakan tetap sama. Ini menunjukkan bahwa dengan pemisahan seperti ini, berarti interface tidak terikat dengan data, sehingga apa pun interfacenya data yang digunakan bisa sama. Umumnya komponen model berupa class java. 9.2.2. View View merupakan implementasi user interface yang menampilkan data yang telah diolah pada user, atau komponen yang akan berinteraksi dengan user. View ini termasuk komponen yang paling sering berubah. Bahkan pada aplikasi web yang canggih biasa dimodifikasi sendiri oleh user tanpa mempengaruhi business logic dari aplikasi. Umumnya komponen view berupa halaman jsp. 74 9.2.3. Controller Controller merupakan pengontrol aliran request. Data request akan diteruskan ke komponen lain yang mengolah data. Controller juga menentukan komponen aplikasi manakah yang akan dieksekusi, serta menentukan transisi view mana yang akan ditampilkan. Dengan penggunaan komponen controller yang terpisah ini, view dapat didesain tanpa harus memperhatikan komponen lainnya. Umumnya komponen controller berupa servlet. 9.3. Framework MVC Ada banyak framework yang dibuat berbasis arsitektur MVC. Beberapa diantaranya adalah Spring dan Struts . Framework menyediakan sarana untuk mengimplementasikan ketiga komponen MVC (model,view,controller) secara mudah pada aplikasi web. Beberapa framework lain bahkan menyediakan fitur lainnya. 9.3.1. Spring Spring adalah application framework lightweight untuk mempermudah pengembangan aplikasi heavyweight java. Penggunaan Spring tidak hanya terbatas pada aplikasi berbasis web tetapi juga untuk aplikasi java yang lain. Didalam situs resmi spring dikatakan “Spring memberikan solusi lightweight untuk pengembangan aplikasi enterprise, serta tetap mendukung kemungkinan penggunaan declarative transaction, remote access dengan menggunakan RMI ataupun web service, fasilitas mailing serta dukungan ke teknologi presistance yang telah ada. Spring menyediakan sebuah framework MVC, serta tata cara yang transparan dalam integrasi Aspect oriented Programming (AOP) ke dalam aplikasi yang dibangun, dan menyediakan hirarki exception yang terstruktur. Spring dapat menjadi one-stop-solution untuk pengembangan aplikasi enterprise 75 java, tetapi Spring juga bersifat modular sehingga developer dapat mengambil beberapa modul dan mengabaikan modul lainnya”. Seperti yang telah disinggung diatas, Sprint terdiri dari beberapa modul yang dapat dipilih, sehingga kita dapat memilih sesuai kebutuhan aplikasi yang kita kembangkan. Modul – modul Spring dapat digambarkan seperti gambar berikut ini Spring ORM Spring Web Spring Web MVC Spring AOP Spring Context Spring DAO Spring Core Gambar 9.1 Susunan Modul Spring Framework Penjelasan singkat untuk masing – masing modul adalah sebagai berikut : Spring Core; menyediakan sarana fungsionalitas yang fundamental dalam Spring Framework. Dalam modul ini terdapat beanfactory yang merupakan inti dari aplikasi yang menggunakan Spring. Spring Context; BeanFactory modul dengan ini merupakan menambahkan ekstensi dukungan dari untuk internalization, event-event dari siklus hidup aplikasi serta validasi. Modul ini juga menydeiakan service enterprise seperti email, akses JNDI, integrasi dengan EJB, remoting dan penjadwalan, serta integrasi dengan velocity dan freemarker. Spring AOP; modul ini menyediakan layanan penuh pada Aspect Oriented Programming (AOP) 76 Spring DAO; modul ini menyediakan abstraksi ke JDBC dan DAO, sehingga pemrograman dengan kedua komponen tersebut menjadi lebih sederhana dan mudah. Spring ORM; modul ini menyediakan integrasi dengan beberapa Object Relational Mapping (ORM) yang popular saat ini seperti Hibeernate, JDO,Ibatis,SQL Maps, Oracle TopLink Spring Web; modul integrasi menyediakan context yang ditujukan untuk aplikasi berbasis web, dan juga integrasi dengan framework seperti Jakarta Struts, Tapestry,dan WebWork SpringMVC Framework Gambar 4.2 diatas pada dasarnya merupakan pembagian secara koseptual. Pada kenyataannya sebuah modul dapat tersusun dari satu atau beberapa package. Package – package yang terdapat dalam org.springframework terdiri dari aop, beans, chace, context, corte, dao, jb,jca,jdbc,jms,jmx,jndi,mail,metadata,orm,remoting,scheduling dan web. 9.3.2. Struts Spring adalah application framework lightweight untuk mempermudah pengembangan aplikasi heavyweight java. Penggunaan Spring tidak hanya terbatas pada aplikasi berbasis web tetapi juga untuk aplikasi java yang lain. Didalam situs resmi spring dikatakan “Spring memberikan solusi lightweight untuk pengembangan aplikasi enterprise, serta tetap mendukung kemungkinan penggunaan declarative transaction, remote access dengan menggunakan RMI ataupun web service, fasilitas mailing serta dukungan ke teknologi presistance yang telah ada. Spring menyediakan sebuah framework MVC, serta tata cara yang transparan 77 dalam integrasi Aspect oriented Programming (AOP) ke dalam aplikasi yang dibangun, dan menyediakan hirarki exception yang terstruktur. Spring dapat menjadi one-stop-solution untuk pengembangan aplikasi enterprise java, tetapi Spring juga bersifat modular sehingga developer dapat mengambil beberapa modul dan mengabaikan modul lainnya”. Seperti yang telah disinggung diatas, Sprint terdiri dari beberapa modul yang dapat dipilih, sehingga kita dapat memilih sesuai kebutuhan aplikasi yang kita kembangkan. Modul – modul Spring dapat digambarkan seperti gambar berikut ini Spring ORM Spring Web Spring Web MVC Spring AOP Spring Context Spring DAO Spring Core Gambar 9.2 Susunan Modul Strut Framework Penjelasan singkat untuk masing – masing modul adalah sebagai berikut : Spring Core; menyediakan sarana fungsionalitas yang fundamental dalam Spring Framework. Dalam modul ini terdapat beanfactory yang merupakan inti dari aplikasi yang menggunakan Spring. Spring Context; BeanFactory modul dengan ini merupakan menambahkan ekstensi dukungan dari untuk internalization, event-event dari siklus hidup aplikasi serta validasi. Modul ini juga menydeiakan service enterprise seperti email, akses JNDI, integrasi dengan EJB, remoting dan penjadwalan, serta integrasi dengan velocity dan freemarker. 78 Spring AOP; modul ini menyediakan layanan penuh pada Aspect Oriented Programming (AOP) Spring DAO; modul ini menyediakan abstraksi ke JDBC dan DAO, sehingga pemrograman dengan kedua komponen tersebut menjadi lebih sederhana dan mudah. Spring ORM; modul ini menyediakan integrasi dengan beberapa Object Relational Mapping (ORM) yang popular saat ini seperti Hibeernate, JDO,Ibatis,SQL Maps, Oracle TopLink Spring Web; modul integrasi menyediakan context yang ditujukan untuk aplikasi berbasis web, dan juga integrasi dengan framework seperti Jakarta Struts, Tapestry,dan WebWork SpringMVC Framework Gambar 4.2 diatas pada dasarnya merupakan pembagian secara koseptual. Pada kenyataannya sebuah modul dapat tersusun dari satu atau beberapa package. Package – package yang terdapat dalam org.springframework terdiri dari aop, beans, chace, context, corte, dao, jb,jca,jdbc,jms,jmx,jndi,mail,metadata,orm,remoting,scheduling dan web. 9.4. Contoh Program Kita akan menerapkan arsitektur MVC secara sederhana dalam aplikasi web berikut ini. Skenarionya adalah kita buat halaman yang memuat link menuju halaman tutorial pemrograman. Jika link tersebut diklik, maka oleh controller akan diarahkan ke halaman tutorial yang dimaksud. Secara garis besar, alur aplikasi ini bisa digambarkan sebagai berikut : 79 Client (Browser) Index.jsp Model (DataLinks ) Controller (GoTutorial) View (Web.jsp) (mobile.jsp) (desktop.jsp ) Gambar 9.3 Alur Aplikasi MVC Langkah – langkah pembuatannya adalah sebagai berikut : 1. Buat project dengan nama DemoMVC. Lakukan penyetingan atas server dan java EE yang digunakan 2. Pertama akan dibuatkan komponen model terlebih dahulu. Buat sebuah class java dan beri nama DataLinks serta tempatkan pada package model. Ketikkan kode berikut ini : package model; /** * * @author Maksy */ public class DataLinks { public String links[] = { "Web Application Programming", "Mobile Application Programming", "Desktop Application Programming"}; public String targets[] = {"web","mobile","desktop"}; public int getLinksNumber(){ return links.length; } 80 public String getLink(int num){ return links[num]; } public String getTarget(int num){ return targets[num]; } } Class DataLinks ini memuat 3 buah link target. Array targets nantinya akan digunakan oleh controller untuk mengarahkan user ke halaman yang sesuai. 3. Langkah kedua, kita buat komponen viewnya. Selain index.jsp, kita tambahkan 3 buah halaman jsp lagi sebagai tujuan target dari link pada DataLinks tadi. Ketiga file jsp ini kita beri nama sesuai dengan isi dalam array targets. 4. Klik kanan pada web pages di tab project. Pilih New > JSP dan beri nama file web. Klik finish. Buat kode JSP pada halaman ini sehingga akan ditampilkan “Tutorial Web Programming” saat program dijalankan 5. Buat lagi 2 jsp file berturut – turut diberi nama mobile.jsp dan desktop.jsp. Halaman ini saat dijalankan akan menghasilkan tulisan sebagai berikut : “Tutorial Mobile Programming” dan “Tutorial Desktop programming”. 6. Buka halaman index.jsp dan ketikkan kode berikut ini <html> <head> <meta http-equiv="Content-Type" charset=UTF-8"> <title>JSP Page</title> </head> <body> <h2>Programming Tutorial</h2> <ul> <% DataLinks links = new DataLinks(); for(int i=0; i<links.getLinksNumber(); i++){ content="text/html; 81 String link = links.getLink(i); String target = "tutorial?type=" + links.getTarget(i); %> <li> <a href="<%=target%>"><%=link%></a> </li> <% } %> </ul> </body> </html> Index.jsp mengambil links dari class DataLinks dan menampilkannya serta mengeset sesuai targetnya. Keunggulan dari penggunaan MVC sudah terlihat disini. Jika kita ingin menambahkan links, kita hanya menambahkan links dari class DataLinks( model ) tanpa harus repot mengubah index.jsp (view) 7. Jangan lupa kita impor class DataLinks menggunakan page directive import. Lakukan sebelum tag <html> 8. Yang terakhir, kita buat servlet sebagai controllernya yang mengendalikan request user sesuai tergetnya dan beri nama GoTutorial. Isikan package controller. Ketik kode berikut pada servlet GoTutorial. protected void processRequest(HttpServletRequest HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); String type = request.getParameter("type"); String file = type +".jsp"; RequestDispatcher dis = null; if(type != null){ dis = request.getRequestDispatcher(file); } dis.forward(request, response); } request, 82 Servlet GoTutorial akan melihat target dalam parameter “type” kemudian akan diteruskan ke halaman jsp sesuai isi parameter type tersebut. 9. Build dan run program dan kemudian klik salah satu link. Gambar 9.4. Halaman index MVC 10.Lihat url hasilnya kemudian coba isi parameter type “web”. Program akan mengarahkan langsung ke halaman web.jsp RANGKUMAN MVC merupakan konsep arsitektur aplikasi yang memisahkan model data, user interface dan business logic sebagai komponen yang berbeda sehingga modifikasi komponen menjadi lebih mudah. Arsitektur MVC membagi aplikasi menjadi 3 bagian besar, yaitu model, view, controller dan kemudian membuat interaksi antar ketiganya Model merepresentasikan data yang digunakan oleh aplikasi dan umumnya berupa java class View merupakan implementasi user interface yang menampilkan data yang telah diolah pada user, atau komponen yang akan berinteraksi dengan user dan umumnya berupa jsp Controller merupakan pengontrol aliran request dan umumnya berupa servlet LATIHAN SOAL 1. Jelaskan manfaat penggunaan konsep MVC dalam pengembangan aplikasi berskala enterprise ! 2. Bagaimana konsep modeling diterjemahkan dalam kerangka MVC ! 3. Bagaimana konsep view digunakan dalam MVC ! 4. Buatlah aplikasi penjualan barang secara online menggunakan konsep MVC. Kembangkan java class yang akan digunakan, halaman jsp dan servlet untuk aplikasi ini ! 83 BAB X DATABASE , SQL DAN JDBC Untuk membuat aplikasi web berskala enterprise, belum lengkap rasanya jika tanpa koneksi ke database. 10.1. Database Database atau basis data adalah kumpulan data yang disimpan secara sistematik sehingga dapat diakses untuk memperoleh informasi dari database tersebut.Database ini misalnya seperti buku telepon di mana kita mencatat nama dan nomor telepon seseorang. Database yang dimaksud disini, tentunya adalah data yang disimpan dalam computer, yang dikelola menggunakan perangkat lunak khusus yang disebut dengan Database Management System (DBMS). Sebuah database memiliki penjelasan terstruktur dari data yang tersimpan di dalamnya yang disebut dengan skema. Skema menggambarkan objek yang diwakili suatu database, dan hubungan diantara objek tersebut. Cara mengorganisasikan skema umumnya menggunakan model relational yanr tabeg direpresentasikan dalam bentuk table, yang terdiri atas baris dan kolom. Dalam model ini, hubungan antara table diwakili dengan nilai yang sama antar table. 10.2. SQL SQL adalah standar ANSI untuk mengakses dan memanipulasi database. Statemen SQL digunakan untuk menerima, mengubah dan menghapus data. Perintah SQL tidak bersifat case sensitive pada kata kuncinya, tetapi pada nilainya. Pada aplikasi yang membutuhkan akses ke database, umumnya akan melakukan aksi – aksi seperti memasukkan data, mengambil data mengupdate dan menghapus data. 84 10.2.1. Memasukkan Data Untuk memasukkan baris data yang baru ke dalam table database yang aktif, kita menggunakan perintah INSERT. Struktur dasar dari perintah INSERT : INSERT INTO nama_tabel VALUES (nilai1,nilai2,…) Clause INTO diikuti nama dari table yang akan diisi data baru. Parameter yang diberikan di dalam kata kunci VALUES adalah daftar nilai data yang akan dimasukkan ke dalam table. Perintah INSERT harus diikuti aturan integritas pada table data. Oleh karena itu jika sebuah field pada table ditetapkan not-null, maka jika kita mencoba memasukkan nilai null, akan menyebabkan error. 10.2.2 Mengambil Data Untuk mengambil data dari database yang aktif, kita menggunakan perintah SELECT. Struktur dasar perintah SELECT : SELECT kolom1,kolom2,…FROM nama_tabel WHERE kondisi Perintah SELECT diikuti oleh kolom – kolom table yang akan diambil datanya. Jika kita ingin mengambil semua data dari seluruh kolom pada table, gunakan * sebagai pengganti nama kolom. Clausa FROM diikuti nama tabelnya. Claus WHERE dapat disertakan dan diikuti dengan kondisi data yang ingin diambil. 10.2.3 Meng-update Data Untuk mengupdate baris data dari table database yang aktif, kita menggunakan perintah UPDATE. Struktur dasar perintah UPDATE : UPDATE nama_tabel SET nilai-kolom WHERE kondisi Perintah UPDATE diikuti oleh nama table yang ingin di-update datanya. Clause SET diikuti daftar data dari nama kolom dan nilai 85 barunya. Clausa WHERE harus disertakan jika kita hanya mengupdate baris data tertentu. Jika tidak, semua baris data akan ikut terupdate. 10.2.4 Menghapus Data Untuk menghapus baris data dati table database yang aktif, kita menggunakan perintah DELETE. Struktur dasar perintah DELETE : DELETE FROM nama_table WHERE kondisi Clause FROM diikuti oleh nama table yang ingin di-update datanya. Clause WHERE harus disertakan jika kita hanya menghapus baris data tertentu. Jika tidak, semua baris data akan ikut terhapus. 10.3. JDBC Java menyediakan API untuk mengakses database yang disebut Java Database Connectivity (JDBC) API. Dengan JDBC, kita bisa mengakses database tanpa mempedulikan DBMS-nya. JDBC API memungkinkan untuk melakukan tiga hal, yaitu membuat koneksi dengan database, mengirim perintah SQL, dan memproses hasil. Setiap mengakses database,kita menggunakan JDBC driver sebagai interface atau koneksi ke database tersebut. Setiap vendor DBMS memerlukan driver yang berbeda. Untuk beberapa vendor telah tersedia drivernya didalam JDBC API, sedangkan yang tidak ada bisa didownload pada website vendor masing – masing. 10.4. Membuat Database Untuk membuat database kita bisa menggunakan netbeans seperti yang akan dicontohkan berikut ini. Database yang akan dibuat terdiri atas dua table dengan struktur sebagai berikut : Tabel Subject 86 Field Type Kode Varchar(4) Nama Varchar(10) SKS int Tabel Mahasiswa Field Type Nis Varchar(10) Nama Varchar(40) Alamat Varchar(40) Tabel Jadwal Field Type Nis Varchar(10) Kode Varchar(4) Langkah – langkah pembuatannya adalah sebagai berikut : 1. Buka aplikasi Netbeans. Klik tab Services 2. Buat database baru. Klik databases dalam tab services. Klik kanan Mysql Server > Create database. Jika Mysql belum berjalan, jalankan terlebih dahulu,pilih Start Gambar 10.1. Membuat database baru 87 3. Isikan nama database Akademik hingga diperoleh tampilan sbb : Gambar 10.2. Database Akademik telah dibuat 4. Buat table – tablenya . Klik kanan pada akademik > Execute Command. Hasilnya akan nampak seperti gambar berikut ini : Gambar 10.3. Database Akademik dengan tabel RANGKUMAN Database adalah kumpulan table – table yang menyimpan data dan telah memenuhi aturan tertentu (ternormalisasi) Untuk membuat, mengakses dan memanipulasi data – data yang tersimpan dalam satu database digunakan bahasa yaitu SQL. Structured Query Language (SQL) terbagi atas Data Definition Language (DDL) dan Data Manipulation Language (DML). DDL terdiri atas perintah CREATE, DROP dan ALTER. DML terdiri atas perintah INSERT, SELECT, UPDATE, dan DELETE. 88 CREATE digunakan untuk membuat table. DROP digunakan menghapus table dari satu database. ALTER digunakan untuk memodifikasi table. INSERT digunakan menambahkan record dalam satu table. SELECT digunakan untuk mengquery record tertentu dari satu database berdasarkan kondisi tertentu UPDATE digunakan untuk mengupdate record tertentu berdasarkan criteria tertentu. DELETE digunakan untuk menghapus baris tetentu dari satu table. Java menyediakan API untuk mengakses database yang disebut Java Database Connectivity (JDBC) API. Dengan JDBC, kita bisa mengakses database tanpa mempedulikan DBMS-nya. LATIHAN SOAL 1. 2. 3. 4. Apa yang dimaksud dengan database, jelaskan ! Jelaskan perintah – perintah yang tergabung dalam kelompok SQL DDL ! Apa yang dimaksud dengan JDBC dan kapan JDBC digunakan ? Dengan menggunakan netbeans dan Mysql buatlah database yang memiliki table – table seperti dibawah ini : Tabel Barang Nama Field Tipe Data Kode_Barang Varchar(4) Nama Varchar(30) Harga int Tabel Customer Nama Field Tipe Data Kode_Cus Varchar(4) Nama_Cus Varchar(30) Alamat Varchar(20) Phone Varchar(20 Tabel Transaksi Nama Field Tipe Data Kode_Cus Varchar(4) Kode_Barang Varchar(4) 89 BAB XI ENTERPRISE BEANS Enterprise beans adalah komponen java enterprise edition yang mengimplementasikan teknologi enterprise javabeans (EJB). Enterprise beans berjalan dalam EJB container yang ada dalam application server. Meskipun transparent terrhadap pengembangan aplikasi, container EJB memberikan layanan terhadap sistem seperti transaksi dan keamanan bagi enterprise beannya. Layanan ini memungkinkan kita untuk membangun dan mendeploy enterprise beans secara cepat yang merupakan bentuk inti dari aplikasi java EE. 11.1. Apa itu Enterprise Bean Ditulis dengan bahasa pemrograman java, enterprise bean adalah komponen pada sisi server yang membungkus business logic dari suatu aplikasi. Business logic adalah kode yang memenuhi maksud dari aplikasi. Sebagai contoh dalam suatu aplikasi inventory, enterprise bean mengimplementasikan business logic dalam method yang disebut checkInventoryLevel dan orderProduct. Dengan menginvoke method – method ini, client dapat mengakses layanan inventory yang disediakan oleh aplikasi. Enterprise beans menyederhanakan pengembangan aplikasi – aplikasi yang besar dan terdistribusi. Pertama karena container EJB menyediakan layanan – layanan system-level ke enterprise bean seperti management transaksi dan securitas , pengembang bean dapat berkonsentrasi dalam memecahkan masalah – masalah business. Kedua karena bean berisikan business logic dari aplikasi, pengembang pada sisi client dapat focus pada client. Pengembang client tidak harus mengkoding rutin untuk mengimplementasikan business rule atau 90 mengakses database. Hal ini menyebabkan, client menjadi lebih kecil dan dapat diterapkan pada peralatan – peralatan yang kecil. Enterprise beans digunakan pada aplikasi yang memiliki criteria sebagai berikut : 1. Aplikasi harus scalable. Untuk mengakomodir pertumbuhan jumlah pengguna, kita perlu mendistribusikan komponen – komponen aplikasi pada berbagai mesin. 2. Aplikasi yang memiliki transaksi yang harus menjamin integritas data. Enterprise bean mendukung transaksi 3. Aplikasi yang memiliki berbagai macam client. Dengan hanya beberapa baris kode, remote client dengan mudah dapat menghubungi enterprise bean. 11.2. Jenis – Jenis Enterprise Bean 11.2.1. Session Bean Session bean menunjuk pada client tunggal yang ada dalam application server. Untuk mengakses aplikasi yang dideploy dalam server, client menginvoke method – method dari session bean. Session bean bekerja untuk clientnya, melindungi client dari kompleksitas dengan mengeksekusi persoalan – persoalan business dalam server. Seperti namanya, session bean sama dengan interaktif session. Session bean tidak dapat di shared, session bean hanya memiliki satu client. Ketika client berhenti, session bean juga berhenti dan terputus koneksi dengan client. Ada dua jenis session bean yaitu stateful session bean dan stateless session bean. Pada stateful session bean , instance variable menunjukkan keadaan dari suatu client session bean 91 tertentu. Karena client berinteraksi dengan beannya, keadaan ini sering dinamakan conversational state. State dipertahankan selama client-bean session. Jika client menghapus bean atau menghentikannya, session berakhir dan state hilang. Sifat transient dari state tidak menjadi masalah karena percakapan antara client dan bean berakhir disana. Stateless session bean tidak mempertahankan suatu keadaan conversational dengan client. Ketika client menginvoke method – method suatu stateless bean, instance variable bean dapat berisi keadaan tertentu untuk client tersebut, tetapi hanya selama invokasi. Ketika method selesai, keadaan specific client tidak dipertahankan. Client dapat mengubah state instance variable dalam pool stateless bean, dan state ini dipertahankan sampai pada invokasi selanjutnya dari pool stateless bean. Session bean harus digunakan pada keadaan sebagai berikut : Pada waktu tertentu, hanya satu client mengakses instance bean State bean tidak persistent (tetap), hanya ada pada periode yang pendek Bean mengimplementasikan web service Statefull session bean cocok untuk criteria sebagai berikut : Bean state menunjukkan interaksi antra bean dan client tertentu Bean perlu menyimpan informasi tentang client Dibelakang layar, bean mengelola aliran kerja dari beberapa enterprise bean. Untuk memperbaiki performance, kita dapat menggunakan stateless session bean terutama jika bean state tidak memiliki data untuk client tertentu dan dalam suatu invokasi method tunggal, bean melakukan tugas – 92 tugas generic untuk semua client. Sebagai contoh kita dapat menggunakan stateless session bean untuk mmengirimkan email yang mengkonfirmasi suatu pesanan online. 11.2.2. Massage-Driven Bean Message-driven bean adalah enterprise bean yang menyebabkan aplikasi – aplikasi java Entertprise Editon memproses message secara asinkronous. Umumnya bertindak sebagai JMS message listener, yang sama dengan suatu ecent listener kecuali message driven bean menerima pesan – pesan JMS bukan event. Message dapat dikirim oleh setiap komponen java enterprise edition atau aplikasi JMS atau sistem yang tidak menggunakan teknologi java EE. Message driven bean dapat memproses pesan – pesan JMS atau pesan – pesan lainnya. Perbedaan utama antara message-driven bean dan session bean adalah bahwa client tidak mengakses message – driven bean melalui interfaces. Tidak seperti session bean, message-driven bean hanya mempunyai satu class bean. Message-driven bean memiliki ciri sebagai berikut : o Message-driven bean dieksekusi setelah menerima message dari client o Diinvoke secara asinkronous dan waktu hidup singkat o Tidak menunjukkan share data secara langsung dalam database, tetapi dapat mengakses dan mengupdate data o Bersifat stateless 11.3. Access Client dengan Interface Seorang client dapat mengakses session bean hanya melalui method yang didefinisikan dalam business interface dari bean. Business interface mendefinisikan pandangan client terhadap suatu bean. Semua aspek lain dari bean tersembunyi dari client. Session bean dapat memiliki lebih dari 93 satu business interface. Client dapat mengakses enterprise bean secara remote, local ataupun melalui web service. 11.3.1. Remote Client Remote client dari suatu enterprise bean dapat berjalan pada mesin yang berbeda dan Java Virtual Machine yang berbeda dengan enterprise beannya. Remote client dapat berupa web component, aplikasi client ataupun enterprise bean. Untuk membuat enterprise bean yang mengijinkan remote access, yang harus dilakukan adalah : o Menambahkan business interface dari enterprise bean dengan anotasi @Remote sebagai berikut : @Remote public interface InterfaceName {….} o Menambahkan bean class dengan @Remote, mendefinisikan business interface atau interface : @Remote(InterfaceName.class) public class BeanName implements InterfaceName {…} Remote interface mendefinisikan business dan siklus hidup method yang specific dari bean. Sebagai contoh, remote interface dari bean bernama BankAccountBean dapat memiliki business method deposit dan credit, seperti dapat dilihat pada contoh berikut : Gambar 11.1. Interface Enterperise Bean dengan Remote Access 11.3.2. Local Client Local client memiliki karekteristik sebagai berikut : 94 1. Berjalan pada JVM yang sama dengan enterprise beannya 2. Dapat berupa web component atau enterprise bean lainnya 3. Lokasi enterprise bean yang diakses tidak transparent. Untuk membuat enterprise bean yang hanya dapat diakses secara local, maka dapat dilakukan sebagai berikut : 1. Tambahkan business interface dari enterprise bean dengan @local interface, contoh @local public interface InterfaceName {…} 2. Tentukan interface dengan menambahkan bean class dengan @Local dan tentukan nama interface. 11.4. Isi Enterprise Bean Untuk membangun enterprise bean kita harus menyiapkan file – file sebagai berikut : 1. Enterprise bean class; mengimplementasikan method- method yang didefinisikan dalam business interface dan semua callback method 2. Business Interface; mendefinisikan method – method yang diimplementasikan oleh enterprise class bean 3. Class Helper; class – class lainnya yang dibutuhkan oleh enterprise class bean seperti class exception dan class utility Semua file ini dipaketkan dalam file EJB JAR, modul yang menyimpan enterprise bean. File EJB JAR bersifat portable dan dapat digunakan untuk aplikasi – aplikasi yang berbeda. Untuk memasang aplikasi java enterprise, kita mempaketkan satu atau beberapa modul (seperti file – file EJB JAR) ke dalam EAR file, yaitu file yang menyimpan aplikasi. Ketika EAR file yang berisi EJB JAR file dideploy, kita juga mendeploy enterprise bean ke application server. Kita juga dapat mendeploy EJB JAR yang tidak terdapat dalam EAR file. Gambar 11.2 berikut ini menunjukkan isi dari EJB JAR file 95 Gambar 11.2 Struktur Enterprise Bean JAR RANGKUMAN Enterprise bean adalah komponen pada sisi server yang membungkus business logic dari suatu aplikasi Enterprise beans menyederhanakan pengembangan aplikasi – aplikasi yang besar dan terdistribusi Enterprise beans digunakan pada aplikasi yang memiliki criteria scalable, memiliki transaksi yang harus mempertahankan integritas data dan memiliki banyak client. Enterprise bean terdiri atas session bean dan message-driven bean Session bean bekerja untuk clientnya, melindungi client dari kompleksitas dengan mengeksekusi persoalan – persoalan business dalam server Ada dua jenis session bean yaitu stateful session bean dan stateless session bean Pada stateful session bean , instance variable menunjukkan keadaan dari suatu client session bean tertentu Stateless session bean tidak mempertahankan suatu keadaan conversational dengan client Message-driven bean adalah enterprise bean yang menyebabkan aplikasi – aplikasi java Entertprise Editon memproses message secara asinkronous Perbedaan utama antara message-driven bean dan session bean adalah bahwa client tidak mengakses message – driven bean melalui interfaces Client dapat mengakses enterprise bean secara remote, local ataupun melalui web service LATIHAN SOAL 1. Jelaskan peran enterprise bean dalam pengembangan aplikasi berskala enterprise 2. Jelaskan criteria aplikasi yang membutuhkan enterprise bean ! 3. Ada dua jenis enterprise bean, sebutkan dan jelaskan perbedaannya ? 4. Apa perbedaan antara stateful session bean dan stateless session bean ? 5. Jelaskan file – file yang dibutuhkan untuk membangun enterprise bean ! 96 BAB XII SESSION BEAN 12.1. Pengertian Session Bean Session bean adalah enterprise bean yang berinteraksi secara langsung dengan user dan berisi business logic dari suatu aplikasi enterprise. Session bean merepresentasikan access dari satu client pada aplikasi enterprise yang dideploy pada server dengan memanggil methodnya. Satu aplikasi dapat berisi banyak session tergantung pada jumlah user yang mengakses aplikasi tersebut. Session bean membuat interaktiv session hanya untuk client tunggal dan melindungi client tersebut dari kompleksitas dengan mengeksekusi persoalan bisnis pada sisi server. Sebagai contoh ketika seorang client ingin melakukan aksi seperti membuat reservasi atau memvalidasi kartu kredit, satu session bean harus digunakan. Session bean memutuskan data apa yang akan dimodifikasi. Pada dasarnya, session bean menggunkan satu entity bean untuk mengakses atau memodifikasi data. Session dan entity bean mengimplementasikan business logic, business rules, algorithma dan alur kerja. Session bean adalah komponen yang bersifat short-lived. Container EJB akan menghapus session bean jika client telah keluar. Nilai Session bean tak dapat dishare dan tidak tetap ( nilainya tak dapat disimpan dalam database). Satu session bean hanya memiliki satu client. Ketika client berakhir, session bean yang berasosiasi dengannya juga berakhir dan data yang berasosiasi dengan session bean ini dimusnahkan. Gambar dibawah ini menunjukkan bagaimana session bean berinteraksi dengan client dan entity bean 97 Gambar 12.1 Interaksi Session Bean dengan Client dan Entity Bean Session bean terbagi atas : Stateless Session Bean; stateless session bean tidak mempertahankan apa yang disebut conversational state dengan client. Ketika clien memanggil method – method dari stateless bean, instance dari variable bean dapat mempertahankan keadaan spesifik untuk client tersebut hanya selama pemanggilan method. Ketika method selesai, keadaan spesifik client tidak dipertahankan yaitu EJB container memusnahkan stateless session bean. Jenis session bean ini tidak menggunakan instance variable sehingga session bean menyimpan data selama pemanggilan method. Karena stateless session bean dapat mendukung multiple client, stateless session bean menyediakan skalabilitas yang lebih baik terhadap aplikasi yang membutuhkan banyak client. Stateful Session Bean Jenis bean ini menggunakan instance variable yang mengijinkan data persistent selama pemanggilan method karena instance variable memungkinkannya. Client mengeset data ke variable – variable ini yang dikehendaki untuk persist. Statefull session bean mempertahankan statenya terhadap pemanggilan method – method yang dibuat loeh client yang sama. Jika state statefull session bean diubah selama pemanggilan satu method, 98 maka keadaan tersebut akan tersedia pada client yang sama pada invokasi yang selanjutnya. Keadaan client bean dipertahankan selama sesi dari client bean. Ketika client menghilangkan atau mengakhiri bean, session berakhir dan state menghilang. Karena client berinteraksi dengen beannya, state ini sering dinamakan conversational state. Sebagai contoh misalnya seorang customer yang menggunakan debit card pada mesin ATM. ATM dapat melakukan bermacam operasi seperti memeriksa saldo, mentransfer uang, ataupun mengadakan penarikan. Operasi ini dapat dilakukan satu demi satu terhadap client yang sama. Jadi bean haru mempertahankan keadaannya untuk setiap operasi – operasi diatas pada client yang sama. User interface memanggil method – method session bean user ingin menggunakan fungsi dari session bean. Session bean dapat memanggil session bean dan entity bean lainnya. 12.2. Kapan Menggunakan Session Bean Umumnya session bean digunakan dalam keadaan sebagai berikut : o Ketika hanya ada satu client sedanga mengakses instance bean pada waktu tertentu o Ketika bean tidak persistent yang berarti bahwa bean tidak akan bertahan lama o Bean dimplementasikan pada web services. Statefull session bean digunakan dalam keadaan berikut : o Bean ingin menyimpan informasi tentang client selama invokasi method o Ketika bean bekerja sebagai mediator antara client dan komponen – komponen lain dari aplikasi o Ketika bean harus mengatur aliran kerja dari beberapa enterprise bean lainnya 99 Stateless session bean sesuai untuk keadaan berikut : o Jika bean tidak mengandung data untuk client tertentu o Jika hanya ada satu invokasi method diantara semua client untuk melakukan generic task 12.3. Siklus Session Bean 12.3.1 Siklus Stateless Session Bean Karena stateless session bean tidak pasivate terhadap pemanggilan – pemanggilan method maka stateless session bean hanya mencakup dua tingkat yaitu tidak ada atau siap untuk invokasi method. Stateless session bean mengawali siklus hidupnya ketika client memperoleh reference terhadap session bean. Untuk itu, container melakukan injeksi ketrgantungan sebelum memanggil anotasi @PreContruct method jika ada. Setelah memanggil anotasi method ini bean akan siap untuk menginvokasi methodnya melalui client. Gambar 12.2 Siklus hidup stateless session bean Container memanggil anotasi method @PreDestroy saat mengakhiri siklus session bean. Setelah itu session bean akan disimpan di garbage collection. 12.3.2 Siklus Statefull Session Bean Stetefull session bean mengawali siklusnya ketika client mendapatkan reference statefull session bean. Sebelum menginvoke anotasi method @PostConstruct container melakukan injection dependency setelah bean ini siap. Container dapat menonaktifkan sebuah 100 bean dalam keadaan ready (umumnya container menggunakan algorithma terakhir yang digunakan untuk mempasifkan sebuah bean). Dalama mekanisme yang dapat dipasifkan bean pindah dari memory ke memory kedua. Container menginvoke anotasi method @PrePassivate sebelum mempasifkan bean. Jika client menginvoke business method pada bean yang telah dipasifkan maka container menginvoke method anotasi @PostActivate untuk membawa bean dalam keadaan ready. Perhatikan gambar berikut ini : Gambar 12.3 Siklus hidup statefull session bean Saat mengakhiri siklus bean, client memanggil anotasi method @Remove setelah itu container memanggil anotasi method @PreDestroy yang mengakibatkan bean akan dibawa ke garbage collection. 12.4. Contoh Statefull Session Bean Untuk contoh statefull session bean kita akan membuat, mendeploy dan menjalankan aplikasi java JEE sederhana yang dinamakan account. Tujuan dari account adalah melakukan dua operasi transaksi (simpan dan tarik) bagi customer. Aplikasi account ini terdiri atas sebuah enterprise 101 bean, yang melakukan transaksi – transaksi dan dua jenis client yaitu appilication client dan web client. Langkah – langkah untuk membuat aplikasi ini adalah : 1. Buat enterprise bean : AccountBean 2. Buat aplikasi client : AccountCustomer 3. Deploy account ke server 4. Jalankan aplikasi client 12.4.1. Membuat Enterprise Bean Enterprise bean dalam contoh ini adalah sebuah statefull session bean yang dinamakan AccountBean. Account session menunjukkan informasi account bagi account customer yang sementara online. Bean customer dapat menyimpan dan menarik sejumlah uang dari accountnya. Untuk mengelola account dibutuhkan Remote business interface (Account) dan Session bean class (AccountBean). Account business interface adalah interface Java yang mendefinisikan semua business method yang diimplementasikan dalam class bean. Jika class bean mengimplementasikan interface tunggal, interface itu dianggap business interface. Business interface adalah local interface kecuali jika dianotasikan dengan anotasi javax.ejb.Remote. Class bean dapat juga mengimplementasikan lebih dari satu interface.Jika bean class mengimplementasikan lebih dari satu interface, business interface harus dijelaskan dengan class bean menggunakan @Local atau @Remote. Source code untuk business interface Account adalah sebagai berikut : package ejbExample.stateful; import javax.ejb.Remote; @Remote 102 public interface Account { public float deposit(float amount); public float withdraw(float amount); @Remove public void remove(); } Session bean class pada contoh ini dinamakan AccountBean. Class ini mengimplementasikan dua business method (deposit dan withdraw). Source code dari bean class ini adalah sebagai berikut : package ejbExample.stateful; import javax.ejb.Stateful; import javax.ejb.Remote; import javax.ejb.Remove; import javax.ejb.*; @Stateful(name="AccountBean") @Remote(AccountRemote.class) public class AccountBean implements AccountRemot e { float balance = 0; public float deposit(float amount){ balance += amount; return balance; } public float withdraw(float amount){ balance -= amount; return balance; 103 } @Remove public void remove() { balance = 0; } } 12.4.2. Membuat Account Web Client Source code untuk aplikasi client dinamakan WebClient.jsp yang mengilustrasikan tugas dasar yang dilakukan oleh client dari enterprise bean. Kodenya adalah sebagai berikut : <%@page language="java" %> <%@ page contentType="text/html; charset=UTF8" %> <%@ page import="com.javajazzup.examples.ejb3.st ateful.*, javax.naming.*"%> <%! public AccountRemote account = null; float bal=0; public void jspInit() { try { InitialContext ic = new InitialContext(); account = (AccountRemote) ic .lookup("example/AccountBean/remote"); System.out.println("Loaded Account Bean"); } catch (Exception ex) { System.out.println("Error:"+ ex.getMessage()); } } public void jspDestroy() { account = null; } %> 104 <% try { String s1 = request.getParameter("amt"); String s2 = request.getParameter("group1"); if ( s1 != null) { Float amt = new Float(s1); if(s2.equals("dep")) bal=account.deposit(amt.floatValue()); else if(s2.equals("with")) bal=account.withdraw(amt.floatValue()); else %> <p>Please select your choice</p> <% } else %> <br>Please enter the amount<br> <p> The Transaction is complete<br> <b>Your Current Balance is:</b> <%= bal%> <p> <% }// end of try catch (Exception e) { e.printStackTrace (); } %> Source kode untuk form.jsp dan index.jsp masing – masing adalah sebagai berikut : <html> <head> <title>Bank Account</title> </head> 105 <body> <h1><p align="center"><font size="6" color="#800000">Bank Transaction Request Form</h1> <hr><br> <table bgcolor="#FFFFCC" align="center"> <form action="WebClient.jsp" method="POST"> <tr><td></tr></td> <tr><td>Enter the amount in rupees: <input type="text" name="amt" size="10"></tr></td> <br> <tr><td><b>Select your choice:</b></tr></td> <tr><td><input type="radio" name="group1" value ="dep">Deposit</tr></td> <tr><td><input type="radio" name="group1" value ="with">Withdraw<br></tr></td> <tr><td> <input type="submit" value="Transmit"> <input type="reset" value="Reset"></tr></td> <tr><td></tr></td> </form> </table> </body> </html> <%@page language="java" %> <html> <head> <title>Ejb3 Stateful Tutorial</title> </head> <body bgcolor="#FFFFCC"> <p align="center"><font size="6" color="#800000"><b>Welcome to <br> Ejb3-Jboss 4.2.0 Tutorial</b></font> Click <a href="ejb3/form.jsp">Bank Transaction Example</a> to execute Bank Bean<br></p> </body> </html> 106 12.5. Contoh Stateless Session Bean Untuk stateless session bean kita akan membuat sebuah aplikasi yang dinamakan Example dimana aplikasi ini akan melakukan operasi – operasi matematika seperti penjumlahan, pengurangan, perkalian dan pembagian. Aplikasi ini terdiri atas enterprise bean, yang melakukan kalkulasi diatas, dua jenis client masing – masing sebuah application client dan web client. Adapun langkah – langkah untuk membangun aplikasi ini adalah sebagai berikut : 1. Membuat enterprise bean : CalculatorBean 2. Membuat web client : WebClient 3. Deploy ke server 4. Gunakan web browser untuk menjalankan web client 12.5.1. Membuat Enterprise Bean Enterprise bean dalam contoh ini berupa stateless session bean yang dinamakan CalculatorBean yang pembuatannya meliputi Remote Business interface dan Enterprise bean. Business interface mendefinisikan business method yang dapat dipanggil client secara remote. Method - method ini diimplementasikan dalam enterprise bean class. Source codenya adalah sebagai berikut : package net.roseindia.ejb3.stateless; import java.math.*; import javax.ejb.Remote; import java.lang.annotation.*; @Remote public interface CalculatorRemote { public float add(float x, float y); public float subtract(float x, float y); 107 public float multiply(float x, float y); public float division(float x, float y); } Enterprise bean class untuk contoh in adalah CalculatorBean. Class ini mengimplementasikan empat business method yang ada pada CalculatorRemote. Source code dari CalculatorBean adalah sebagai berikut : package net.roseindia.ejb3.stateless; import java.math.*; import javax.ejb.Stateless; import javax.ejb.Remote; @Stateless(name="CalculatorBean") @Remote(CalculatorRemote.class) public class CalculatorBean implements Calculato rRemote{ public float add(float x, float y){ return x + y; } public float subtract(float x, float y){ return x - y; } public float multiply(float x, float y){ return x * y; } public float division(float x, float y){ return x / y; } } 108 12.4.2. Membuat Calculator Web Client Web client berupa halaman jsp (WebClient.jsp) yang source code adalah sebagai berikut : <%@ page contentType="text/html; charset=UTF8" %> <%@ page import="com.javajazzup.examples.ejb3.st ateless.*, javax.naming.*"%> <%! private CalculatorRemote calculator = null; float result=0; public void jspInit() { try { InitialContext ic = new InitialContext(); calculator = (CalculatorRemote) ic .lookup("example/CalculatorBean/remote"); System.out.println("Loaded Calculator Bean"); //CalculatorBean } catch (Exception ex) { System.out.println("Error:"+ ex.getMessage()); } } public void jspDestroy() { calculator = null; } %> <% try { String s1 = request.getParameter("num1"); String s2 = request.getParameter("num2"); String s3 = request.getParameter("group1"); System.out.println(s3); if ( s1 != null && s2 != null ) { Float num1 = new Float(s1); 109 Float num2 = new Float(s2); if(s3.equals("add")) result=calculator.add(num1.floatValue(), num2.floatValue()); else if(s3.equals("sub")) result=calculator.subtract(num1.floatValue(), num2.floatValue()); else if(s3.equals("multi")) result=calculator.multiply(num1.floatValue(), num2.floatValue()); else result=calculator.division(num1.floatValue(), num2.floatValue()); %> <p> <b>The result is:</b> <%= result %> <p> <% } }// end of try catch (Exception e) { e.printStackTrace (); //result = "Not valid"; } %> Untuk form.jsp dan index.jsp dari aplikasi ini adalah sebagai berikut : <html> <head> <title>Calculator</title> </head> <body bgcolor="pink"> <h1>Calculator</h1> <hr> <form action="WebClient.jsp" method="POST"> 110 <p>Enter first value: <input type="text" name="num1" size="25"></p> <br> <p>Enter second value: <input type="text" name="num2" size="25"></p> <br> <b>Seclect your choice:</b><br> <input type="radio" name="group1" value ="add">Addition<br> <input type="radio" name="group1" value ="sub">Subtraction<br> <input type="radio" name="group1" value ="multi">Multiplication<br> <input type="radio" name="group1" value ="div">Division<br> <p> <input type="submit" value="Submit"> <input type="reset" value="Reset"></p> </form> </body> </html> Sedangkan index.jsp adalah sebagai berikut : <%@page language="java" %> <html> <head> <title>Ejb3 Stateless Tutorial</title> </head> <body bgcolor="#FFFFCC"> <p align="center"><font size="6" color="#800000"><b>Welcome to <br> Ejb3-Jboss 4.2.0 Tutorial</b></font> 111 Click <a href="ejb3/form.jsp">Calculator Example</a> to execute Calculator<br></p> </body> </html> Apabila dijalankan dan semua bekerja dengan baik maka akan didapat hasil sebagai berikut: Gambar 12.4 Tampilan Home Page Aplikasi Apabila link diatas diklik akan didapat tampilan sebagai berikut : Gambar 12.5 Calculator Form 112 The result is: 9.0 Download the full sourcecode Gambar 12.6 Tampilan Akhir Session Bean RANGKUMAN Session bean adalah enterprise bean yang berinteraksi secara langsung dengan user dan berisi business logic dari suatu aplikasi enterprise Pada dasarnya, session bean menggunkan satu entity bean untuk mengakses atau memodifikasi data. Session dan entity bean mengimplementasikan business logic, business rules, algorithma dan alur kerja Session bean terbagi atas statefull session bean dan stateless session bean. Stateless session bean tidak mempertahankan apa yang disebut conversational state dengan client sedangkan statefull session bean menggunakan instance variable yang mengijinkan data persistent selama pemanggilan method karena instance variable memungkinkannya Session bean digunakan ketika hanya ada satu client, bean tidak persistent dan iimplementasikan pada web services Statefull session bean digunakan bila kita ingin menyimpan informasi tentang client selama method invokasi dan bean bekerja sebagai mediator antara client dan komponen lain dari aplikasi Stateless session bean digunakan jika bean tidak mengandung data untuk client tertentu dan hanya ada satu invokasi method diantara semua client untuk melakukan generic task. LATIHAN SOAL 1. Jelaskan apa yang dimaksud dengan session bean ! 2. Bedakan statefull session bean dan stateless session bean ! 3. Kapan anda menggunakan statefull session bean dan stateless session bean ! 4. Dengan menggunakan konsep session bean buatlah aplikasi registrasi member baru dari suatu organisasi ! 5. Dalam session bean dikenal dua client. Bedakan kedua client tersebut dan berikan contoh dalam bentuk program ! 113 BAB XIII JAVA PERSISTENCE API Java Persistence API (JPA) adalah API standart yang digunakan untuk mengelola data persistent dan object/relational mapping. Java Persistence API ditambahkan pada platform Java EE 5. Setiap application server yang compatible dengan java EE 5 mendukung java persistent API. Java Persistence API menjamin management persistence dan mapping objek. Ini amat membantu ketika menggunakan JPA dalam pengembangan aplikasi menggunakan platform untuk java EE 5. 13.1. Ciri dan Keuntungan JPA Java Persistence API adalah framework ringan yang didasarkan pada objek java untuk mapping object relational. Anotasi metadata java dan atau descriptor XML digunakan untuk mepping antara java object dan relational database. Ini juga mengijinkan SQL seperti query language yang bekerja untuk query statis maupun dinamis. Ini juga mengijinkan penggunaan persistence API. Java persistence API tergantung pada anotasi metadata. API meliputi : o Java Persistence API o Anotasi Metadata o Java persistence query language Java persistence API dibangun diatas ide – ide cemerlang dari teknologi – teknologi persistence seperti TopLink, JDO dan Hibernate. JPA compatible dengan java SE juga java EE dan mengijinkan pengembang mengambil keuntungan dari standart persistence API. Data persistence tidak mudah bagi kebanyakan aplikasi enterprise karena harus mengakses relational database seperti Oracle 10g. Ini adalah tanggung jawab kita untuk mengupdate dan mengambil 114 database dengan menuliskan kode menggunakan SQL dan JDBC. Sementara itu beberapa frameworks object relational seperti JBoss Hibernate dan Oracle TopLink membuat persistence lebih mudah dan menjadi lebih terkenal. Persistence tier sebuah aplikasi dapat dibangun dalam beberapa cara tetapi platform java tidak mengikuti standart yang dapat digunakan baik oleh java EE maupun java SE. Tetapi Java Persistence API membuat standart persistence API untuk platform java. Process kerja aplikasi Enterprise Java Bean menggunakan JPA dapat dilihat pada gambar berikut ini : Gambar 13.1 Proses Kerja EJB dan JPA 13.2. Domain Model Saat membangun aplikasi enterprise, pertama rancang domain object model yang dibutuhkan untuk menyimpan data dalam database. Domain model menunjukkan object atau entity persistence dalam database. Satu entity menunjukkan satu baris dalam data. Entity dapat berupa person, tempat atau benda yang ingin disimpan di data dalam database. Domain model mencakup karekteristik - karekteristik semua object oriented seperti inheritance, polimorfisme dan lain – lain. 115 Ketika mengembangkan aplikasi enterprise, pertama rancang domain object model untuk menyimpan data dalam database dan kemudian database skema. Gambar berikut mengilustrasikan hubungan one to many antara Employee dan Department. Entity contractor dan fulltime diwariskan dari entity employee. Gambar 13.2 Contoh Domain Object Model 13.3. Entity Entity adalah light weight persistence domain object yang mendefinisikan sebuah table dalam relational database dan setiap instance suatu entity berasosiasi dengan satu baris dalam table tersebut. Entity menunjuk ke koleksi logic data yang dapat disimpan atau dipanggil sebagai satu kesatuan. Sebagai contoh, dalam aplikasi bank, Customer dan BankAccount dapat diperlakukan sebagai entity. Customer name, customer address dapat dikelompokkan secara logic menunjuk pada entity Customer. Demikian pula account number, total balance dapat dikelompokkan secara logic pada entity BankAccount. Persistance field atau persistent properties menyatakan keadaan persistent suatu entity. Untuk memetakan entiry dan relatinshipnya ke data dalam relational database entity – entity ini menggunakan objectrelational mapping. Ada beberapa ketentuan dari entity class : o Class harus memiliki constructor tanpa argument baik public atau protect 116 o Class juga method dan instance variable yang persistence jangan dideklarasikan sebagai final o Gunakan anotasi javax.persistance.Entity untuk menganotasi class o Deklarasikan persistence instance variable sebagai protected, private atau package private sehingga dapat diakses secara langsung oleh method – method class o Entity class dapat mengextend entity juga non entity class dan sebaliknya 13.4. Persistance Fields dan property dalam Entity Class Ada dua cara untuk mengakses keadaan persistent suatu entity baik dengan menggunakan instance variable atau menggunakan property javaBean. Field atau property harus mengikuti field dan property java. Entity menggunakan persistence fields sementara memetakan anotasi – anotasi. Anotasi dikenakan pada instance variable entity. Pada lain pihak enetity menggunakan persistence property ketika memetakan anotasi. Anotasi dikenakan pada entity get method untuk javaBean style. Kita tak boleh memetakan anotasi ke field dan property secara bersama dalam satu entity. Persistance mengakses instance variable entity class secara langsung pada saat runtime, jika entity class menggunakan persistence fields. Perlu untuk menggunakan mapping object/relational pada instance variable. Entity harus mengikuti konvensi method dari component javaBean ketika menggunakan property persistent. Property javaBean style menggunakan getter dan setter method yang digunakan setelah instance variable dari entity class. Ada getter dan setter method untuk setiap persistence property. Dalam hal Boolean property kita dapat menggunakan isProperty daripada getProperty seperti pada contoh berikut . Misalkan sebuah entity dengan tipe customer menggunakan persistent 117 property yang mempunyai private instance variable dengan nama firstName, class mendefinisikan dua method getFirstName dan setFirstName untuk mengambil dan mengeset nilai – nilai instance variable. Gunakan method signature berikut untuk property single valued persistent o Type getProperty ( ) o Void setProperty( Type type) 13.4. Primary Key dalam Entity Untuk menunjukkan property primary key gunakan anotasi javax.persistance.Id. Composite Primary Key disusun apakah oleh property persistent tunggal atau field dan menggunakan javax.persistance.IdClass dan javax.persistence.EmbeddedId. Sebuah class primary key harus mengikuti ketentuan sebagai berikut : o Harus memiliki access modifier sebagai public o Class harus mencakup sebuah contstructor public o Class harus serialized o Class harus mengimplementasikan method equals Contoh berikut menampilkan source code untuk mengelola Primary Key yang berupa Composite Key. public final class ListItemKey implements Serializable{ public Interger order_Id; public int item_Id; public ListItemKey() {} public ListItemKey(Integer order_Id, int item_Id){ this.order_Id = order_Id; this.item_Id = item_Id; } 118 public boolean equals(Object otherOb){ if(this == otherOb){ return true; } if(!otherOb instanceof ListItemKey){ return false; } ListItemKey other = (ListItemKey) otherOb; return ((order_Id==null?other.order_Id==null:order_Id.equals (other.order_Id)) &&(item_Id == other.item_Id)); } public int hashCode(){ return ((orderId==null?0:orderId.hashCode())^((int) itemId)); } public String toString() { return "" + orderId + "-" + itemId; } } 13.4. Contoh Java Persistance Dalam contoh berikut kita akan membuat aplikasi JPA yang memiliki domain model seperti pada gambar berikut : Gambar 13.3 Domain Model JPA Langkah langkah membangun aplikasi ini adalah : 1. Membuat Remote business interface : BookCatalogInterface 119 2. Mengimplementasikan anotasi SessionBean : BookCatalogBean 3. Membuat entity bean : BookBank 4. Membuat web client : WebClient 5. Mendeploy book ke dalam server 6. Menjalankan web browser Source code dari Book Bean adalah sebagai berikut : package entity.library; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import java.util.Collection; import javax.persistence.*; import java.io.Serializable; @Entity @Table(name="bookbank") public class BookBank implements Serializable { long id; String title; String author; double price; //protected Collection <LineItems> lineitems; public BookBank() { super(); } public BookBank(String title, String author, double price) { super(); this.title = title; this.author = author; this.price = price; } @Id @GeneratedValue(strategy=GenerationType.AUTO) // Getter and setter methods for the defined propert ies.. 120 public long getId() { return id; } public void setId(long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } } Anotasi @Table digunakan untuk menspesifikasikan nama table yang digunakan oleh entity bean dan anotasi @Id digunakan untuk menandai field id sebagai primary key dari entity bean. SQL schema dari BOOK adalah sebagai berikut : CREATE TABLE BOOKBANK ( ID int(11) NOT NULL auto_increment, TITLE varchar(50) NOT NULL, AUTHOR varchar(50) NOT NULL, PRICE decimal(12,2) NOT NULL, 121 PRIMARY KEY (ID) ); Business logic dalam aplikasi ini adalah Book catalog yang diperlukan untuk menyimpan objek buku ke dalam database dan mengeluarkannya dari database saat dibutuhkan. Kita menggunakan session bean untuk mengimplementasikan business logic ini dengan source kode sebagai berikut : package entity.library; import javax.ejb.Remote; import java.util.Collection; @Remote public interface BookCatalogInterface { public void addBook(String title, String author, do uble price); public Collection <BookBank> getAllBooks(); } Untuk menggunakan session bean dalam entity bean kita memerlukan class utility yang disebut Entity Manager yang diimplementasikan dalam BookCatalogBean dengan source code sebagai berikut : package entity.library; import java.util.Iterator; import java.util.Collection; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.io.Serializable; import javax.ejb.Remote; @Remote(BookCatalogInterface.class) @Stateless public class BookCatalogBean implements Serializable, BookCatalogInterface { @PersistenceContext(unitName="EntityBean") EntityManager em; protected BookBank book; protected Collection <BookBank> bookList; 122 public void addBook(String title, String author, dou ble price) { // Initialize the form if (book == null) book = new BookBank(title, author, price); em.persist(book); } public Collection <BookBank>getAllBooks() { bookList=em.createQuery("from BookBank b").getResult List(); return bookList; } } RANGKUMAN Java Persistence API (JPA) adalah API standart yang digunakan untuk mengelola data persistent dan object/relational mapping Java Persistence API adalah framework ringan yang didasarkan pada objek java untuk mapping object relational Java persistence API tergantung pada anotasi metadata dan meliputi : o Java Persistence API o Anotasi Metadata o Java persistence query language Domain model menunjukkan object atau entity persistence dalam database Persistance field atau persistent properties menyatakan keadaan persistent suatu entity. Untuk memetakan entiry dan relatinshipnya ke data dalam relational database entity – entity ini menggunakan object-relational mapping. Ada dua cara untuk mengakses keadaan persistent suatu entity baik dengan menggunakan instance variable atau menggunakan property javaBean Entity adalah light weight persistence domain object yang mendefinisikan sebuah table dalam relational database dan setiap instance suatu entity berasosiasi dengan satu baris dalam table tersebut 123 LATIHAN SOAL 1. Jelaskan apa yang dimaksud dengan Java Persistance API dan apa kegunaanya dalam pengembangan aplikasi enterprise ! 2. Bedakan antara JPA dan session bean ! 3. Apa yang dimaksud dengan Domain Model dalam kaitannya dengan JPA. Terangkan maksudnya ! 4. Dengan menggunakan entity manager utility buatlah aplikasi sederhana yang berisikan entity student ! 5. Kapan anda menggunakan entity manager, jelaskan ! 124