Membuat Java Servlet Oleh: Galih Satriaji (http://blog.galihsatria.com) Dalam sesi tutorial kali ini, kita akan membuat servlet sederhana dalam langkah demi langkah dengan tujuan memahami bagaimana gaya Java menangani sebuah mekanisme website (request dan response) dalam mekanisme protokol HTTP. Untuk itu, ada pre-requisites yang harus kita penuhi agar dapat mengikuti tutorial ini, yaitu: - Mengerti konsep object oriented Java Minimal pernah membuat program Java :D Mengerti bagaimana mekanisme request dan response dalam protokol HTTP. Java Servlet, Apakah Itu? Java adalah bahasa pemrograman yang benar-benar berorientasi objek. Java menanangani sebuah permasalahan dengan class-class dan method-method. Bahkan untuk menangani HTTP, Java juga menggunakan class yang dinamakan Servlet. Sebuah class yang bisa menangani request HTTP harus merupakan subclass dari objek HTTPServlet dan mengimplementasikan method abstract-nya untuk menangani request. Method doGet adalah method yang menangani request HTTP GET dan method doPost adalah method yang menangani request HTTP POST. WEB.XML Lalu bagaimana sebuah class Servlet bisa melayani request yang dibentuk dari sebuah URL (Uniform Resource Locator)? Misalnya, saya ingin class GreetingServlet akan melayani request dari URL http://localhost/servlet/greetings. Mari saya perkenalkan kepada salah satu elemen yang paling berperan dalam aplikasi web berbasis Java: file web.xml. Aplikasi web berbasis Java baik yang paling sederhana hingga yang menggunakan bertumpuk-tumpuk framework akan selalu berawal dari file web.xml. File ini adalah file konfigurasi yang mengatur seluruh sistem web. File ini bertipe XML dan selalu terletak dalam directory WEB-INF pada aplikasi web. Anda ingin memasang sebuah framework yang rumit? Anda akan selalu berawal dari web.xml, karena sebenarnya framework-framework tersebut tersusun dari class-class juga. Apa hubungan class servlet, web.xml, dan URL? Perhatikan dengan baik, titik ini adalah wajib Anda kuasai jika ingin menguasai web berbasis Java. Konfigurasi pada Web.xml akan mendefinisikan sebuah servlet akan melayani sebuah URL dalam URL-Mapping. Pemetaan URL ke dalam servlet inilah yang akan membuat sebuah servlet bisa menerima request dan menjawabnya. Sehingga, komponen utama dalam aplikasi servlet adalah sebagai berikut: 1. Class yang merupakan subclass HTTPServlet. 2. File web.xml yang berisi konfigurasi aplikasi. 3. Mapping antara URL dan Servlet. URL mana yang akan dilayani Servlet mana dalam URLMapping. Praktik! Oke, saya kira, saya akan lebih mudah menjelaskan jika kita langsung praktik saja. Agar mudah, siapkan dulu peralatan dan software-software berikut ini: 1. Java SDK versi 5 ke atas. Saya tidak akan pakai versi 1.4.2 lagi karena sudah terlalu Jadul, heheh :P 2. IDE: Eclipse SDK Java EE versi Europa 3.3. Anda bisa saja memakai IDE yang lain, tetapi di tutorial ini, saya akan memakai Eclipse Java EE versi Europa 3.3. Anda dapat mendownloadnya di URL: http://www.eclipse.org 3. Servlet Container: Apache Tomcat versi 5.5 ke atas. Sebuah aplikasi web selalu memerlukan webserver bukan? Webserver yang dapat menerjemahkan Servlet dinamakan Servlet Container dan kita akan menggunakan salah satu Servlet Container yang paling populer: Apache Tomcat. Anda dapat mendownload-nya di URL: http://tomcat.apache.org Apa yang akan kita buat? Agar tidak melulu aplikasi Hello World, kita akan membuat sebuah aplikasi sesederhana Hello World, yaitu Greetings. Kita akan meminta pengunjung memasukkan nama, dan ketika ia menekan tombol, servlet akan menyapa dengan memanggil namanya. Simpel. Langkah pertama, install dua software yang kita butuhkan di atas, yaitu Eclipse SDK dan Tomcat. Eclipse cukup dibongkar dari file terkompresinya (ZIP atau TAR.GZ) sedangkan melakukan instalasi Tomcat juga tak lebih sulit daripada menekan tombol next hingga finish. Jadi, saya asumsikan Anda telah berhasil melakukan instalasi Eclipse dan Tomcat. Saya asumsikan, Tomcat telah berjalan dan akan mendengarkan request di port 8080 (port default Tomcat). Saya asumsikan lagi, directory instalasi Tomcat juga default, yaitu di C:\Program Files\Apache Software Foundation\Tomcat x.x dimana x.x adalah versi dari Tomcat anda. Jalankan Eclipse. Tampilan Eclipse saya seperti ini: Saya telah memiliki beberapa project web sehingga tampilan Eclipse saya sudah sedemikian sibuk. Buat project baru. Tekan File | New | Other… atau klik kanan pada tab Project Explorer (sebelah kiri) | New | Other… Kemudian akan tampil dialog sbb: Cari tree berjudul Web dan pilih Dynamic Web Project. Anda tidak akan menemukan pilihan ini jika versi Eclipse-nya bukan Java EE atau Eclipse dijalankan memakai JRE versi 1.4 ke bawah. Kalau sudah ketemu tekan Next. Pada Project name, beri nama untuk project baru kita, misalnya bernama servlet. Untuk Project contents, biarkan default maka Eclipse akan menyimpan pada workspace default yang selalu ia minta ketika Eclipse mulai dijalankan. Untuk Target runtime, kita diminta menyebutkan platform container yang akan digunakan dalam project ini. Untuk project web pertama, combo box tersebut akan kosong sehingga kita harus membuat Target Runtime baru dengan menekan tombol New. Membuat Target Runtime Setelah Anda menekan tombol New, Wizard pembuatan project baru akan ditumpuki Wizard pembuatan Target Runtime seperti screenshot di bawah ini: Eclipse Europa mendukung beberapa runtime untuk server-server: Apache Tomcat, IBM Websphere, JBoss, Object Web, dan Oracle OAS serta Oracle OC4J. Karena saya memakai Tomcat versi 6, maka saya memilik tree Apache dan memilih Apache Tomcat v6.0. Sesuaikan versi Runtime ini dengan lingkungan Anda. Tekan Next untuk melanjutkan. Pada dialog ini, pertama kali Anda tekan Browse dan menunjukkan tempat instalasi Tomcat. Secara otomatis, textfield Name akan terisi jika directory yang Anda masukkan dianggap valid oleh Eclipse. Setelah itu, tekan Finish. Biarkan entri JRE tetap default (Workbench default JRE). Begitu Anda tekan Finish, Anda akan kembali pada Wizard pembuatan project baru dengan Target runtime telah terisi dengan Tomcat. Biarkan default untuk entri Configuration (Default Configuration for Apache Tomcat vx.x), dan tekan Next. Project Facets, adalah konfigurasi yang diperlukan Eclipse untuk menyesuakan diri dengan aplikasi yang akan Anda buat. Nanti Eclipse akan mengeluarkan pesan-pesan error dan peringatan berdasarkan Facets ini. Dua opsi tercentang secara default. Dynamic Web Module adalah versi spesifikasi Servlet yang akan Anda gunakan. Untuk alasan pribadi saja, saya masih suka menggunakan versi 2.4 daripada 2.5. Kemudian untuk Java, saya masih suka menggunakan Java versi 5. Context Root adalah directory puncak untuk aplikasi web Anda yang akan muncul pada URL. Dengan melihat konfigurasi yang telah kita lakukan, screenshot di atas akan memiliki URL http://localhost:8080/servlet. Di sini, servlet, nama project kita, sebagai context root. Content Directory adalah tempat kita menaruh file-file web seperti HTML, XML, CSS Styles, Javascript, images, dan resource-resource yang akan kita butuhkan. Tentu saja, di sini akan bercokol elemen paling penting dalam aplikasi web berbasis java: web.xml yang ada pada directory WEB-INF. Java Source directory adalah tempat source Java disimpan. Biarkan default, dan tekan Finish. Tunggu sebentar, Eclipse akan menyiapkan project baru untuk Anda. Inilah struktur directory aplikasi web yang telah dibuatkan oleh Eclipse. Dari awal hingga akhir nanti, kita akan dimanjakan oleh Eclipse Java EE. Lihat, semua struktur directory mulai penempatan source code, library, hingga web.xml telah dibuatkan sehingga kita tinggal menambahkan dan meneruskan saja. Percayalah, hingga nanti saat pasca produksi dan deployment seperti pembuatan file WAR (Web Archive), kita akan sangat dimanja oleh Eclipse Europa ini. Form Sekarang kita akan membuat form yang akan meminta pengunjung memasukkan namanya. Ketika pengunjung menekan tombol submit, data akan dikirim melalui request HTTP POST dan dikirim balik ke servlet yang sama. Bedanya, pengunjung yang datang awal akan melakukan request HTTP GET, dan ketika mengirim data dengan request HTTP POST. Mari kita mulai. Sekarang kita buat class Java yang merupakan subclass HttpServlet agar ia bisa melayani request HTTP. Kembali ke IDE Eclipse, pada project explorer, klik kanan project servlet | New | Servlet… Anda akan disuguhi dialog pembuatan servlet baru. Pada isian Java Package, isi dengan nama package – misalnya, saya menamai dengan galih.tutorial.servlet. Kemudian, pada Class name, isi dengan nama class, misalnya AskNameServlet. Tekan tombol Next. Dialog berikutnya adalah servlet mapping. Saya tadi telah menguraikan bahwa agar sebuah servlet bisa melayani request HTTP, maka harus ada pemetaan antara servlet dan URL. Sebuah URL akan dilayani oleh suatu servlet ditentukan pada servlet mapping ini. Kita coba biarkan dulu default seperti yang telah diisi oleh dialog tersebut. Tentu saja Anda harus bereksperimen dengan mengubah-ubah isian yang ada di situ, utamanya pada URL Mappings dengan tombol Add, Edit, dan Remove yang ada di situ. Tekan Next. Dialog berikutnya adalah detail dari servlet yang akan kita buat. Biarkan default, lalu tekan Finish. Kita akan segera dibuatkan oleh Eclipse class tersebut. Perhatikan bahwa servlet tersebut memiliki tiga elemen penting: 1. Merupakan subclass dari javax.servlet.http.HttpServlet dan mengimplementasi interface javax.servlet.Servlet. 2. Memiliki method doGet. Method ini akan dijalankan ketika servlet menerima request HTTP GET. 3. Memiliki method doPost. Method ini akan dijalankan ketika servlet menerima request HTTP POST. Lalu kita tadi telah melewati dialog yang meminta memasukkan URL Mappings (yang pada kali ini kita biarkan default). Pada proses itu, Eclipse melakukan penambahan pada web.xml secara otomatis mengenai URL Mappings dan detail servlet ini. Jadi, setiap servlet yang kita buat harus didefinisikan di web.xml, sekaligus URL Mapping-nya. Mari kita buka web.xml. Di sana sudah ada entri baru yang berbunyi: <servlet> <description> </description> <display-name> AskNameServlet</display-name> <servlet-name>AskNameServlet</servlet-name> <servlet-class> galih.tutorial.servlet.AskNameServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AskNameServlet</servlet-name> <url-pattern>/AskNameServlet</url-pattern> </servlet-mapping> Jadi, jika kita menghubungi alamat via web dengan URL http://localhost:8080/servlet/AskNameServlet, maka servlet yang dijalankan adalah AskNameServlet. Method doGet akan dijalankan. Wokeh, jadi kita sekarang sudah punya method doGet yang siap melakukan sesuatu. Apa yang akan kita lakukan di dalam method ini? Tentu saja menampilkan form yang meminta pengunjung memasukkan namanya agar bisa kita sapa. Outputnya dalam tag HTML. Bagaimana mekanismenya? Pertama-tama, harus kita ketahui dulu kalau request dan response pada servlet dianggap sebuah stream. Sama ketika kita melakukan operasi baca dan tulis file di Java, yaitu menggunakan FileInputStream untuk membaca dan FileOutputStream untuk menulis. Demikian juga di servlet, kita harus mendapatkan dulu output stream dari servlet agar bisa ditulisi. Mekanismenya seperti dibawah ini: // mendapatkan output stream PrintWriter out = response.getWriter(); Objek out kini bisa kita tulisi dengan HTML. // set output type dalam HTML response.setContentType("text/html"); // berikan htmlnya kepada user, ini html paling sederhana out.println("<html>"); out.println("<head>"); out.println("<title>Uji Coba Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Silakan masukkan nama anda</h1>"); out.println("<form action='AskNameServlet' method='post'>"); out.println("Nama Anda:"); out.println("<input type='text' name='nama' />"); out.println("<input type='submit' value='Submit' />"); out.println("</form>"); out.println("</body>"); out.println("</html>"); Saya memasukkan kode HTML yang sangat sederhana di sini. Hanya judul, dan input teks, serta satu tombol. Penting untuk diperhatikan di sini, saya memasukkan tag <form> yang akan menuju ke URL AskNameServlet (diri sendiri), tetapi dengan menggunakan method POST. Meskipun merujuk satu servlet yang sama, karena requestnya adalah POST, maka yang akan melayani nanti adalah method doPost. Sebelum menulis kode untuk respon untuk POST, mari kita coba jalankan dulu. Klik kanan AskNameServlet pada Project Explorer dan pilih Debug As | Debug on Server. Anda akan disuguhi dialog wizard lagi untuk melakukan debugging di server. Karena kita tadi telah membuat Runtime berupa Tomcat, maka halaman pertama wizard ini bisa langsung dilewati. Pilih existing server dan Tomcat v.xx at localhost. Tekan Next. Pada halaman dua, pastikan project kita (servlet)berada di sisi kanan di bawah Configured projects. Kalau sudah, langsung saja tekan finish. Eclipse akan membuka internal web browser. Jika Anda beruntung, Anda akan mendapatkan tampilan yang mirip dengan screenshot di bawah ini: Kita telah konfigurasi bahwa jika pengunjung menekan tombol Submit, maka request akan menuju ke servlet yang sama dengan mode POST. Oleh karena itu, kita mesti mengolah inputan pengunjung pada method doPost. Mari kita lakukan. Pertama-tama, kita harus mendapatkan input dari pengunjung terlebih dahulu. Input ini didapatkan dari textfield yang kita beri nama nama. Berdasarkan parameter nama tersebut, kita mendapatkan input di servlet dengan cara: // mendapatkan user input String nama = request.getParameter("nama"); Lalu kita tampilkan kembali ke pengunjung sambil menyapanya. Prosesnya sama dengan penanganan request HTTP GET, yaitu mendapatkan output stream, lalu menulisinya dengan tag-tag HTML. // mendapatkan output stream PrintWriter out = response.getWriter(); // set output type dalam HTML response.setContentType("text/html"); // berikan htmlnya kepada user, ini html paling sederhana out.println("<html>"); out.println("<head>"); out.println("<title>Uji Coba Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Halo " + nama + ", Apa Kabar?</h1>"); out.println("</body>"); out.println("</html>"); Jalankan kembali server dengan cara yang sama seperti cara yang telah saya sebutkan di atas. Lalu setelah kita menekan tombol Submit, kita akan mendapatkan response dari server: Deployment Setelah kita menulis baris demi baris kode di Eclipse, tiba saatnya kita upload ke server production untuk menjadi aplikasi yang digunakan. Untuk itu, Java memiliki cara tersendiri dalam proses deployment. Java menggunakan satu bundel file yang disebut WAR (Web Archive) untuk kebutuhan deployment ke server production. File ini sebenarnya adalah file yang dikompres dalam format ZIP dengan tambahan spesifikasi yang menjelaskan mengenai aplikasi web tersebut. Spesifikasi ini disimpan di dalam folder META-INF dan WEB-INF. Cara pembuatan file WAR ini bisa menggunakan tool command line yang bernama jar, yang telah ada bersama tool-tool Java SDK. Wups, command line? Ada yang sedikit alergi dengan tool-tool yang berbau command line? Tenang, Eclipse Europa telah menyediakan menu yang telah mengotomatisasi proses pembuatan file WAR dengan sekali dua kali klik saja. Bagaimana caranya? Ikuti saya Kembali ke tab Project Explorer di sebelah kiri, pada project klik kanan, pada konteks menu yang keluar pilih Export | WAR file. Pada dialog yang muncul, pada isian Destination, isi dengan lokasi penyimpanan pada directory dimana project servlet berada. Kemudian tekan Finish. File ini siap dideploy pada server. Men-deploy pada Tomcat Sekarang kita akan coba mendeploy file servlet.war yang baru saja kita buat di server yang juga kita pakai untuk development, yaitu Tomcat. Pertama-tama, pastikan Tomcat tidak kita gunakan sebagai server development di Eclipse. Pada tab Server di bagian bawah, pastikan status Tomcat adalah Stopped. Kemudian, jalankan Tomcat sebagai stand-alone server, bukan dari Eclipse, dengan cara menjalankan service-nya. Jalankan program Monitor Tomcat. Tekan Start | All Programs | Apache Tomcat x.x | Monitor Tomcat. Bentuk programnya adalah seperti screenshot di bawah ini: Jalankan service dengan menekan tombol Start. Lalu buka browser, hubungi alamat http://localhost:8080/manager/html. Anda akan diminta memasukkan user administrator dan password. User administrator default Tomcat adalah admin. Sedangkan passwordnya Anda buat pada saat melakukan instalasi Tomcat. Jika lupa passwordnya, detail user dan password ini bisa Anda lihat di file tomcat-users.xml yang terletak di folder conf di bawah folder instalasi Tomcat Anda. Terlihat di situ bahwa user admin memiliki password admin. Kita akan diantarkan pada halaman administrasi server Tomcat yang cukup sederhana. Kemudian, scroll ke bawah hingga bagian WAR file to deploy. Tekan Browse dan pilih file WAR yang telah kita buat tadi di sini. Setelah itu tekan Deploy. Tomcat akan memproses, dan jika berhasil, ia akan memberikan pesan pendek: OK. Pastikan pula, servlet telah terdeploy dan berjalan dengan sukses. Kita coba jalankan browser dan hubungi alamat http://localhost:8080/servlet/AskNameServlet. Pastikan servlet telah berjalan dengan baik dan merespon dengan respon yang sama dengan apa yang telah kita coba waktu di Eclipse. Penutup dan Kesimpulan Apa yang telah kita pelajari hari ini: 1. 2. 3. 4. Pembuatan servlet sederhana dengan menggunakan Eclipse Europa Mengerti proses penanganan request HTTP di Java Membuat file WAR dengan Eclipse Europa Melakukan deployment di server Apache Tomcat Setelah kita mempelajari servlet dan mengerti konsep servlet, kini kita tahu bagaimana cara Java menangani web request dengan protokol HTTP. Tetap. Java tetap menangani request lewat objek Servlet pada method doGet dan doPost. Tanpa saya beritahu pun seharusnya Anda telah mengerti kelemahan terbesar mekanisme ini: penulisan output. Yap, penulisan response dalam bentuk HTML harus melalui mekanisme OutputStream. Kita harus mendapatkan objek OutputStream dan menulis tag HTML dengan cara memanggil out.println berkalikali. Sangat menyebalkan. Selain tidak fleksibel, kita tidak bisa menggunakan WYSIWYG (What You See What You Get) editor dalam hal ini semacam Adobe Dreamweaver. Itulah mengapa saya tadi memberikan contoh HTML yang sangat sederhana Selain tidak dapat diproses dengan menggunakan editor WYSIWYG, setiap kali kita ingin mengubah kode HTML, kita harus melakukan kompilasi ulang servlet. Ini sangat menyakitkan. Tidak sebanding antara usaha dan hasil jika kita ingin menggeser posisi suatu teks harus melakukan kompilasi ulang. Untuk itulah muncul solusi JSP (Java Server Pages). JSP memungkinkan kita mencampur kode HTML dan kode Java dalam satu file. Jika Anda telah mengenal bahasa pemrograman web PHP, gaya JSP sama seperti PHP. Dalam prosesnya, file JSP akan dikompilasi menjadi servlet oleh web container sebelum melayani request HTTP. Tetapi mengapa saya memperkenalkan konsep servlet? Bukan JSP yang jauh lebih mudah? Karena saya tidak ingin JSP diperlakukan persis seperti PHP yang scripting. Harus diingat bahwa JSP akan dikompilasi menjadi servlet sebelum melayani request. Desain aplikasi yang baik adalah memisahkan antara presentasi dan bussiness logic dalam bagian yang benar-benar terpisah. Desain seperti ini disebut MVC (Model View Controller). Konsep MVC akan memudahkan kita dalam merawat aplikasi yang akan selalu berkembang. JSP seyognyanya kita pakai untuk presentasi saja, sedangkan logika bisnis aplikasi tetap kita lakukan di servlet. Untuk itu, dalam seri tutorial yang akan datang, saya tidak akan membahas JSP, akan tetapi saya akan langsung memperkenalkan framework Java Web. Agar mudah dimengerti, konsep framework akan jauh lebih mudah diterangkan jika konsep servlet telah dimengerti terlebih dahulu, seperti objek-objek Java yang menangani dan hubungannya dengan web.xml yang berperan sangat penting dalam sebuah aplikasi Java Web. Sampai jumpa di tutorial berikutnya. Stay tuned with me, OK? Salam hangat saya, Galih Satriaji http://blog.galihsatria.com