Membuat Java Servlet

advertisement
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
Download