26 January 2009

Beberapa Tips dan Trik pada Servlet dan Jsp

Dalam perkembangan teknologi web dengan menggunakan bahasa pemrograman Java, kita mengenal servlet dan jsp. Servlet dan Jsp hadir sebagai sebuah layer presentasi dari struktur web aplikasi yang kita buat dengan menggunakan Java. Layer presentasi adalah layer yang bertugas untuk menghadirkan tampilan-tampilan yang biasanya menjadi sebuah hasil akhir sebuah proses aliran data. Ketika memilih menggunakan servlet atau jsp sebagai sebuah layer presentasi, pastinya didasari oleh pertimbangan-pertimbangan yang matang sesuai dengan tujuan yang memang ingin dicapai.

Meski hanya sebagai sebuah layer presentasi dalam suatu aplikasi web, servlet dan jsp juga memiliki daya tarik tersendiri untuk bisa di eksplorasi dan dipergunakan dalam aplikasi web kita. Dibawah ini beberapa trik dan tips yang bisa dilakukan pada servlet dan jsp yang bisa dipakai sesuai dengan kebutuhan-kebutuhan yang ada.

1. Mengambil nilai parameter dari deployment descriptor (web.xml) pada init Servlet.

Perhatikan kode kode berikut ini:

public class SendMailServlet extends HttpServlet {
private String smtpHost;

public void init(ServletConfig config) throws ServletException {
super.init(config);
smtpHost = config.getInitParameter("smtpHost");
}
…………………………
}
Kode di atas adalah sebuah potongan kode dari sebuah servlet pengirim email. Untuk pengiriman email, proses ini jelas membutuhkan sebuah SmtpHost sebagai sebuah server untuk menghantarkan email sehingga email tsb bisa sampai ke tujuan. Untuk menghindari hard-code, nama SmtpServer di letakkan di dalam deployment descriptor(web.xml), sehingga ketika ada perubahan pada nama SMTP Server, developer tidak perlu membongkar ulang, kompilasi ulang dan mendeploy ulang aplikasinya, cukup dengan mengganti nilai dari parameter "smtpHost” pada web.xml saja dan aplikasi pun dapat berjalan kembali tanpa gangguan yang berarti.Dan tentunya dibawah ini adalah potongan kode dari web.xml dimana nilai dari parameter smtpHost tersebut diletakkan

<servlet>
<servlet-name>sendMessage</servlet-name>
<servlet-class>org.mojo.mail.web.servlet.SendMailServlet</servlet-class>
<init-param>
<param-name>smtpHost</param-name>
<param-value>smtp.speed.net.id</param-value>
</init-param>
</servlet>

Sedangkan untuk process flownya adalah, ketika pertama kali servlet ini dipanggil maka application server segera menjalankan metode init pada servlet itu, kemudian metode ini mengisi nilai variabel smtpHost dengan cara mengambil nilainya dari deployment descriptor tempat dimana servlet tsb di deklarasikan.

2. Menggunakan Interface RequestDispatcher untuk melempar suatu proses ke servlet lain.

Menjadi suatu pilihan yang menarik jika kita membuat skenario bahwa setiap servlet mempunyai masing-masing tugas yang berbeda. Misal ada servlet yang tugasnya mengirimkan email, atau servlet yang tugasnya menampilkan pesan error, dan lain-lain. Dengan skenario seperti ini, kita akan lebih mudah menelusuri error yang mungkin saja terjadi pada suatu proses, sebab masing-masing proses mempunyai modul yang berbeda.

Dengan skenario seperti ini, kita pasti membutuhkan pelemparan proses dari suatu servlet ke servlet lain.

Untuk melempar suatu proses dari satu servlet ke servlet lain kita bisa menggunakan Interface RequestDispatcher. Perhatikan kode-kode berikut ini.

public class Test1Servlet extends HttpServlet{

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
System.out.println("doGetInvoked");
throwToServlet(req, res);
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
System.out.println("doPost Invoked");
throwToServlet(req,res);
}
private void throwToServlet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
System.out.println("This Process wil throw to another servlet");
RequestDispatcher rd = getServletContext().getNamedDispatcher("Test2");
rd.forward(req,res);
}
}

Pada kode class servlet diatas kita melihat ada baris

RequestDispatcher rd = getServletContext().getNamedDispatcher("Test2");

Baris ini adalah baris dimana servlet mengambil ServletContext yang terletak pada web.xml, kemudian di ikuti dengan baris

rd.forward(req,res);

dan baris ini adalah suatu baris yang memerintahkan proses data di lempar ke servlet lain yang bernama Test2.

Pada prakteknya jangan lupa untuk menambahkan servlet Test2 pada isi dari web.xml

Sementara jika pelemparannnya kita lakukan dari jsp maka barisnya akan sedikit berubah menjadi seperti dibawah ini:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
RequestDispatcher rd = getServletConfig().getServletContext().getNamedDispatcher("Test2");
rd.forward(request,response);
%>

Ada penambahan getServletConfig pada baris inisialisasi RequestDispatcher disana, dan untuk forwardnya parameter diisi dengan request dan response yang sudah secara default ditanamkan dalam jsp.

3. Menggunakan metode sendRedirect untuk melempar suatu proses ke URL lain.

Jika pada trik yang kedua kita menggunakan interface RequestDispatcher untuk melempar suatu proses ke servlet lain, pada trik yang ketiga ini kita menggunakan metode sendRedirect untuk melampar suatu proses ke URL lain. Perbedaan trik ini dengan trik kedua adalah, jika trik yang ke dua hanya melempar proses ke servlet dalam context web-app yang sama, sementara tips yang ini bisa melempar proses bukan hanya ke context-app yang berbeda tapi juga cross url atau melempar ke URL yang berbeda.

Untuk melempar suatu proses ke URL lain perhatikan kode-kode berikut ini :

public class Test1Servlet extends HttpServlet{

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
System.out.println("doGetInvoked");
throwToURL(req,res);
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
System.out.println("doPost Invoked");
throwToURL(req,res);
}
private void throwToURL (HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
System.out.println("This Process wil throw to another URL");
res.sendRedirect("Test2");
}
}

Pada kode diatas perintah untuk melempar ke URL lain ada pada baris res.sendRedirect(“Test2”);

Dan jika kita ingin melakukannya dalam jsp, cukup dengan merubah baris res.sendRedirect menjadi response.sendRedirect saja. Sebab sekali lagi, variabel response sudah ditanamkan menjadi default ServletResponse pada type file jsp, sehingga kita tidak perlu membuat variabel untuk ServletReponse ini. Yang terakhir tentu saja url-mapping untuk Test2 ini juga harus di definisikan pada web.xml, kecuali url yang di tuju bukanlah URL yang berada pada WebAplikasi kita.

Catatan : Perbedaan antara tips ke dua dengan tips ke tiga jika dilihat dari sisi browser adalah: URL address pada tips ke-dua tidak berubah ketika proses pelemparan proses dilakukan, sementara untuk tips ke-tiga URL address pada browser akan berubah.

4. Menangani Null Value ketika memparsing parameter antar HTTP method.

Pada proses HTTP Post atau HTTP Get, jsp mem-parsing semua parameter yang dilempar dari form untuk kemudian dilakukan proses-proses selanjutnya. Terkadang ketika kita memparsing parameter pada jsp, kita sering kali menemui Null Value yang akhirnya proses data tidak bisa dilakukan karena jsp menangkap NullPointerException. Pada prakteknya Null Value terjadi karena parameter yang di parsing memang tidak membawa suatu nilai dari form feedernya. Oleh karena itu ketika jsp mem-parsing parameter tsb, maka terjadi Error NullPointerException. Untuk mencegahnya kita bisa membuat sebuah nilai default pada variabel yang nantinya akan menjadi wadah dari hasil parsing parameter.

Perhatikan kode-kode jsp berikut ini:

<%
String sId = request.getParameter("ID") == null ? "1" : request.getParameter("ID").trim();
String sName= request.getParameter("Name") == null ? "" : request.getParameter("Name");
%>

Pada kode diatas kita bisa melihat bahwa String sId akan menangkap sebuah parameter yang dilempar, parameter itu bernama ID, jika parameter ID yang dilempar mempunyai nilai Null maka secara default nilai variabel sId akan diisi dengan nilai 1, demikian juga dengan proses penangkapan parameter Name, namun variable String sName ini akan akan diisi oleh nilai “” jika parameter Name yang dilempar tidak membawa nilai.

Demikianlah beberapa Tips dan Trik pada servlet dan jsp yang menjadi pembahasan artikel ini. Semoga bermanfaat, dan silahkan dikembangkan sesuai dengan kebutuhan.

Menteng, 18 Januari 2008
Semoga Bermanfaat.

Josescalia.


No comments: