In this article, we are going to understand how to create a specific type of listener class.
This listener class will listen to the events
of the arrival of a user request which calls a servlet,
and when this request is finally served by a web application.
For this, we are going to create a webpage which asks the user to enter his
name and city in a form and click the submit button.
On submitting this form, the user request not only calls the requested Servlet class but also
calls the listener class, which is listening to an event of the arrival of a servlet request.
Within the listener class, we could also access the information about the user request by using the ServletRequest object.
This information about the user request could be -
The server port where the request is received.
Whether the request is made from a secure HTTPS protocol or not.
Parameters sent along the request made by the user.
MIME type of the body of the request, etc.
Note: We will create a listener class by implementing the ServletRequestListener interface
and by providing the implementation of its methods.
The ServletRequestListener interface is a part of the java.util.* package.
ServletRequestListener methods
Let's take a look at the methods of ServletRequestListener interface.
Methods
Description
voidrequestInitialized(ServletRequestEvent sre)
This method receives notification about the arrival of a new user request.
voidrequestDestroyed(ServletRequestEvent sre)
This method receives notification when the request has been served.
Creating a webpage which calls the Servlet
Before creating our listener class, we will create a webpage which contains a form to allow a user to enter his/her name, city and press the submit button.
On submitting the form, the user request not only calls a Servlet class but also a listener class, which is
listening to an event of arrival of a new user request.
Form1.jsp
<html>
<head>
<title> ServletRequest Demo </title>
</head>
<body>
Please enter your details :
<form action = "MyServlet">
Name : <input type = "text" name = "username" />
City : <input type = "text" name = "cityname" /> <br/>
<input type = "submit" value = "submit" />
</form>
</body>
</html>
Advertisement
Creating a Servlet
Next, we are creating a Servlet by extending the HTTPServlet abstract class.
In this Servlet class, we are sending a message to the user, which will ask him to open the Tomcat Web Server window for information
about the user request. We have named this Servlet class, MyServlet1.java.
MyServlet1.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class MyServlet1 extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<i><b>Please look at the Tomcat Server Window to read information about the request</b></i>");
}
}
Creating a listener class to listen to an event of arrival of a user request
Next, we will create a listener class by implementing the ServletRequestListener interface
and by providing the implementation of its two methods, requestInitialized() and requestDestroyed().
This listener class will listen to the event of an
incoming user request and display information about this request
by using the request object,
which is obtained by calling the getServletRequest() method of
ServletRequestEvent class.
RequestListener1.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.EventListener;
import java.util.*;
public class RequestListener1 implements ServletRequestListener
{
public void requestInitialized(ServletRequestEvent sre)
{
ServletRequest request = sre.getServletRequest();
System.out.println("A new request has arrived");
System.out.println("Accessing request parameters using ServletRequest object");
System.out.println("Welcome "+ request.getParameter("username"));
System.out.println("How is weather in " + request.getParameter("cityname") + "?");
System.out.println("Request Locale : " + request.getLocale());
System.out.println("Request Protocol : " + request.getProtocol());
System.out.println("Request ContentType : " + request.getContentType());
System.out.println("Request Local IP : " + request.getLocalAddr());
System.out.println("Request Server Name : " + request.getServerName());
}
public void requestDestroyed(ServletRequestEvent sre)
{
ServletRequest request = sre.getServletRequest();
System.out.println("Request has been served and ended");
}
}
The information about the request being received and request being served is displayed
on the Tomcat Web Server window because we have called the System.out.println() method within the two methods of our listener class.
Directory Structure of Servlet files
The diagram above depicts how to arrange the Servlet files in a specific directory structure, as per Java Servlet Specification-
Project Folder - We have created a project folder named ServletRequestListenerEx within
the webapps folder of Tomcat installation folder. This folder contains the Servlet class(.java) file and WEB-INF folder.
WEB-INF - Within your project folder, you create another folder named WEB-INF and this folder should contain the deployment descriptor file(web.xml) of your Java Servlet program.
classes - Within the WEB-INF folder you should create a folder named classes. This folder should contain the compiled(.class) form of your Java Servlet class.
Creating the Deployment Descriptor file
As per the Java Servlet specifications, every web application based on Servlet must have a Deployment Descriptor file(an XML file) named web.xml.
So, let's create one -
In deployment descriptor file, the <listener> tag has a child tag <listener-class>,
which is used to specify the full qualified name of our listener class and in our example this class is named RequestListener1.
The <servlet> tag has two child tags, <servlet-name> and <servlet-class>
The <servlet-name> tag is used to specify a unique name for our Servlet class, we have given it a unique name MyServlet.
The <servlet-class> tag is used to specify the full qualified name of the Servlet class and in our example our Servlet class is named MyServlet1.
Note
The child tag <servlet-name> of <servlet> tag is matched with the <servlet-name> child tag of
<servlet-mapping>. The
<url-pattern> child tag is used to specify the URL to access Servlet and we have named this URL MyServlet.
Setting the classpath
Much of the support for developing the web applications based on the Java Servlet technology does not come with the core Java.
Hence, in order to compile the Servlet programs, we have to set the classpath to a jar file named
servlet-api.jar.
This jar file provides all the classes that are required for the Servlet programming and it comes within the lib Folder of
Tomcat installation folder.
For example, in our case we have installed Tomcat Web Server within the C: Drive, hence the path to our lib folder containing the servlet-api.jar is - C:\apache-tomcat-9.0.2\lib
There are two ways to set the classpath -
You could set the classpath by entering this command at the Command Prompt, but this only temporarily sets the classpath to the path of servlet-api.jar file. If you restart your system, you will have to set the classpath again.
set classpath=C:\apache-tomcat-9.0.2\lib\servlet-api.jar
In order to set the classpath permanently, you need to set your classpath system variables. A simple tutorial on how to permanently set the classpath system variables, you may read
How to permanently set the classpath system variable
Compiling the Servlet class
After setting the classpath, you need to compile the Servlet class and the Listener class by entering the command at the folder where you've stored the Servlet class file.
javac -d WEB-INF/classes MyServlet1.java
javac -d WEB-INF/classes RequestListener1.java
Executing the Servlet
First we execute the webpage containing the form, asking the user to enter his/her name and city and press the submit button.
As user enters the asked details and submits the form, the request not only calls the Servlet, but also the listener class
RequestListener1.java, which is listening
to the event of arrival of a new request.
Hence, first you will see the Servlet class in execution, which will display a webpage with a message that asks the user to
check the Tomcat Server Window for details about the user request, as shown below.
And, a subsequent call is made to the listener class named RequestListener1.java ,
which displays the information about the user request, the value of parameters such as username, cityname
by using the ServletRequest on the Tomcat Web Server window. This listener class also notifies
about the request being served and ended.