Request, Session dan Context pada Servlet

Pemrograman java web memiliki Servlet, Request, session dan context. Object- object yang dibuat dalam sebuah program memiliki scope (cakupan) masing- masing. Pada dasarnya servlet sendiri adalah sebuah object yang dibuat oleh container atau web server contohnya Tomcat. Setiap user yang mengakses suatu servlet, sebenarnya bukan container tidak menambahkan jumlah servlet tersebut/ menginstansiasi servlet baru. Namun berdasarkan proses “object creation”, container membuat thread baru dari servlet yang diakses tersebut. Berbeda dengan request dan response yang terjadi dalam suatu servlet. Object request maupun response dibuat hanya pada scope akses saja. Dengan hal ini, dapat disimpulkan bahwa setiap setiap request yang berbeda akan memiliki thread servlet yang berbeda, namun tetap instance yang sama dari servlet yang diakses tersebut.
Servlet pada dasarnya mengimplementasikan protokol HTTP. HTTP adalah “stateless protocol” yang mana tidak menyimpan dan mengingat data ataupun user. Namun, ada kalanya kita membutuhkan agar data tersebut diingat dan disimpan oleh Servlet seperti pada proses user login atau keranjang belanja yang mana, data tersebut akan tetap ada selama user masih aktif. Lantas, bagaimana mengimplementasikan hal tersebut dalam servlet, jawabannya adalah Session. Session memungkinkan kita mengakses data yang diinginkan dalam kurun waktu tertentu selama user masih aktif. Session memiliki sifat one per user/ machine yang artinya session di suatu browser hanya akan berlaku pada browser tersebut, namun tidak pada browser yang lain. Berikut merupakan contoh implementasi request object dan session object pada serlet.

package zisal.com.simpleweb;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionData
 */
@WebServlet("/SessionData")
public class SessionData extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SessionData() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String userName = request.getParameter("userName");
		HttpSession httpSession = request.getSession();
		if(userName != "" && userName != null){			
			httpSession.setAttribute("userName", userName);
		}
		PrintWriter writer = response.getWriter();
		writer.println("Request Parameter User Name is " + userName);
		try{
			writer.println(" Session Parameter User Name is " + (String) httpSession.getAttribute("userName"));
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

Source code diatas akan membuat Session menggunakan HTTPSession berdasarkan parameter request dari url dan disimpan dengan keyword “userName”.
output dijalankan pada browser mozilla firefox:

User mengakses path aplikasi tanpa request parameter

User mengakses path aplikasi dengan request parameter, sehingga param tersebut menjadi session

User mengakses path aplikasi tanpa request parameter, request menjadi null, namun session tetap ada

User mengakses path aplikasi pada browser lain (Google Chrome), request dan session bernilai null, karena session bersifat one per user/ machine.
Selanjutnya adalah context object. Context/ application object dapat diakses selama container masih aktif. Karena, context object memiliki scope yang sama dengan thread sebuat servlet. Berikut contoh aplikasi servlet menggunakan context object

package zisal.com.simpleweb;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionData
 */
@WebServlet(urlPatterns = "/ContextData")
public class ContextData extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ContextData() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String userName = request.getParameter("userName");
		HttpSession httpSession = request.getSession();
		ServletContext context = request.getServletContext();
		if(userName != "" && userName != null){			
			httpSession.setAttribute("userName", userName);
			context.setAttribute("userName", userName);
		}
		PrintWriter writer = response.getWriter();
		writer.println("Request Parameter User Name is " + userName);
		try{
			writer.println(" Session Parameter User Name is " + (String) httpSession.getAttribute("userName"));
			writer.println(" Context Parameter User Name is " + (String) context.getAttribute("userName"));
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}
}

Sourcecode diatas akan membuat session dan context object berdasarkan request parameter dari user.
output dijalankan pada browser mozilla firefox:

User mengakses path aplikasi tanpa request parameter

User mengakses path aplikasi dengan request parameter, sehingga param tersebut menjadi session dan context object

User mengakses path aplikasi tanpa request parameter, request menjadi null, namun session dan context object tetap ada

User mengakses path aplikasi pada browser lain (Google Chrome), request dan session bernilai null, karena session bersifat one per user/ machine, namun context object masih tetap ada karena container tersebut masih berjalan.
Kesimpulan adalah object- object dalam aplikasi servlet dibedakan berdasarkan scope nya. request/ response hanya memiliki scope pada akses saja. Session object memiliki akses selama user/ session masih aktif. Context object memiliki scope sama dengan container, yang berarti selama container aktif, context object juga tetap aktif.

Tagged: , , , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: