Request, Session dan Application Context dalam JSP

Persis seperti pendahulunya (servlet) karena jsp juga mengimplementasikan HTTPServlet dalam core nyaj maka dari itu memiliki kemampuan untuk memproses request, session dan application context. Namun kapabilitas ini, dapat langsung digunakan di dalam page jsp tanpa harus bersentuhan dengan .java file, sehingga dapat mix langsung dengan html.
Berikut contoh penggunaan request, session dan application context dalam JSP.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Objects JSP</title>
</head>
<body>
	<%
		String userName = request.getParameter("userName");
		if(userName != null){
			session.setAttribute("userName", userName);
			application.setAttribute("userName", userName);			
		}
	%>
	<br />
	Request object is <%=userName %>
	<br />
	Session object is <%=session.getAttribute("userName") %>
	<br />
	Application object is <%=application.getAttribute("userName") %>
	<br />
</body>
</html>

output :

User mengakses path aplikasi tanpa request parameter


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

tanpa parameter 2


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.

Advertisements

Page Directive JSP

Page directive dalam JSP yang dimaksudkan adalah memasukkan komponen lain diluar suatu page jsp. Page directive terdiri atas 2 macam yaitu untuk melakukan import terhadapat komponent- komponen java diluar page JSP dan untuk melakukan render page jsp lain kedalam suatu jsp.Berikut contoh penggunaan page directive jsp.
HelloWorld.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hello World JSP</title>
</head>
<body>
<%
	String a = "JSP USER";
	out.println("<h3>Hello World "+a+"<h3>");
%>
</body>
</html>

PageDirective.jsp

<%@ page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Page Directive</title>
</head>
<body>
	<%@include file="HelloWorld.jsp" %>
	<br /> the time is <%=new Date() %>
</html>

output

Tag JSP

JSP(Java Server Page) tag terdiri atas 3 macam yaitu declaration, scriplet dan expression. Masing- masing tag tersebut meiliki fungsi yang berbeda dalam sebuah page jsp.

Declaration
<%! [SOURCE_CODE] %>

Declaration berfungsi untuk mendeklarasikan variabel- variabel atau method dalam page JSP.

Scriplet
<% [SOURCE_CODE] %>

Scriplet berfungsi untuk mendefinisikan script atau alur program page JSP.

Expression
<%= [SOURCE_CODE] %>

Expression berfungsi untuk menampilkan nilai dari suatu variabel.

Berikut contoh penggunaan tag JSP :

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Arithmetic</title>
</head>
<body>
	<%!
		public int multiply(int a, int b){
			return a*b;
		}
	%>
	
	<%
		int a=10;
		int b=2;
		int result = multiply(a, b);
		out.println("Multiply a + b = "+multiply(a, b));
	%>
	The value of Result is <%=result %>
	<%
		for(int c=0; c<10; c++){
			out.println("<br /> c = "+c);
		}
	%>
</body>
</html>

Output :

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.

Menggunakan HTML Tingkat Lanjut dengan Servlet

Penggunaan form kompleks dalam HTML, dapat ditangani dengan servlet sama seperti multiple parameter baik itu berupa method POST ataupun GET. Berikut contoh form dengan HTML tingkat lanjut.
more_html_form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>More html form</title>
</head>
<body>
	<form action="MoreHtml" method="post">
		Name : <input type="text" name="name">
		<br />
		Gender : 
		<input type="radio" name="gender" value="male">Male</input>
		<input type="radio" name="gender" value="female">Female</input>
		<br />
		Religion : 
		<select name="religion">
			<option value="islam">Islam</option>
			<option value="kristen">Christian</option>
			<option value="katolik">Protestant Christian</option>
			<option value="hindu">Hindu</option>
			<option value="budha">Buddha</option>
		</select>
		<br />
		<input type="submit" value="Send">
	</form>
</body>
</html>

MoreHtml.java

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;

/**
 * Servlet implementation class MoreHtml
 */
@WebServlet("/MoreHtml")
public class MoreHtml extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MoreHtml() {
        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
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
		String religion = request.getParameter("religion");
		
		if( name != null && gender != null && religion != null ){
			PrintWriter writer = response.getWriter();
			writer.println("Your Name is ".
					concat(name).
					concat(" ").
					concat("You are a ").
					concat(gender).concat(" ").
					concat("and your faith is ").
					concat(religion));
		}
		
		
	}

}

output :

Konfigurasi XML dan anotasi pada Servlet

Konfigurasi servlet dapat dilakukan melalui deployment descriptor (Web.xml) atau anotasi @WebServlet. IDE Eclipse yang saya gunakan (LUNA) secara default menggunakan anotasi untuk mengkonfigurasi sebuah servlet. Tujuan utama konfigurasi servlet adalah untuk memberitahu bagaimana servlet tersebut dapat diakses. Berikut contoh konfigurasi servlet melalui web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SimpleWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>    
  </welcome-file-list>
  <servlet>
  	<servlet-name>xmlServlet</servlet-name>
  	<servlet-class>com.zisal.XMLServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>xmlServlet</servlet-name>
  	<url-pattern>/XMLServlet</url-pattern>
  </servlet-mapping>
  </web-app>

XMLServlet.java

package zisal.com.simpleweb;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class XMLServlet
 */
public class XMLServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public XMLServlet() {
        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
		System.out.println("XML Servlet Called !!!");
	}

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

}

output


XMLServlet diatas, dipanggil berdasarkan url pattern yang telah dideskripsikan di web.xml. Untuk menggantikan konfigurasi web.xml, konfigurasi diatas dapat diganti dengan

@WebServlet(description="xmlServlet", urlPatterns="/XMLServlet")

Dua tipe konfigurasi tersebut, bisa dipilih salah satunya tergantung dari preference developer.

Form dengan Method GET & POST Menggunakan Servlet

Proses pengiriman parameter juga dapat dilakukan dengan menggunakan form html baik menggunakan get dan post. Untuk mengirim parameter tersebut, dibutuhkan html yang memuat form kemudian mengakses servlet untuk memproses parameter post/ get yang dikirim melalui form tersebut.
Berikut contoh penggunaan form menggunakan method GET pada servlet
file name : get_form_page.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Post Form</title>
</head>
<body>
	<form action="GetServlet" method="get">
		Name : <input type="text" name="name"> <br />
		Address : <input type="text" name="address"> <br />
		<input type="submit" value="Send Post">
	</form>
</body>
</html>

file name : “GetServlet.java”

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;

/**
 * Servlet implementation class GetServlet
 */
@WebServlet("/GetServlet")
public class GetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetServlet() {
        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 name = request.getParameter("name");
		String address = request.getParameter("address");
		PrintWriter writer = response.getWriter();
		if( name != null && address != null ){
			writer.println("<h3>Get Response : "+name.concat(" ".concat(address))+"</h3>");
		}
	}

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

}

output :


Untuk menerima parameter, dapat menggunakan request.getParameter dengan output berupa String object.Dapat dilihat pada get method, parameter dikirimkan dan ditampilkan pada url browser.
Selanjutnya, post method akan menyembunyikan parameter yang dikirimkan.
Berikut contoh post method menggunakan servlet :
file name : “post_form_page.html”

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Post Form</title>
</head>
<body>
	<form action="PostServlet" method="post">
		Name : <input type="text" name="name"> <br />
		Address : <input type="text" name="address"> <br />
		<input type="submit" value="Send Post">
	</form>
	
</body>
</html>

file name = “PostServlet.java”

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;

/**
 * Servlet implementation class PostServlet
 */
@WebServlet(urlPatterns = "/PostServlet")
public class PostServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public PostServlet() {
        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
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		PrintWriter in = response.getWriter();
		String name = request.getParameter("name");
		String address = request.getParameter("address");
		in.println("<h3>Your Request is :"+name.concat("-".concat(address))+"</h3>");		
	}

}

output :


Berdasarkan output diatas, dapat dilihat bahwa post method menyembunyikan parameternya dari url.